我在尝试对链接中的最后一个元素执行deleteFirst()时给出了段错误。它会删除所有内容,但是当列表中有一个元素并且我尝试删除它时,它会给我一个段错误。
有什么想法吗?我认为deleteFirst()函数有问题。
Typedef和structs:
typedef struct NodeStruct {
long data;
struct NodeStruct* next;
struct NodeStruct* prev;
} NodeStruct;
// Rename NodeStruct* as NodePtr
typedef NodeStruct* NodePtr;
typedef struct ListStruct {
NodePtr first;
NodePtr last;
NodePtr current;
} ListStruct;
// ListHndl is just a ListStruct* renamed.
插入功能:
void insertOrder(ListHndl L, long data) {
NodePtr tmp = newNode();
tmp->data = data;
NodePtr prev = NULL;
NodePtr curr = L->first;
while (curr != NULL && data > curr->data) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) L->last = tmp;
if (prev == NULL) L->first = tmp;
else prev->next = tmp;
tmp->next = curr;
}
删除功能:
void deleteFirst(ListHndl L) {
assert (!isEmpty(L));
NodePtr tmp = L->first;
L->first = L->first->next;
L->first->prev = NULL;
free(tmp);
}
主要代码:
insertOrder(List1, 50);
insertOrder(List1, 20);
insertOrder(List1, 1);
deleteFirst(List1);
deleteFirst(List1);
deleteFirst(List1); // <-------- Deleting last element gives segfault.
printList(NULL, List1); //Print to STDOUT
答案 0 :(得分:3)
因为当列表中只有一个元素时,L-&gt; first-&gt; next为NULL。
答案 1 :(得分:1)
在你的deleteFirst()函数中,使用以下代码切换此行L->first->prev = NULL;
if(L->first)
L->first->prev = NULL;
因为,对于列表中的最后一个元素,你的L-&gt;首先是旧的第一个元素,它是NULL!
所以L->first->prev
会导致段错误!