當鍊表為空時
當鍊表不為空時
第一種情況,當p為空時,
第二種情況:
當鍊表不為空時
**的實現
注意:釋放malloc生成的堆空間時,記憶體空間一直都是在的,不是說你釋放之後,它就不在了哈!!!只是這塊記憶體空間現在不歸你使用了而已。
除錯的過程中 data,next會變成隨機值,代表了data,next*其實都已經不存在了哈!!
**如下
if
(p!=
null
) pre->next=
null
;free
(p);
p=null;}
}
按值刪除,前提是要尋找到某個元素,如果找不到該元素的話,就無法刪除,所以大的來說:分為2個思路:
**如下所示:
slistnode *p = plist->head;
slistnode *pre =
null
;while
(p !=
null
&& p->data != key)
if(p !=
null
)
分析:刪除的前提是查詢到元素,我們依次遍歷鍊錶,這裡有個很隱晦的地方需要注意,就是while迴圈的判斷條件,p!=null&&p->data !=key,這裡千萬不能調換順序,因為如果找不到該元素的話,程式就會崩潰掉。
主要是因為:與連線符連線多個條件進行判斷時,(以兩個條件為例)當前乙個條件為假,後乙個就不會進行判斷。
如果被查詢的元素沒有的話,p一直向後移動,那麼查詢完所有的元素,p此時等於null,不滿足while的迴圈條件,那麼p->data !=key就不會執行。而如果調換兩個的順序,p為null,根本不存在data,程式就會崩潰,提示無法寫入資料到0x00000000處。這是需要注意的第乙個點。
其次,以下圖為例,要刪除的元素為3,那麼我們需要定義前驅指標pre,使得2和4進行相連。
如下圖所示:考慮的情況為要刪除的結點為中間的結點;
而如果被刪除的結點為第乙個結點的話,while迴圈一次都不會進入,那麼pre=null,則pre就不能解引用,所以程式會崩潰。我們只需令plist->head=p->next即可刪除第乙個結點。(這裡不可用p=p->next;因為p和plist->head雖然指向同一塊空間,但是現在p指向了p->next,可是plist-head裡面存放的位址仍然是最初的位址,改變a裡面的值並不影響b裡面的值哦)
首先給出**:有幾個需要注意:
如果要刪除的元素為1,給定的鍊錶為1 1 2 2 3,那麼刪除掉 1 1 之後鍊錶裡面的元素為 2 2 3 ,找不到1,所以if條件判斷的時候,一定要有p!=null這個條件,否則就會誤認為找到1值,程式會發生崩潰。
void
slistremoveall
(slist* plist, elemtype key)
if(p !=
null
)//這個條件一定不能少
else
free
(p);}if
(pre ==
null
)else
}}
原理:原有鍊錶為3,7,8,10,6;我們需要按值插入9,假設以從小到大的順序進行插入,9比3大,故插入到3的後面,而9比7大,所以需要向後移動,變為3,7,9,8,10,6,因為9比8大,9向後移動一位,9比10小,將9按值插入到8和10中間。注意按值插入並不是排序。
思路:如下圖所示:
}1.斷開第乙個結點和後面的結點。
2.將後面的結點乙個接乙個的摘除掉
3.摘除掉之後,仿照按值插入的方式,將其插入到第乙個結點的後面。
外層的while迴圈用來控制,讓結點向後移動。內層的while迴圈用來控制讓脫落下來的結點按照大小插入。
C語言單鏈表常見操作彙總
include include 定義單鏈表結構體 typedef int elemtype typedef struct node lnode,linklist 建立單鏈表 void build linklist l 求單鏈表的長度 void linklength linklist l printf...
單鏈表知識總結(C語言)
通過結構體指標將結構體變數與結構體變數連線起來的線性表稱為鍊錶。一 建立鍊錶 一 結構體指標 struct node 二 將結構體指標變為結構體變數 動態記憶體申請 struct node createlist 二 建立結點 struct node createnode int data 三 插入結...
單鏈表(合併單鏈表)
單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...