为什么此链接列表会无限期地打印最后一个元素?

时间:2017-01-25 10:52:54

标签: c pointers linked-list

我正在完成一项Hackerrank挑战,包括将元素添加到链接列表并打印它。

输入采用以下格式:一组整数,其中第一个元素给出大小,其余元素是列表的组成部分。

我用Java完成了挑战,但我无法用C语言完成。 输入4 2 3 4 1应打印2 3 4 1,但我编码的这个片段给我1 1 1 1 1 1 .... {truncated}

我的方法:声明Node类型的新结构 temp (数据输入为数据字段,下一个字段为NULL),然后遍历链表以head为起点,当它到达最后一个元素时,将最后一个元素的下一个字段更改为当前元素的地址。

代码:

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

   typedef struct Node{
   int data;
   struct Node* next;
    }Node;

 Node* insert(Node *head,int data)
  {       
    Node temp = {data, NULL} ;

     if (head == NULL)
      { head =&temp;
        return head;
      }

     else{

    Node* current = head ;
    while(current->next !=NULL)
      current = current->next ;

      current->next = &temp;

      return head;
       }
   }

void display(Node *head)
{
Node *start=head;
while(start)
{
    printf("%d ",start->data);
    start=start->next;
}
}

int main()
{
int T,data;
scanf("%d",&T);
Node *head=NULL;    
while(T-->0){
    scanf("%d",&data);
    head=insert(head,data);
            }

 display(head);

 }

2 个答案:

答案 0 :(得分:5)

必须动态分配列表节点。此

Node temp = {data, NULL} ;

声明一个局部变量。引用其声明函数范围之外的地址是未定义的行为

替换为

Node *temp = malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;

现在thtat temp是一个指针,表达式&temp也必须替换为temp

答案 1 :(得分:2)

因为您在列表中保存了指向局部变量的指针。当insert函数返回时,局部变量temp将超出范围并停止存在。保存指向它并使用该指针将导致未定义的行为Find a good beginners book并阅读关于内存的动态分配。