C - 链接列表 - 未更新插入元素 - 仅添加最后一个输入元素

时间:2015-10-30 10:43:16

标签: c linked-list

PREFACE :目标是提示用户输入,将每个元素(输入行)添加到链接列表中。

我一直在玩Learn-C.org的一些示例代码,其中显示了一个链接列表示例。 我修改了代码,以便它采用“字符串”而不是整数。

我的插入功能如下:

void push(node_t * head, char *data) {
    node_t * current = head;

    if(head == NULL) {
      printf("First element ever!\n");
    }
    else if(current->data == NULL) {
      current->data = data;
      current->next = NULL;

    }
    else {
      while (current->next != NULL) {
        current = current->next;
        }
      current->next = malloc(sizeof(node_t));
      current->next->data = data;
      current->next->next = NULL;
   }
}

现在,在MAIN中,我按如下方式启动列表:

node_t * test_list = malloc(sizeof(node_t));

添加元素完成:

  push(test_list, "FOO");
  push(test_list, "FEE");
  push(test_list, "FAA");

使用 print_list(test_list)打印列表时,我得到以下输出:

FOO
FEE
FAA

问题

然而,我已经包含了一个while循环,它提示用户输入并将其添加到链表中。

char command[120];
int counter = 0;
while(counter < 3) {
    printf("Enter element: ");
    fgets((void *)command, sizeof(command), stdin);
    push(test_list, command);   //Insert
    counter++;
}

但是,这不会将每个元素添加到链接列表中。相反,它会将LAST元素添加到列表中三次。

例如,提供:

Enter element: Argentina
Enter element: Mexico
Enter element: Sweden

列表打印为:

FOO
FEE
FAA
Sweden
Sweden
Sweden

编辑(添加了打印功能)

我的打印功能如下:

void print_list(node_t * head) {
    node_t * current = head;

    printf("**** Printing list ****\n");
    while (current != NULL) {
        printf("%s\n", current->data);
        current = current->next;
    }
}

我缺少什么,或者:我该如何解决这个问题?任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:2)

使用strdup返回堆上分配的字符串的副本。

  

strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。使用malloc(3)获取新字符串的内存,可以使用free(3)释放。

node_t *test_list = malloc(sizeof(node_t));
test_list->next = NULL;
test_list->data = NULL;
while(counter < 3) {
  printf("Enter element: ");
  fgets((void *)command, sizeof(command), stdin);
  push(test_list, strdup(command));   //Insert
  counter++;
}

答案 1 :(得分:0)

您有一个容量为120的数组command。您可以使用它来读取值。没关系。

然后发送一个指向此数组的指针进行存储。它被存储,一切都很好。

下次读取输入时,将其读取到同一个数组中,为此指定了存储的指针。因此,您正在更改指针指向的内存的内容。这不行。

您需要为每个字符串分配单独的内存区域并处理它们的解除分配。 strdup是使用用户输入内容获取新内存块的最简单方法。

但请记住,当你不再需要它时,你真的必须释放内存。在这种情况下,您可能永远不会删除任何字符串,但是当您这样做时,您不能只删除该元素,您还必须释放该字符串使用的内存。

答案 2 :(得分:0)

current->data = data;此处您只复制指针地址而不是数据,该地址(&#39;命令的地址)最后数据(&#39;瑞典&#39;)将可用。 您应该使用strcpy(current->data,data)来复制数据。