链接列表 - 插入新节点

时间:2014-09-26 09:43:02

标签: c singly-linked-list

  #include<stdio.h>
  #include<stdlib.h>
  //Linked list implementation 

  typedef struct SLL{

      int info;
      struct SLL *link;

   }Node;

  Node *head=NULL;
 // Node *rear=NULL;

 void insert_rear(int x)
  {

    Node *temp=malloc(sizeof(Node));
    Node *temp1=NULL; 

    if(temp==NULL)    /* When malloc is unable to fetch Memory */
    {
        printf("\n Insufficient memory");
    }

    if(head==NULL) /* When there is no node created */
    {
        temp->info=x;
        temp->link=head;
        head=temp;
    }

    else
    temp1=head;

    while(temp1->link!=NULL)
    {
        temp1=temp1->link;  
    }
    printf("\n Temp1=%d",temp1);
    temp->info=x;
    temp->link=NULL;
    temp1->link=temp;

  }


  void insert_front(int x)
  {

    Node *temp=malloc(sizeof(Node));
    if(temp==NULL) /* When malloc is unable to fetch Memory */
    {
        printf("\n Insufficient memory");
    }
    temp->info=x;
    temp->link=head;
    head=temp;

  }

  void display()
  {
    int i=0;
    Node *temp=head;
    printf("\n List Elements: \n ");

    while(temp!=NULL)
    {   
        printf(" %d) %d",++i,temp->info);
        temp=temp->link;
        printf("\t Link= %u \n",temp);
    } printf("\n");
  }


  void main()
  {
     int x,choice,i;
     printf("\n To insert at front enter 1 \n To insert at rear enter 2 \n To exit enter 4 \n");
     while(choice!=4)
     {
      scanf("%d",&choice);
      switch(choice)
      {

         case 1: printf("Enter an ELEMENT to be inserted at FRONT \n");
                 scanf("%d",&x);
                 insert_front(x);
                 display(); 
                 break;

        case 2: printf("Enter an ELEMENT to be inserted at LAST \n");
                scanf("%d",&x);
                insert_rear(x); 
                display();
                break;


      }//End of switch

     }//End of while
  }//End of main

我正在编写此链接列表程序,我在insert_rear()函数中遇到了问题。 当我使用insert_front()添加少量元素,然后使用insert_rear()在后​​面添加元素以及现有节点时,程序运行得非常好。 但是当我尝试使用insert_rear()添加没有任何现有节点的节点时,我的程序由于某种原因不起作用。

所以我花了一些时间搞乱我的程序并删除了以下代码部分,看看我是否能够在没有任何现有节点的情况下添加新节点:

else
    temp1=head;

    while(temp1->link!=NULL)
    {
        temp1=temp1->link;  
    }
    printf("\n Temp1=%d",temp1);
    temp->info=x;
    temp->link=NULL;
    temp1->link=temp;

  }

它确实有效,只有以下代码我可以在拥有任何现有节点之前添加到新节点

    if(head==NULL) /* When there are no existing nodes created */
    {
        temp->info=x;
        temp->link=head;
        head=temp;
    }

但与else条件一起,我的代码不起作用,程序崩溃。 请帮我纠正这个错误。我有一种感觉,我做了一些我无法找到的蠢事。

2 个答案:

答案 0 :(得分:1)

当列表为空并且您添加第一个元素时,您忘记退出,而是继续执行您的功能。尝试这样的事情

void insert_rear(int x)
{
  Node *temp=malloc(sizeof(Node));
  Node *temp1=NULL; 

  temp->info=x;
  temp->link=NULL;

  if(temp==NULL)    /* When malloc is unable to fetch Memory */
  {
    printf("\n Insufficient memory");
    abort();
  }

  if(head==NULL) /* When there is no node created */
  {
    head=temp;
  }
  else
  {
    temp1=head;

    while(temp1->link!=NULL)
    {
        temp1=temp1->link;  
    }
    printf("\n Temp1=%d",temp1);
    temp1->link=temp;
  }
}

答案 1 :(得分:0)

你应该小心使用全局变量,最好完全避免它们。 在函数insert_front()中,您可以更改列表的头部...

约翰