gpt4 book ai didi

c - 我无法在 C 中正确创建双向链表

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:44 25 4
gpt4 key购买 nike

我的列表头部总是指向尾部。有什么问题?

我的linked_list.h:

#ifndef LINKED_LIST
#define LINKED_LIST

struct node
{
char *data;
struct node *nextElement;
struct node *prevElement;
};

void createList(struct node **head, struct node **tail);
void fill_list (char *word, struct node **head, struct node **tail);

#endif

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "linked_list.h"
#include <string.h>

int main()
{
FILE *dataFile;
char *word = (char *) calloc ( 255, sizeof(char) );

/* Create empty list */
struct node *head, *tail;
createList (&head, &tail);
/*------------------------*/

/* Data file open*/
dataFile = fopen("data.txt" ,"r");
if( dataFile == NULL )
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}

/* Data reading */
while (( fscanf(dataFile, "%s", word) ) != EOF )
{
int i = 0;
int wordsCount = 0;

for (i = 0; i <= strlen(word); i++)
{
if ( (word[i] >= 'a') && (word[i] <= 'z') )
wordsCount = wordsCount + 1;
}

if ( wordsCount == strlen(word) )
{
fill_list ( word, &head, &tail );
}
}

fclose(dataFile);
return 0;
};

linked_list.c:

#include <stdio.h>
#include <stdlib.h>
#include "linked_list.h"

void createList(struct node **head, struct node **tail)
{
*head = NULL;
*tail = NULL;
}

void fill_list ( char *word, struct node **head, struct node **tail )
{
struct node *elem, *temp;

if ( (*head) == NULL )
{
// printf("HEAD = NULL\n");

elem = (struct node *) malloc ( sizeof (struct node) );
elem -> data = word;
elem -> nextElement = NULL;
elem -> prevElement = NULL;
(*head) = elem;
*tail = elem;
// printf("%s\n", (*head) -> data );
}
else
{
// printf("HEAD != NULL\n");
elem = (struct node *) malloc ( sizeof (struct node) );
elem -> data = word;
elem -> nextElement = NULL;
elem -> prevElement = *tail;
*tail = elem;
// printf("%s\n", (*head) -> data );
}
}

我的数据文件:qw erty b cc。首先,head == NULL,所以 head -> data = 'qw' 它应该一直是 head,但是它变成了 erty,然后是 b 和 cc在每个循环步骤之后。

我做错了什么?

最佳答案

问题是您对所有输入使用相同的字符串,并将其用于所有节点。这意味着所有 节点的data 成员将指向同一个字符串。该字符串当然只包含您最后读入的内容。

您可能希望将字符串缓冲区作为普通数组保存在 main 中(而不是在堆上分配它)并使用例如strdup复制节点的字符串。不要忘记稍后释放它们。


指针顾名思义,它是一个指向内存中其他位置的变量。您可以有许多指针都指向同一个内存。

在您的情况下,您将函数 main 中的指针 word 传递给我们对 fill_list 的所有调用。这意味着您在 fill_list 中创建的所有节点都将使用完全相同的指针,并且它们都将指向完全相同的内存。

这意味着您的列表中的所有节点都将具有 data 成员似乎是相同的值,并且它将始终是 word 中读入的最后一个字符串 main 函数。

如果您使用诸如 strdup 之类的函数,它将复制 字符串。 IE。它将为字符串分配全新的内存,并从旧区域复制到新分配的区域,并返回指向新分配内存的指针。

关于c - 我无法在 C 中正确创建双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com