簡體   English   中英

刪除鏈表中的最后一個節點

[英]Delete the last node in a linked list

我正在嘗試刪除鏈表中的最后一個節點,但我似乎遇到了一些困難。 這是代碼。

void sterge_ultimul(element *lista) {
  element *p,*q;
  while (p->urmator->urmator!=NULL)
    p=p->urmator;
  q=p->urmator;
  p->urmator=NULL;
  free(q);
}

英語:

void delete_last(element *list) {
   component *p, *q;
   while (p->next->next != NULL)
     p = p->next;
   q = p->next;
   p->next = NULL;
   free(q);
}

我已經做了刪除列表頭部的功能,所以我認為我不需要擔心。

它不會運行,如果您能提供幫助,我將不勝感激。

謝謝,拉杜

您的 p 從未初始化,因此它指向內存中的隨機地址,然后您訪問它會導致未定義的行為。

你想要的是用列表的第一個元素( lista )初始化 p 。 然后,您需要考慮您的邏輯,特別是如果您在只有一個節點時嘗試刪除鏈表的最后一個節點會發生什么。

初始化 p:

void sterge_ultimul(element *lista) {
  element *p = lista, *q;
  while (p->urmator->urmator!=NULL)
    p=p->urmator;
  q=p->urmator;
  p->urmator=NULL;
  free(q);
}

另外我會添加一些錯誤處理來檢查列表是否太短:

int sterge_ultimul(element *lista) {
  element *p = lista, *q;
  if (!p || !p->urmator) return 0;  /* error, list is too short */
  while (p->urmator->urmator!=NULL)
    p=p->urmator;
  q=p->urmator;
  p->urmator=NULL;
  free(q);
  return 1;
}

我會像這樣實現它:

void sterge_ultimul(element** p)
{        
    while(*p && (*p)->urmator)
        p = &(*p)->urmator;

    free(*p);
    *p = 0;
}

使用此版本,當列表中只有一個元素時,您還可以刪除最后一個元素。 應該使用指向列表的指針的地址調用它:

sterge_ultimul(&lista);

如果列表只包含一個元素,則刪除最后一個元素,調用后lista0

你沒有初始化p指針。 它的價值是不確定的。

讀取未初始化的對象是未定義的行為。 未定義的行為意味着任何事情都可能發生。 任何事情都包括您的程序很可能會崩潰。

對於 C90,請參見未定義行為定義中的 3.16,對於 C11,參見 6.3.2.1p2,對於 C99,參見DR#338 中的 C 委員會回答

C90

未定義行為:使用時的行為 [...] 或不確定價值的對象 [...]

(C11, 6.3.2.1p2)

“如果左值指定了一個自動存儲持續時間的對象,該對象可以用寄存器存儲類聲明(從未獲取其地址),並且該對象未初始化(未用初始化程序聲明,並且在之前沒有對其進行賦值)使用),行為未定義。”

以下是正確的功能:

void sterge_ultimul(element *lista) 
{
  element *p = lista , *q;
  while (p->urmator->urmator!=NULL)
    p=p->urmator;
  q=p->urmator;
  p->urmator=NULL;
  free(q);
}

英語

void delete_last(element *list) 
{
  component *p = list, *q;
  while (p->next->next != NULL)
    p = p->next;
  q = p->next;
  p->next = NULL;
  free(q);
}

一般建議:當您在代碼中看到未初始化的指針(或一般的變量和對象)時,請務必確保您有充分的理由。 這個小小的檢查將為您將來調試代碼省去很多麻煩。

暫無
暫無

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

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