[英]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 個元素,則有一些解決方案:
迭代到鏈表的尾部或當list->next == null
然后向后迭代每次迭代刪除正在傳遞的節點,直到刪除了n 個節點
另一種方法是使用一個類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.