簡體   English   中英

C:刪除第一個元素時,雙向鏈表中的段錯誤

[英]C: segfault in doubly linked list when deleting first element

嘗試在鏈接中的最后一個元素上刪除deleteFirst()時,我的代碼出現了段錯誤。 它將刪除所有內容,但是當列表中只剩一個元素而我嘗試刪除它時,它給我一個段錯誤。

有任何想法嗎? 我認為deleteFirst()函數出了點問題。

Typedef和結構:

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。

在deleteFirst()函數上,切換此行L->first->prev = NULL; 有:

if(L->first) 
    L->first->prev = NULL;

因為,對於列表中的最后一個元素,您的L-> first是舊的第一個元素的下一個元素,它為NULL!

因此, L->first->prev將導致段錯誤!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM