【问题标题】:Insert a string into a linked list将字符串插入到链表中
【发布时间】:2013-10-30 00:51:04
【问题描述】:

我正在尝试编写一个程序,该程序从用户输入中获取一个句子并将其存储在一个链表中。这是我到目前为止所做的,它似乎正在工作,除了当我打印列表时它打印字符串然后进入无限循环打印“垃圾”。你能看出我哪里出错了吗?

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

#define STRLENGTH 100

typedef struct node {
   char data;
   struct node *next;
} node;

int
main(void) {
   char str[STRLENGTH];
   printf("Enter a string: ");
   gets(str);

   node *linkedList = NULL;
   node *head = NULL;
   node *pre = NULL;

   int i;
   for(i = 0; str[i] != '\0'; i++) {
      linkedList = malloc(sizeof(node));
      if(str[i] == ' ')
         linkedList -> data = 0;
      else
         linkedList -> data = str[i];

      if(pre != NULL)
         pre -> next = linkedList;
      else
         head = linkedList;
      pre = linkedList;
   }

   while(head != NULL) {
      printf("%c", head -> data);
      head = head -> next;
   }

   return 0;
}

【问题讨论】:

  • linkedList -&gt; next初始化为NULL
  • @Kninnug 谢谢!效果很好!没想到解决办法这么简单……
  • 另外:(1)永远不要使用gets(); (2) 经常检查来自malloc()的返回; (3)free()你的节点在最后。

标签: c string linked-list


【解决方案1】:

你忘了初始化linkedList -&gt; next,所以它有一个垃圾值,不一定是NULL。因此while 循环试图跟随它并访问一些随机内存地址(由head -&gt; next 指向)并导致未定义的行为

另外,不要使用gets,它不能防止溢出。请改用fgets

【讨论】:

  • 是的,这是有道理的,我添加了初始化,它现在按预期工作!我也改为“fgets”而不是“gets”以防止溢出。 “gets”和“fgets”之间的区别在于 fgets 知道数组的大小,而“gets”如果我理解正确则不知道?!
  • 确实,gets 在 C11 中也被删除了。
【解决方案2】:

您的错误仅发生在 for 循环的最后一次迭代中。您没有初始化linkedList 中最后一个元素的下一个指针。

如果您想尽量减少您正在执行的操作数量。在for循环执行之后,while循环之前添加

pre->next = NULL;

既然您知道 pre 将指向最终节点。这样,您就不会在循环的每次迭代中都这样做。

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2018-11-09
    • 2019-05-04
    相关资源
    最近更新 更多