在开头插入圆形链接列表

时间:2015-03-09 10:55:36

标签: c data-structures linked-list circular-list

我在开头插入循环链接列表,但输出正在打印一些垃圾值。

typedef struct Node
   {
    int info;
    struct Node *next;
   }node;
 node *head;
 void insert(int x)   //x will the value given by the user
   {
             node *ptr,*ptr1;
             //ptr1 for pointing the last node again to first node

             ptr=(node*)malloc(sizeof(node));
             ptr->info=x;
             if(head==NULL)
               {
                  ptr->next=head;
                  head=ptr;
                  ptr1=ptr;
               }
               else
               {
                   ptr->next=head;
                   head=ptr;

               }
            head->next=ptr1;
    }

  void show()
  {
       node *temp=head;
       while(temp!=NULL)
       {
       printf("%d",temp->info);
       temp=temp->next;
       }
       printf("\n");
       }

2 个答案:

答案 0 :(得分:1)

你有两个问题,一个导致无限列表,另一个导致undefined behavior

当您在列表中插入第一个节点时获得的无限列表:

head->next=ptr1;

到那时headptr ptr1都指向同一个节点,因此通过上面的分配,您可以说明下一个节点列表是......本身!。


未定义的行为是在另一种情况下,当列表不为空时,其原因是与上面相同的分配

head->next=ptr1;

此处变量ptr1尚未初始化,未初始化的本地(非静态)变量具有不确定值,并且使用这些变量除了初始化它们导致未定义行为。

实际上,未定义的行为在分配时并不会发生,但是当您下次尝试取消引用head->next时会发生这种情况,因为该指针无效。


这两个问题的简单解决方案?不要做最后的任务!

答案 1 :(得分:0)

您没有在else {}分支中为ptr1分配任何内容,但稍后您将ptr1值存储为head-> next。由于ptr1未初始化,因此在打印列表时会出现垃圾。