C链表 - 最后插入节点

时间:2014-02-04 22:36:54

标签: c linked-list

我试图从每行包含1个单词和20行的列表中读取,然后将每个单词添加到链表的末尾。我的问题是,当我打印出最后的链表时,它会将文件中的最后一个字打印20次而不是每个字一次。我已经工作了好几个小时,无法弄清楚我做错了什么。

我的主要是

while (!feof(input)) {
        fscanf(input, "%s", currentName);
        head = insert(head, currentName);
}
print(head);
delete(head);

插入功能

node* insert(node* head, char* name) {
        node *temp = NULL;
        if (head == NULL) {
                head = create_node(name);
        }
        else {
                temp = head;
                while(temp->next != NULL){
                        temp = temp->next;
                }
                temp->next = create_node(name);
            }
        return head;
}

创建功能

node* create_node(char* name) {
        node *newNode;
        newNode = malloc(sizeof(node));
        if(newNode == NULL) {
                printf("Failed to create node");
        }
        newNode->name = name;
        newNode->next = NULL;
        return newNode;
}

打印并删除

void print(node* head){
        while (head != NULL) {
                printf("%s -> ", head->name);
                head = head->next;
        }
        printf("NULL\n");
}
void delete(node* head) {
        node *temp = NULL;
        while(head != NULL) {
                temp = head;
                head = head->next;
                free(temp);
        }
}

1 个答案:

答案 0 :(得分:2)

您要在main()中为每次插入保存相同缓冲区的地址。每个节点只是保持currentName的基址,其内容随处理的每个输入而改变。因此,您有一个包含name指针的结构的链接列表,其中每个指向相同的缓冲区currentName)。因此,最后一个将是你看到的唯一一个。

您需要在create_node中为名称动态分配空间。以下使用POSIX函数strdup()执行此操作,但如果您愿意,可以完全免费使用strlen/malloc组合。

node* create_node(char* name) 
{
    node *newNode;
    newNode = malloc(sizeof(node));
    if(newNode == NULL)
        printf("Failed to create node");

    newNode->name = strdup(name);
    newNode->next = NULL;
    return newNode;
}

当您将链接列表清理为free()每个节点名称以避免内存泄漏时,请不要忘记。

void delete(node* head) 
{
    node *temp = NULL;
    while(head != NULL) 
    {
        temp = head;
        head = head->next;
        free(temp->name);
        free(temp);
    }
}

不相关:您加载内容的while循环条件错误。 Read this answer to see why