簡體   English   中英

C中的鏈表程序錯誤

[英]Linked list program error in C

這是我的代碼,它刪除了最后一個列表項。我試圖實現鏈表概念。

void del(list** head,int da,int n) {  //da-for no of elements to be   
    list *l1;                         //deleted from end.
    int n1 = n-da;                    //n-for total no of elements in list 
    if (n1 == 0)
        *head = NULL;
    else {
        l1 = *head;
        n1 = n1-1;
        while(n1) {
            l1 = l1->next;
            n1--;
        }
        l1->next=NULL;
     }
}

包含此代碼后,我收到 SIGSEGV 錯誤。 這是什么意思? 請幫助我使用此代碼。 因為我最近開始學習數據結構。我沒有太多的編程經驗,但我知道一些 C 語言的基礎知識。

如果您的問題是“什么是 SIGSEGV?” 這是Segmentation Fault的錯誤信號。 現在,如果您想知道是什么原因造成的,那是您的void del(list** head,int da,int n)函數在da < n時導致未定義的行為,因為它會導致邏輯錯誤,從而導致無限循環:

int n1 = n - da; // Assume n < da

...

while(n1) { // n would be 0< therefor: n1 will never equal 0 causing infinite loop
    l1 = l1->next;
    n1--;
}

如果您嘗試從鏈表的后面刪除 n 個元素,則有一些解決方案:

1. 向后迭代

迭代到鏈表的尾部或當list->next == null然后向后迭代每次迭代刪除正在傳遞的節點,直到刪除了n 個節點

2. 父類存儲鏈表的大小

另一種方法是使用一個類linked link來存儲頭節點、尾節點和鏈表的大小。 然后從列表的尾部迭代刪除n O(N) 個節點或迭代到長度 - n然后開始刪除直到到達尾部。

我認為當您使用太大的n1值調用 delete 時,您可能會遇到段錯誤。 在這種情況下你的循環:

while(n1) {
  l1 = l1->next;
  n1--;
}

會走得太遠並訪問*l1其中l1 == NULL 我沒有完全按照您的del函數應該做什么,但這就是您的段錯誤的來源。 如果您從 main 中刪除對del的調用,則不會出現此類問題。

暫無
暫無

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

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