通过功能添加时,新节点未正确添加到链接列表的末尾

时间:2018-12-04 11:12:48

标签: c singly-linked-list

我正在尝试通过添加节点的函数将新节点添加到链表中。但是当我打印列表时,似乎所有节点中的数据都被最近添加的数据替换了。

print b

这就是我想出的。当我输入说5个单词typedef struct things { char *string; struct things *next; } something; void addnode(something **head, char *str); void printlist(something **head); int main() { int i; char word[50]; something *head = NULL; puts("How many strings?"); scanf("%d", &i); while(i > 0) { scanf("%49s", word); addnode(&head, word); i--; } printlist(&head); return 0; } void addnode(something **head, char *str) { something *last = *head; something *newnode; newnode = malloc(sizeof(something)); newnode->string = malloc(50*sizeof(char)); newnode->string = str; newnode->next = NULL; if ((*head)==NULL) { (*head) = newnode; return; } else { while(last->next != NULL) { last=last->next; } last->next = newnode; return; } } void printlist(something **head) //print contents of list, to check if list was created { puts("print"); something *current = *head; while(current != NULL) { printf("%s", current->string); current=current->next; } } one two three four时,我得到输出five。这是我尝试打印方式的问题吗?还是我如何传递指针并链接节点?

3 个答案:

答案 0 :(得分:1)

分配指针不会复制其内容。只是使它们指向相同的内存地址。

在您的代码中,您正在为新节点的str分配内存,并使其指向缓冲区的地址(对于您的情况,为word)。通过这样做,最终所有节点的str将指向缓冲区最后一个值的地址(对于您的情况为5)的内容。

newnode->string = malloc(50*sizeof(char));
newnode->string = str;

这里的另一个问题是您不能根据缓冲区的内容动态分配内存。

要完全分配所需的内存量,请尝试以下操作:

替换:

newnode->string = malloc(50*sizeof(char));

使用:

 newnode->string = malloc((strlen(str)+1)*sizeof(char));

使用strlen可获得字符数,+1用于分配用于终止字符'\0'的空间。

因此,要解决最初的问题,您需要将缓冲区的内容复制到新分配的内存中:

替换:

newnode->string = str;

strcpy(newnode->string,str);

答案 1 :(得分:0)

使用addnode()代替

newnode->string = malloc(50*sizeof(char)); newnode->string = str;

尝试

newnode->string = strdup(str);

它应该工作。 :)

答案 2 :(得分:0)

更改插入功能,

<uses-feature android:name="android.software.leanback"
    android:required="false" />