在链表中插入结尾

时间:2015-02-13 11:13:31

标签: c data-structures linked-list

我在列表末尾插入节点,但我的代码只打印第一个元素并在无限循环中运行。 我无法弄清楚代码中的错误。

typedef struct nodetype
{
   int info;
   struct nodetype* next;
}node;
node *head=NULL;

void insertatend(int x);//x is the key element.
void print();


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

void print()   //To print the list
{
   node *temp=head;
   printf("List is-");
   while(temp!=NULL)
   {
      printf("%d",temp->info);
      temp=temp->next;
   }
}

4 个答案:

答案 0 :(得分:1)

考虑你的插入方法(我将把头作为参数而不是全局)

void insertatend(node **hd, int x) {
    node *ptr = NULL, *cur = NULL;
    if (!(ptr = malloc(sizeof (node)))) {
        return;
    }
    if (!*hd) {
        *hd = ptr;
    } else {
        cur = *hd;
        while (cur->next) {
            cur = cur->next;
        }
        cur->next = ptr;
    }
}

您需要从末尾到后面遍历列表才能正确执行插入。 (因此上面函数中的while循环)。

答案 1 :(得分:1)

你的" temp!= NULL"插入后永远不会变为false,因为在该插入中,您将下一个指针设置为自身,从而创建一个链接循环。

应该更像这样:

void insertatend(int x)
{
    node *ptr;
    ptr=malloc(sizeof(node)); //don't cast pointers returned by malloc
    ptr->info=x;
    ptr->next=NULL; //set next node pointer to NULL to signify the end
    if(head==NULL)
    {
      head=ptr;
    }
    else
    {
      node* tmp = head;
      while(tmp->next) tmp = tmp->next; //get last node
      tmp->next=ptr; //attach new node to last node
    }
}

你的其他分支也不正确,创建另一个链接循环。

答案 2 :(得分:0)

您需要传递列表的最后一个元素:

void insertatend(node *last, int x)

或者将尾部node设为全局:

node *head = NULL;
node *tail = NULL;

void insertatend(int x)
 {
    node *ptr;
    ptr = malloc(sizeof(node)); /* Don't cast malloc */
    ptr->info = x;
    ptr->next = NULL;
    if (head == NULL) {
       head = ptr;
    } else {
       tail->next = ptr;
    }
    tail = ptr;
}

答案 3 :(得分:0)

您还可以重新定义节点结构以包含next,prev,head和tail指针并适当地操作它们。

在您的情况下,您只需要在尾节点上设置头指针,在头节点上设置尾指针。在所有节点上设置next和prev。头节点上的头指针应指向自身;尾节点上的尾指针应指向自身。 Head-> prev = NULL; Tail-> next = NULL;

然后只将头指针传递给你的insertatend func。