c - 段错误 - 双向链表

标签 c segmentation-fault doubly-linked-list

我正在实现一个双向链表,其工作原理类似于队列。因此,当我向列表添加节点(例如 5 个节点)并清空列表并尝试向列表添加新节点时,它会出现段错误(核心转储)。我不知道为什么要这样做。你能解释一下吗?

linkedlist.h

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

typedef struct node{
    int d;
    struct node *prev;
    struct node *next;
}node;

typedef struct linkedlist{
    int size;
    struct node *first;
    struct node *last;
}linkedlist;

linkedlist.c

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

#include "linkedlist.h"

linkedlist* createList(){
    linkedlist* myList = (linkedlist*)calloc(1,sizeof(linkedlist));
    myList->first = NULL;
    myList->last = NULL;
    myList->size =0;

    return myList;
}

static node* createNode(int n){
    node *myNode = (node*)calloc(1,sizeof(node));

    myNode->d = n;

    myNode->prev = NULL;
    myNode->next = NULL;

    return myNode;
}

void insertNode(linkedlist* l, int num){
    node *temp, *newNode;

    newNode = createNode(num);

    if (l->size == 0){
        newNode->next = NULL;
        newNode->prev = NULL;

        l->first = newNode;
        l->last = newNode;

        l->size++;
    }
    else{
        temp = l->first;
        while (temp->next != NULL){
            temp = temp->next;
        }   

        newNode->prev = temp;
        temp->next = newNode;
        newNode->next = NULL;

        l->size++;
    }
}

int deleteNode(linkedlist* l){
    node *temp = calloc(1,sizeof(node));

    if (l->first ==NULL){
        return -1;
    }
    else if (l->size ==1){

        free(l->first);
        l->first= NULL;
        l->last = NULL;

        l->size--;
    }
    else if (l->size > 1){
        temp = l->first;
        l->first = temp->next;          

        free(temp);
    }
}

void display(linkedlist *l){
    node *temp = calloc(1,sizeof(node));
    temp = l->first;

    if (temp == NULL){
        printf("The list is empty\n");
    }
    while (temp != NULL) {
        printf("-> %d ", temp->d);
        temp = temp->next;
    }
}

int main(){

    linkedlist *myList = createList();

    int choice, temp=0, numb;
    printf("(1) Insert \n (2) Delete \n");

    for (temp; temp<10; temp++){
    printf("Choice :");
    scanf ("%d", &choice);
    switch(choice) {
        case 1: {
            printf("Enter a Number: ");
            scanf("%d", &numb);
            insertNode(myList, numb);
            display(myList);
            break;
        }
        case 2:{
             deleteNode(myList);
            display(myList);
            break;

        }
    }

    }       
}

最佳答案

l->size > 1时,您不会减少列表的大小:

int deleteNode(linkedlist* l){

    node *temp = calloc(1,sizeof(node));

    if (l->first ==NULL){
        return -1;
    }
    else if (l->size ==1){
        free(l->first);
        l->first= NULL;
        l->last = NULL;
        l->size--;               \\ <--- Here is OK
    }
    else if (l->size > 1){
        temp = l->first;
        l->first = temp->next;          
        free(temp);
                                \\ <--- Here should have another l->size--
    }
}

您也可以将减量指令移出 if 语句。

关于c - 段错误 - 双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16590776/

相关文章:

c - fopen 的文件字符串错误?

java - 具有不需要的元素的自定义链表

java - java中删除双向链表中的两个节点时出错

c - GCC fastcall 函数定义

c - 将字母表划分为政党进行选举 - C语言

控制mplayer的C程序

c - 两个指针的段错误

c - 段错误 w/fwrite

谁能看出为什么这个程序会产生段错误

java - 通用双向链表实现