c語言求助關於鍊錶刪除的問題,c語言 求助乙個關於鍊錶刪除的問題

時間 2022-11-16 22:30:44

1樓:

這個出錯點在行 while() 迴圈之後的那一句:

free(l->tail);

第一段程式,其實在 while() 迴圈裡面已經把全部節點都釋放了,包括尾節點,所以第一段程式不需要再釋放一次 l->tail,只需要保留 l->tail = null; 即可。

第二段程式,因為最後乙個節點的 next 是 null,while() 迴圈到最後乙個節點時就已經跳出,,所以迴圈裡面沒有釋放最後乙個節點,因而後面加了 free(l->tail); 這一句是對的。

2樓:匿名使用者

第一段**我覺得沒有問題, 第二段**有問題, 分析下如下:

假設只有head 節點, 那麼在 head->next 就為null。

也就是p指向head, p_next =head->next即指向null。 這樣第二段**中就不會進入迴圈,head節點就無法釋放了。

還請題主進一步測試下。

3樓:三天打魚

上面的p在迴圈裡下面賦值是錯誤的 在下面賦值後p 和p_next指標指向同乙個元素

這樣下次迴圈就會漏刪上乙個元素 而且 釋放p 等於釋放了p_next 就出問題了

4樓:匿名使用者

兩段**都有問題。問題都在while迴圈後的free(l)的語句。l結點對應位址已經在迴圈內通過free(p)釋放了。

此時l指標的指向是不確定的。再執行free(l)是不合適的。

求助關於c語言雙鏈表的乙個問題!我寫的乙個刪除結點的函式,為什麼沒辦法執行啊……高手幫幫忙!

5樓:匿名使用者

判斷一下dlist是否為空,在程式入口在上assert(dlist!=null);斷言,其他地方我也沒發現錯誤,想到的唯一可能就是這個了!

6樓:人工神話

查詢節點不是去匹配節點的指標值(位址),而是節點的值,即info

7樓:匿名使用者

這裡有問題

else if(p==dlist->head&&p!=dlist->rear)

else if(p==dlist->rear&&p!=dlist->head)

你再試試,沒有完整程式,我不能幫你測試,有問題再追問,共同研究

c語言鍊錶刪除資料的問題,求助!

8樓:匿名使用者

不知你這**是哪找的,應該都有問題

1、就算**能刪除鍊錶中的元素,但如果要刪除鍊錶的第乙個元素,這個**肯定有問題

2、記憶體洩露

void delete(struct list *r,int n)if(!(p->next )||(i>n-1))printf("刪除位置出錯!");

p=q->next ;//因為這裡改變p指向的位置,所以上面的空間沒有釋放!!!

q->next =p->next ;

free(p);

}//我寫了個,不知道是不是你要的那種意思//關於結構體和鍊錶,《c和指標》講的特別詳細list* deleteitem(list* phead,int pos)

if(null == premove)

//刪除元素

if(null == pprevious)else

return ptemp;}

c語言中關於鍊錶的刪除?

9樓:開陽曦

所謂鍊錶,就是用指標將記憶體中動態分配的結點空間,鏈結起來成乙個表。

所以,建表的過程即是每次為新結點分配記憶體;因此,釋放空間的話,也要從頭到尾,乙個乙個結點的釋放,這樣才能全部釋放掉。

這段**釋放了整個鍊錶空間記憶體;while迴圈的作用是從頭到尾釋放後續結點,如果直接free(phead)則後面的結點將無法找到,那麼造成記憶體空間洩露。

另外,你的while迴圈存在乙個錯誤,假設釋放了倒數第乙個結點後,phead指向最後乙個結點,而最後乙個結點的next為null,那麼這樣最後乙個結點也沒有釋放掉,while就退出了。

while迴圈應該更正為:

while(phead != null)

求問個c語言問題,刪除鍊錶節點的時候 為什麼要釋放被刪節點,不釋放也不影響呀

10樓:寒寒家

如果不釋放的話會造成記憶體洩露。

比如乙個業務邏輯中需要不斷的增加節點,並不斷的刪除節點,如果不釋放節點的記憶體空間的話,假設每個節點佔記憶體8位元組,那麼這個塊邏輯執行足夠多次數,記憶體就放不下了。這就是隱患了。

(尤其處理的資料量級較大時,這個問題會比較明顯)

11樓:這個寶文有點

就像家裡垃圾一樣,不扔了,不是占用空間,礙事麼

c語言的單向鍊錶刪除節點的問題

12樓:

if(ptemp->inumber==a)//用於判斷學號是否等於輸入值

else//不是頭結點

}ppre=ptemp;

ptemp=ptemp->pnext;

每回釋放ptemp後要重新給值

13樓:青春無情

全部遍歷一次,while(p!=null)就可以了把if判斷放到while裡面,還有你的那個頭結點是不應該放資料的,不需要判斷

14樓:匿名使用者

struct node*deletnode(struct node*head,int delet_age)

p=head;

while(p!=null)

p=p->next;

}return head;

}沒有上機,樓主可以測試一下。

c語言鍊錶刪除問題

15樓:gta小雞

>data!=x) p=p->next;

if(!p)

if(p->next!=null)

else

prin(l);

return true;}

16樓:四川新華

所謂鍊錶,就是用指標將記憶體中動態分配的結點空間,鏈結起來成乙個表。

所以,建表的過程即是每次為新結點分配記憶體;因此,釋放空間的話,也要從頭到尾,乙個乙個結點的釋放,這樣才能全部釋放掉。

這段**釋放了整個鍊錶空間記憶體;while迴圈的作用是從頭到尾釋放後續結點,如果直接free(phead)則後面的結點將無法找到,那麼造成記憶體空間洩露。

另外,你的while迴圈存在乙個錯誤,假設釋放了倒數第乙個結點後,phead指向最後乙個結點,而最後乙個結點的next為null,那麼這樣最後乙個結點也沒有釋放掉,while就退出了。

17樓:吾霓武映寒

num應該是鍊錶節點的乙個屬性

比如int

num;

num!

=p->num;是一句判斷語句,在判斷

當前節點p的num值

是否與查詢的num值相同,如果相同,代表這個節點就是需要刪除的

18樓:蒿冰初和雅

這個就需要你判斷了,你首先需要將鍊錶的資料全部遍歷一遍,在遍歷的同時就判斷該資料是否為你要刪除的資料,如果是,就刪除,繼續遍歷……一直到結束,這樣就可以吧1全部刪除了。

滿意請採納!

c語言 刪除鍊錶的某個節點

19樓:有錢買不起房子

temp=p;

p=p->next;

temp->next=null;

這三句存在問題,temp=p,讓temp指向p所指向的節點,p=p->next,p指向後移

temp->next=null,讓temp的後繼為空,這裡出了問題,鍊錶從temp指向的節點斷開,相當於刪除p之後的所有節點。

應該先判斷p是不是最後節點

if(p->next==null)

如果是,只好去找p的前趨pre,讓pre->next=null,free(p)

如果不是最後節點,將p的後繼節點數值域複製給p,然後將p的後繼節點刪除,等同與刪除p

p->data=p->next->data;

p->next=p->next->next;

free(p);

20樓:

p 的上乙個節點要等於 p->next

struct node *delet(head,pstr)以/*he a d 為頭指標,刪除ps t r 所在節點*/

struct node *head;

char *pstr;

if(strcmp(temp->str,pstr)==0 ) / *找到字串* /

e l s e

}else printf("\nno find string!\n");沒/找* 到要刪除的字串*/

}r e t u r n ( h e a d ) ; / *返回表頭指標* /}

21樓:匿名使用者

node * x = head; node * y = 0;

int i = 0;

for(i = 0; i < 8; i++) x = x->next;

y = x->next;

x->next = y->next;

free(y);

另外,站長團上有產品**,便宜***

關於C語言的問題,關於c語言問題

先說明一點,c語言中巨集和函式有些差別,巨集是 第乙個例子,double 1 2 這個呼叫實際上是2 1 2,看,x被為1 2,然後根據運算子的規則 實際上應該說是優先順序 先運算2 1,再加上2,所以結果是4。第二個例子就更簡單了,同樣是,toupper s i 這個呼叫,實際上它的 就是 a s...

關於C語言的問題,關於c語言的問題

選a,輸入函式scanf 是不能指定小數點精度的,d也不對,因為輸入的必須是位址,可以改成scanf f a 就對了。scanf f a 答案是d,應為你定義了實數,實數本身就可以帶小數點的,沒必要申明,在輸出時申明保留兩位就行了。scanf a scanf函式對小數字數沒有限制!關於c語言的問題 ...

c語言中煉表的儲存 讀取 修改問題

1 鍊錶存到檔案中去後,再取出來是不是要再次對各個元素進行鍊錶的關聯 就是下乙個元素位址賦予前乙個元素中的位址變數中 有沒有更簡單的方法讓其自動恢復原先的鍊錶關係?答 鍊錶的關係的卻需要重新建立,沒有別的方法,這裡只需要重新設定,因為鍊錶是儲存在記憶體中的,每次malloc出來的指標位址不一致,無法...

求問c語言簡單鍊錶的問題急

for p head p next null p p next 迴圈檢查,最後把p指向鍊錶的最後乙個節點。p next q 在鍊錶的最後乙個節點後面新增乙個新節點q。q next null q成為鍊錶的最後乙個節點,所以它後面沒有節點,即為null printf 此資訊已新增 return 整段 的...

關於C語言的問題,關於c語言的問題?

include using namespace std define limetline double f double x int main else 以下取本輪的誤差。dlim b a while dlim limetline 當 誤差限 小於 允許範圍時,中止迴圈,cout 方程的解是 dmi...