gpt4 book ai didi

c - 段错误 - 双向链表

转载 作者:行者123 更新时间:2023-11-30 18:14:16 25 4
gpt4 key购买 nike

我正在实现一个双向链表,其工作原理类似于队列。因此,当我向列表添加节点(例如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com