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

//double linked list
struct node {
    int data;
    struct node *rnext;
    struct node *lnext;
}*first=NULL,*last=NULL;
//double linked list

void insertion() {
    struct node *nn=malloc(sizeof(*nn));
    printf("enter data to be inserted\n");
    scanf("%d",&nn->data);
    nn->rnext=NULL;
    nn->lnext=last;
    if(first == NULL) {
        first = nn;
        last = nn;
    }
    else{
        last->rnext=nn;
    } 
    last=nn;
}

void display() {
    struct node *temp;
    if(first==NULL) {
        printf("list is empty\n");
        return;
    }
    temp=first;
    while(temp!=NULL) {
        printf("%d \n",temp->data);
        temp=temp->rnext;
    }
}

void deletion() {
    struct  node  *temp;
    if(first==NULL) {
        printf("list is empty\n");
        return;
    }
    temp=first;
    first=first->rnext;
    first->lnext=NULL;
    free(temp);
}

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

これは、二重連結リストのノードを削除および挿入するために作成されたプログラムです。プログラムはエラーなしでコンパイルされますが、リストにノードが 1 つしかない場合にノードを削除すると、実行時にセグメンテーション違反エラーで失敗します。このセグメンテーション違反の解決策を教えてください。

プログラムからの出力例を次に示します。

./out
enter option 1.insertion
  2.display
  3.deletion
  4.exit
1
enter data to be inserted
11
enter option 1.insertion
  2.display
  3.deletion
  4.exit
2
11 
enter option 1.insertion
  2.display
  3.deletion
  4.exit
3
Segmentation fault
4

3 に答える 3

0
temp=first;
first=first->rnext;//when only one, first is NULL(first->rnext)
first->lnext=NULL;//(NULL)->lnext , Segmentation fault!!
free(temp);

に修正するかもしれません

temp=first;
if(first == last){//if only one
    first = last = NULL;
} else {
    first=first->rnext;
    first->lnext=NULL;
}
free(temp);
于 2013-06-09T14:46:57.507 に答える
0

少なくとも 2 つのバグ:

一方で、挿入関数では、メモリ割り当てが正しくありません。

struct node *nn=malloc(sizeof(*nn));

そのはず :

struct node *nn= (struct node *) malloc(sizeof(struct node));

一方、削除機能では。ノードが 1 つしかない場合。発言後

first=first->rnext;

ポインターは最初に NULL になります。次に、次のように使用しようとします。

first->lnext=NULL;  // first is NULL

その後、セグメントは失敗します。

于 2013-06-09T14:40:58.220 に答える