雙向鍊錶:結點中有兩個指標域,其中乙個指向後繼,一指向前驅
演算法2.18:現在我們來看在雙向鍊錶中插入乙個結點
圖如下:
我們現在來看**:(書上**有錯誤,下面這個是我修改後的**)
status listinsert_dul(dulinklist &l,int i,elemtype e)
if(!(s=(dulinklist)malloc(sizeof(dulnode))))
return error;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return ok;
}
現在我們來分析下:
1.這個status指的是一種狀態,因為c語言不支援泛型。2.這個getelemp_dul根據這套**,他返回了第i個節點的位址,把p指向了i指向的位址。
3.這裡的error和ok是乙個巨集(#define)
4.這個給s在堆區開闢空間,如果s為null,則error
5.這裡開始說明插入:
1.要插入的為s,先把s中data的值賦值為e。2.把s的前驅先接好。
3.再把p的前驅的後繼接好。
4.隨後大家看**和圖,很簡單,自己操作時都會了(這裡可能有些朋友會說我不記得這些順序怎麼辦,其實可以不用記,自己敲一邊,就知道為什麼順序了)
演算法2.19:
下面我們來看刪除:
圖如下所示:
下面是書中**:
status listdelete_dul(dulinklist &l, int i, elemtype &e) // listdelete_dul
下面我們來分析下:
1.這裡面有個elemtype& e,這個東西呢我覺得在這裡面有些畫蛇添足了,因為他釋放了這個空間但提取了他的值,可能在其他地方有用吧。
2.這裡是先把p的後繼賦值給了p的前面那個節點的後繼,再把p的前驅賦值給p後繼的前驅,其實這個順序是無所謂的,當我們換了順序時,也沒有影響。
演算法:2.20:
歸併la和lb得到新的單鏈線性表lc,lc的元素也按值非遞減排列。
下面是書中的偽**:
status mergelist_l(nlinklist &la, nlinklist &lb, nlinklist &lc,
int (*compare)(elemtype, elemtype)) else
} // while
freenode(ha); freenode(hb); // 釋放la和lb的頭結點
return ok;
} // mergelist_l
這裡我就只能說下思路了,因為這裡很多函式都被寫好了。並且書裡面也沒給出具體**,所以在此只能給大家分析下思路,這個程函式前三個引數分別是la,lb,lc鍊錶的引用,從**上看,la,lb都是有資料的,lc是空的(因為pa=nextpos(la,ha)和pb=nextpos(lb,hb))。第三個引數就是乙個比較。這個initlist函式顧名思義就是初始化鍊錶,gethead函式就是獲得線性鍊錶的頭結點位址,這個nextpos裡面有兩個引數,第乙個是鍊錶,第二個是節點,這個函式的意思就是得到指定節點的後繼結點的位置。 careercup 鍊錶 2 3
2.3實現乙個演算法,刪除單向鍊錶中間的某個結點,假設你只能訪問該結點。即你不知道頭結點 這個問題的關鍵是你只有乙個指向要刪除結點的指標,如果直接刪除它,這條鍊錶就斷了。但你又沒辦法得到該結點之前結點的指標,是的,它連頭結點也不提供。在這種情況下,你只能另覓他徑。重新審視一下這個問題,我們只能獲得從...
鍊錶補充及鍊錶和陣列的區別
初稿 2017 11 19 13 05 57 不迴圈單鏈表 加頭結點,使得插入刪除操作相同,不必特別處理插入或刪除的是第乙個位置的情況。迴圈單鏈表 引用引數是最後乙個結點的指標ptail,這樣既能迅速找到首結點phead ptail next,也能迅速獲取表尾。不迴圈雙向鍊錶 p所指結點後插入結點q...
鍊錶內容的補充3 迴圈鍊錶與雙向鍊錶
1.迴圈鍊錶 與單鏈表的整體結構類似,迴圈鍊錶也是一種鏈式儲存的結構,不同的是 迴圈鍊錶要求表中最後乙個結點的指標指向鍊錶的頭結點,達到乙個迴圈的效果。由此可以得出,遍歷迴圈鍊錶指標資料域的語句是指標所指結點或指標所指結點的後繼結點是否等於頭結點 或指標是否等於頭指標 除了鍊錶結構不同以外,其餘的基...