c-链表反向打印(或反向填写?)

  • 本文关键字:链表 打印 c struct linked-list
  • 更新时间 :
  • 英文 :


如果我将此代码的输入输入为1 2 3 4 5,然后按Ctrl-D结束程序,它将打印

0 --> 5 --> 4 --> 3 --> 2 -->,这很奇怪。我试着按照教程构建一个链表,但我觉得我做得有点错误。

#include <stdio.h>
#include <stdlib.h>
struct list 
{
   int a;
   struct list *next;
};
typedef struct list List;
int main (void)
{
   List *start, *end;
   end = (List*)malloc(sizeof(List));
   end = NULL;
   while(scanf("%d", &(start -> a )) == 1)
   {
      start = (List*)malloc(sizeof(List));
      start -> next = end;
      end = start; 
   }
   end = start;
   while(start)                                      
   {
      printf("%d --> ", start -> a);
      start = start -> next;
   }
   return 0;
}
  • 我意识到我不应该投malloc的回报,应该检查scanf的回报!这只是学习如何构建链表的测试代码

此处存在内存泄漏

end = (List*)malloc(sizeof(List));
end = NULL;

您的第一个start正在丢失。


在循环中为start分配内存之前,需要先将start分配给end

start = (List*)malloc(sizeof(List));
end = NULL;
while(scanf("%d", &(start -> a )) == 1)
{
   end = start;
   start = (List*)malloc(sizeof(List));
   start -> next = end;
}

我想补充一点,这本质上是反向填充链接列表。因为代码从开始以相反的顺序填充链接列表

您确实在将数据输入到列表中,最近的条目最终位于列表的开头。

解决此问题的一种方法是使end指向next的最后一个指针,并在开始时将其设置为指向start。注意,end现在是一个"双指针":

List *start = NULL, **end = &start;
int a; // read data into a local, not into the node
while(scanf("%d", &a) == 1) {
    // Make a new node
    List *node = malloc(sizeof(List));
    // set the data to what we just read
    node->a = a;
    // This is the last node, so next is NULL
    node->next = NULL;
    // end points to previous node's next, so add new node to it
    *end = node;
    // Finally, re-point end to new node's next
    end = &node->next;
}

演示。

相关内容

  • 没有找到相关文章

最新更新