链表程序插入和删除节点

时间:2013-06-06 08:55:09

标签: c linked-list segmentation-fault malloc

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

struct node {
    int data;
    struct node *next;
} *first = NULL;

void insert() {
    struct node *temp;
    struct node *nn = (struct  node*)malloc(sizeof(struct node));
    printf("enter  the data\n");
    scanf("%d", &nn->data);
    temp = first;
    while (temp->next != first)
        temp = temp->next;
    temp->next = nn;
    nn->next = NULL;
}

void display() {
    struct node *temp;
    temp = first;
    if (temp == NULL) {
        printf("no elements\n");
        return;
    }
    printf("elements in linked list are\n");
    while (temp != NULL) {
        printf("%d\n", temp->data);
        temp = temp->next;
    }
}

void deletion() {
    struct node  *temp;
    temp = first;
    first = first->next;
    temp->next = NULL;
    free(temp);
}

int main() {
    int  op;  
    do {
        printf("1.insertion\n2.deletion\n3.display\n4.exit\n");
        printf("enter option\n");
        scanf("%d", &op);
        switch (op) {
          case 1:
             insert();
             break;
          case 2:
             deletion();
             break;
          case 3:
             display(); 
             break;
        }
    } while (op != 6);
}

这是为单个链表编写的程序,同时执行获取错误分段错误。请提出解决此问题的建议。 我得到以下输出:

./out

1.insertion
2.deletion
3.display
4.exit

enter option
1
enter  the data
23
Segmentation fault

6 个答案:

答案 0 :(得分:2)

temp=first; /* first is null */
while(temp->next!=first)
   temp=temp->next;

...所以你试图访问NULL->next,显然你得到一个SEG FAULT,使用调试器:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004006af in insert () at demo.c:17
17    while(temp->next!=first)

答案 1 :(得分:1)

insert包含代码

temp=first;
while(temp->next!=first)

(其中first是一个全局变量,最初是NULL)。第一次运行时,while循环立即取消引用NULL指针。这有不确定的后果,但是段错并不奇怪。

要解决此问题,您可以将insert更改为

void insert()
{
    struct node *nn=malloc(sizeof(*nn));
    if (nn == NULL) {
        /* handle oom */
    }
    printf("enter  the data\n");
    scanf("%d",&nn->data);
    nn->next=NULL;
    if (first == NULL) {
        first = nn;
    }
    else {
        struct node *temp=first;
        while(temp->next!=NULL)
            temp=temp->next;
        temp->next=nn;
    }
}

请注意,这包括一些不同的更改

  • 需要将first==NULL视为特例
  • 需要在所有情况下设置nn->next = NULL
  • 您不应该在C
  • 中投放malloc的回报
  • 分配sizeof(*nn))稍微更具未来证明(如果您稍后更改nn的类型,它仍会有效)
  • malloc可能会在低内存中返回NULL

答案 2 :(得分:1)

在您的第一个Insert中,变量firstNULL ...

您需要检查变量是否为null,不执行循环。

将您的插入代码更改为:

void  insert()
{
struct node *temp;
struct node *nn=(struct  node*)malloc(sizeof(struct node));
  printf("enter  the data\n");
  scanf("%d",&nn->data);
  if(first!=NULL){
      temp=first;
      while(temp->next!=first)
        temp=temp->next;
      temp->next=nn;
  }else{
      first=nn;
  }
  nn->next=NULL;
}

答案 3 :(得分:1)

您的insert()函数包含temp=first;first为空,您正在temp->next!=first执行,null->next!=first这是不正确的。 要解决此问题,请检查first是否为空,

struct node *temp;
struct node *nn=(struct  node*)malloc(sizeof(struct node));
printf("enter  the data\n");
scanf("%d",&nn->data);
nn->next=null;
if(first==null)
{
first=nn;
}
else
{
 temp=first;
   while(temp->next!=null)
     temp=temp->next;
   temp->next=nn;
}   

答案 4 :(得分:1)

使用

while(temp!=NULL)

取代

while(temp->next!=NULL)

答案 5 :(得分:0)

    // insert element using recursion

Node *insetlinklist(Node *head,Node*mhead,int data,int position)
    {
    Node *newNode=NULL;
  //  printf("%d,%d %d %x\n",position,mhead->data,data,mhead);
    if(position==0 && mhead->next==NULL && head->next==NULL){
        newNode = (Node*)malloc(sizeof(Node));
        newNode->next=NULL;
        newNode->data=data;
        newNode->next=head;
        head=newNode;
        return head;

    }
    if(position ==0){
        newNode = (Node*)malloc(sizeof(Node));
        newNode->next=NULL;
        newNode->data=data;
        newNode->next=head->next;
        head->next =newNode;
        return head;
    }

    if(mhead->next!=NULL){
      head =mhead;
      insetlinklist(head,mhead->next,data,position-1);
    }
     else
      insetlinklist(head,mhead,data,0);
  //  printf("%d,%d\n",position,head->data);
    return head;

}
void printL(Node*head){
    Node *temp =head;
    while(temp!=NULL){
      printf("Data =%d\n",temp->data);
      temp = temp->next;
    }
}
Node* InsertNth(Node *head, int data, int position)
{
    Node *temp =head;
//   printL(head);
  head= insetlinklist(head,temp,data,position);
   // printL(head);
   // printf("END\n");
    return head;
  // Complete this method only
  // Do not write main function. 
}