c - 通过函数添加时,新节点未正确添加到链表末尾

标签 c singly-linked-list

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

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;
    }
}

这就是我想出来的。当我输入 5 个单词 时,我得到输出五五五五五。这是我尝试打印的方式有问题吗?或者是我传递指针和链接节点的方式?

最佳答案

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

在您的代码中,您正在为新节点的 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);

关于c - 通过函数添加时,新节点未正确添加到链表末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53611672/

相关文章:

c - 没有 LIB 和字符串文件我该如何编写这段代码?

java - 删除一个链接如何从链表中删除一个节点?

c++ - 链表的相等运算符 C++

c - 如何扫描带有空格的字符串并打印它们 C

c - Typedef 指向二维数组的指针

c++ - 指针牌组替换函数C++

c++ - 我不明白为什么这个函数 "returns a pointer from the list"

c - 为什么节点没有正确添加以及为什么它打印相反? (单链表)

c - C 定义的 Makefile 参数 - 需要干净

c - 如何在使用文件重定向时访问默认的标准输入?