1.實驗要求:
找到迴圈鍊錶的最小值並刪除該最小值後輸出
2.錯誤演算法思路:
void
delete_min
(linklist l)
p = p-
>next;
} location = location -2;
;while
(current != l && i < location)
//將指標current指向被刪結點的前乙個
linklist t= current-
>next;
current-
>next = t-
>next;
//拉上拉鍊
delete t;
l->data--
;}
3.出錯原因:
①主要是在找到最小結點的while迴圈裡中s->data = p->data;s = p;這兩個語句,仔細想想,如果一開始找到的最小結點是在中間,s就會指向這個結點然後如果在後面有又出現了乙個結點資料是比一開始那個小的,那麼此時原來那個結點的data域就會被改變,變得和p的data域一樣了
②s結點是新建出來用來儲存最小值的,但是到後面這個結點就刪不去了,因為,空間已經被新建出來了,仔細想想,如果只是單獨用來儲存最小值的資料的話,其實不用新建結點來儲存的
③其實找到被刪結點的前乙個結點的演算法不用那麼複雜,因為原來的s已經是指向被刪結點了,所以直接再設乙個工作指標current,讓他遍歷鍊錶,while(current->next!=s)的時候current=current->next,這樣就很容易就找到了
4.補充知識點
①void delete(linklist l)與void delete(linklist &l),函式引數的區別:
加了&的就是引用,沒加的就是沒引用;如果不引用,就是無法改變指標l的指向的,但可以改變它指向的資料,因為它是新建了個指標,指向用乙個位置,所以如果不引用,去改變函式內指標的指向的話,是無法改變實參裡面傳入指標的指向,此時改的就是新建指標的指向,因此對於不改頭指標指向的功能函式來說,形參引用和不引用就沒區別
②如果只是單獨用來儲存最小值的資料的話,其實不用新建結點來儲存的,直接設乙個整型變數存就好了!!!!新建結點還刪不去
③在刪除鍊錶結點的演算法中,新建的指標,一定要指向被刪結點,就是要先摘下結點
④找到被刪結點的前乙個結點的演算法不用那麼複雜,因為原來的s已經是指向被刪結點了,所以直接再設乙個工作指標current,讓他遍歷鍊錶,while(current->next!=s)的時候current=current->next,這樣就很容易就找到了
⑤當新建鍊錶的結點,分配空間使用malloc函式的時候,刪除這個結點要用free()或者delete ,如果是用new新建的話,刪除就要用delete。刪除指標時,用delete就可以了,malloc在stdlib.h標頭檔案裡,要提前包括進來
5.易錯點:
①利用刪除演算法時,注意要先把被刪結點摘下,就是要先設定乙個工作指標,指向被刪結點,然後最後再delete掉這個工作指標
②最後別忘記了將鍊錶長度減一
③存資料不一定要用結點存,用乙個整型變數即可
6.心得
①寫**之前一定要先把演算法寫出來!!!!
②學會前面的四條知識點
③刪除鍊錶的時候,鍊錶長度最後一定要減一!!!
7.優化演算法如下:
第一步:找到並儲存鍊錶的最小值資料。可以先設定兩個個工作指標變數,其中乙個工作指標p用來遍歷迴圈鍊錶,另乙個工作指標s用指向迴圈最小值的結點,便於後面進行刪除
然後設定乙個整型變數用來儲存鍊錶裡面的最小值,整型變數的初始值為首元節點的數值。
當遍歷過程中結點的data域小於整型變數時,將其賦值給整型變數
第二步:找到被刪結點的前乙個結點。另設乙個工作指標current,用乙個while迴圈,當current->next不等於s指標時(這個s指標指向的是鍊錶的最小值結點),current一直往
往後移動,直到找到最小值結點的前乙個結點
第三步:套用刪除演算法,將最小值結點刪除
第四步:將鍊錶的長度減一。就是將附加頭結點的data域減一(事先此區域存的是鍊錶長度)
8.優化演算法原始碼實現如下:
void
delete_min
(linklist &l)
p = p-
>next;
}while
(current -
>next!=s)
//將指標current指向被刪結點的前乙個
current-
>next = s-
>next;
//s已經指向被刪結點了,所以直接拉上拉鍊拉上拉鍊
free
(s);
//現在要刪去s指標指向的結點,而不是刪除指標,而這個結點分配空間當初使用malloc()函式的,因此用free()
l->data--
;}
詳細**和執行過程參見資料結構第四周作業迴圈鍊錶檔案 最小值 ACM 資料結構的使用
題目描述 輸入n 個數,m 次查詢。每次查詢給出乙個數x。要求 每次查詢輸出前 x個數中第 i小的數。i為第 i次查詢 你可以假設 m n xi xi 1 xi 2 xm xm n 輸入line0 t line1 n,m line2 linen 1 num1,numn linen 2 linen 2...
資料結構 迴圈鍊錶
近期我在學習資料結構,於是我自己整理了單鏈表 迴圈單鏈表 雙向鍊錶 雙向迴圈鍊錶的相關 以鞏固這段時間的學習,也希望能夠幫助初學者,希望大家在閱讀以下 時發現問題糾正於我,一起 cyclinklist.h ifndef cyclinklist h define cyclinklist h inclu...
資料結構 迴圈鍊錶
迴圈鍊錶的結點 typedef struct circularnodecircularnode 迴圈鍊錶結構 typedef struct circularlinklistcircularlinklist 在迴圈鍊錶的指定位置插入元素 void insertcircularlinklist circ...