显示错误分段错误

时间:2014-05-01 05:22:13

标签: c

此代码是Stack Using Double Linked列表。除了一个条件之外,此代码工作正常,即每当删除最后一个节点时,它显示“分段错误”错误!

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

typedef struct node_type{
    int value;
    struct node_type *next, *prev;
}node;

node *insert(int value, node *top){
    node *p;
    p = (node*)malloc(sizeof(node));

    if(top == NULL){
        top = p;
        p -> value = value;
        p -> next = NULL;
        p -> prev = NULL;
        return top;
    }
    else{
        p -> value = value;
        p -> next = top;
        p -> prev = NULL;
        top -> prev = p;
        top = p;
        return top;
    }
}

node *del(node *top){
    node *temp;
    if(top == NULL){
        printf("Stack is empty\n");
    }
    else{
        temp = top;
        top = top -> next;
        top -> prev = NULL;
        free(temp);
    }
    return top;
}

node *disp(node *top){  
    if(top == NULL){
        printf("Stack is empty\n");
    }
    else{
        while(top != NULL){
            printf("The value is: %d\n", top -> value);
            top = top->next;
        }
    }
}

int main(){
    int value, ch = 0;
    node *top = NULL;
    while( ch != 4){
        printf("------> 1. Insert  <-------\n");
        printf("------> 2. Delete  <-------\n");
        printf("------> 3. Display <-------\n");
        printf("------> 4.  Exit   <-------\n");
        printf("Enter the choice\n");
        scanf("%d",&ch);
        switch(ch){
            case 1:
                printf("Enter the value\n");
                scanf("%d",&value);
                top = insert(value, top);
                break;
            case 2:
                printf("Removing the element\n");
                top = del(top);
                break;
            case 3:
                disp(top);
                break;
            case 4:
                exit(0);
                break;
            default:
                printf("Wrong Choice\n");
                break;
            }
        }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

删除链表的最后一个节点是一种特殊情况,您需要特殊的代码来处理它。

答案 1 :(得分:0)

你的del函数存在问题。如果它是最后一个节点top-&gt; next将是NULL。 在你的代码中

  

top = top-&gt; next;

使顶部为NULL。然后你正在尝试

  

top-&gt; prev = NULL;

等于取消引用NULL指针,这就是问题所在。 你必须在其他方面处理这个问题。 喜欢

  

if(top-&gt; next == NULL)   免费顶部;

那将解决问题。