鍊錶中第乙個結點的儲存位置叫做頭指標,那麼整個鍊錶的訪問就必須是從頭指標開始進行了。之後的每乙個結點,其實就是上乙個的後繼指標指向的位置。
這裡有個地方要注意,就是對頭指標概念的理解,這個很重要。
「鍊錶中第乙個結點的儲存位置叫做頭指標」,如果鍊錶有頭結點,那麼頭指標就是指向頭結點資料域的指標。
畫乙個圖吧。
這個圖看起來很清晰了。比如說頭結點,我們就可以這麼描述了:
是的,對於
頭指標,我們也可以有相應的理解了。
頭指標具有標識作用,故常用頭指標冠以鍊錶的名字。
無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素。
單鏈表也可以沒有頭結點。如果沒有頭結點的話,那麼單鏈表就會變成這樣:
說了這麼多,既然頭結點可有可無,那到底是該有還是不該有呢?
總得來說,一般使用線性表,都是指有頭結點得情況。
下面簡單總結了兩個使用頭結點優點:
頭結點是在鍊錶的開始結點之前附加乙個結點。它具有兩個優點:
⒈由於開始結點的位置被存放在頭結點的指標域中,所以在鍊錶的第乙個位置上的操作就和在表的其它位置上操作一致,無須進行特殊處理;
⒉無論鍊錶是否為空,其頭指標都是指向頭結點的非空指標(空表中頭結點的指標域空),因此空表和非空表的處理也就統一了。
方便在第1個位置進行插入、刪除操作時,同其他位置一樣。
加了頭結點之後,插入、刪除都是在後繼指標next上進行操作,不用動頭指標;
若不加頭結點的話,在第1個位置插入或者刪除第1個元素時,需要動的是頭指標。
例如:在進行刪除操作時,l為頭指標,p指標指向被刪結點,q指標指向被刪結點的前驅,對於非空的單鏈表:
1.帶頭結點時
刪除第1個結點(q指向的是頭結點):q->next=p->next; free(p);
刪除第i個結點(i不等於1):q->next=p->next;free(p);
2.不帶頭結點時
刪除第1個結點時(q為空):l=p->next; free(p);
刪除第i個結點(i不等於1):q->next=p->next;free(p);
結論:帶頭結點時,不論刪除哪個位置上的結點,用到的**都一樣;
不帶頭結點時,刪除第1個元素和刪除其它位置上的元素用到的**不同,相對比較麻煩。
鍊錶 頭指標 頭結點
圖1為線性表 zhao,qian,sun,li,zhou,wu,zheng,wang 的邏輯狀態。頭指標 指示鍊錶中第乙個結點 即第乙個資料元素的儲存映像 的儲存位置。同時,由於最後乙個資料元素沒有直接後繼,則線性鍊錶中最後乙個結點的指標為 空 null 圖 線性鍊錶的邏輯狀態 由上述描述可見,單鏈...
鍊錶 頭指標 頭結點
圖1為線性表 zhao,qian,sun,li,zhou,wu,zheng,wang 的邏輯狀態。頭指標 指示鍊錶中第乙個結點 即第乙個資料元素的儲存映像 的儲存位置。同時,由於最後乙個資料元素沒有直接後繼,則線性鍊錶中最後乙個結點的指標為 空 null 圖 線性鍊錶的邏輯狀態 由上述描述可見,單鏈...
鍊錶 頭指標 頭結點
圖1為線性表 zhao,qian,sun,li,zhou,wu,zheng,wang 的邏輯狀態。頭指標指示鍊錶中第乙個結點 即第乙個資料元素的儲存映像 的儲存位置。同時,由於最後乙個資料元素沒有直接後繼,則線性鍊錶中最後乙個結點的指標為 空 null 圖 線性鍊錶的邏輯狀態 由上述描述可見,單鏈錶...