C:删除第一个元素时双向链表中的段错误

标签 c pointers linked-list segmentation-fault doubly-linked-list

尝试对链接中的最后一个元素执行 deleteFirst() 时,我的代码出现段错误。它会很好地删除所有内容,但是当列表中剩下一个元素并且我尝试删除它时,它会给我一个段错误。

有什么想法吗?我认为 deleteFirst() 函数有问题。

类型定义和结构:

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

最佳答案

因为当列表中只有一个元素时,L->first->next 为 NULL。

关于C:删除第一个元素时双向链表中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23146522/

相关文章:

c - 为什么我的代码会跳过某些节点?

C - 条件跳转(valgrind)

c++ - 将 CHAR16* 设置为 #define 字符串?

c - gcc 的指针段错误

pointers - 在对其进行模式匹配时修改字段

c - 此 "good taste"和 "bad taste"代码中是否缺少 free()?

C++链表不删除头节点

c - 阻止 Tic Tac Toe 覆盖 C 中的 Action

c - setlocale(LC_CTYPE, NULL) 可能返回哪些值?

c - 指针引用混合 '*' 和 ' ->' 语法困惑