為了記住鍊錶的起始位置,可以使用乙個根指標。根指標指向鍊錶的第乙個節點。注意,根指標只是乙個指標,它不包含任何資料,它指向鍊錶的第乙個節點。
插入資料到鍊錶中,對於無序單鏈表,新值可以插入到任何位置。 把乙個新節點插入到鍊錶需要兩個步驟。首先,新節點的link欄位必須設定為指向它的目標後續節點。其次,前乙個節點的link欄位必須設定為指向這個新節點。
例: 鍊錶結構
typedef struct nodenode;
建立乙個頭節點
node *root = (node *)malloc(sizeof(node));
if(root == null)
初始化鍊錶
node *q = (node *)malloc(sizeof(node));
q->value =
3; root->
link
= q;
q->
link
=null;
公升序插入乙個節點的方法
雙鏈表中的每個節點包含兩個link欄位:其中乙個指向鍊錶的下乙個節點,另乙個指向鍊錶的前乙個節點。雙鏈表有兩個根指標,分別指向第乙個節點和最後乙個節點。因此,遍歷雙鏈表可以從任何一端開始,而且在遍歷過程中可以改變方向。為了把乙個新節點插入到雙鏈表中,我們必須修改四個指標。新節點的前向和後向link欄位必須被設定,前乙個節點的後向link欄位和後乙個節點的前向link欄位也必須進行修改,使它們指向這個新節點。
當我們把乙個節點插入到乙個鍊錶時,可能出現四種情況:
1.新值可能插入到鍊錶的中間位置
2.新值可能插入到鍊錶的起始位置
3.新值可能插入到鍊錶的結束位置
4.新值可能即插入到起始位置也插入到結束位置(原煉表為空)
例: 鍊錶結構:
typedef struct doublenodedoublenode;
初始化
root = (doublenode *)malloc(sizeof(doublenode));
q = (doublenode *)malloc(sizeof(doublenode));
root->fwrd = q;
root->bwrd = q;
q->value = 5;
根據四種情況公升序插入鍊錶的結構
/*如果鍊錶已經有該值,則返回0,如果插入正常,返回1*/
int doubleinsert(doublenode *
link,int value)
if(next->value > value)
}newnode = (doublenode *)malloc(sizeof(doublenode));
newnode->value = value;
if(newnode ==
null)
/*head and middle insert*/
if(next !=
null)
else
}/*tail and headandtail insert*/
else
else
}return
true;
}
單鏈表和雙鏈表
單鏈表 單鏈表只有乙個指向下一結點的指標,也就是只能next 雙鏈表 雙鏈表除了有乙個指向下一結點的指標外,還有乙個指向前一結點的指標,可以通過prev 快速找到前一結點,顧名思義,單鏈表只能單向讀取 為什麼市場上單鏈表的使用多餘雙鏈表呢?從儲存結構來看,每個雙鏈表的節點要比單鏈表的節點多乙個指標,...
單鏈表和雙鏈表
單鏈表 是乙個node,儲存當前物件,並指向下乙個next,插入在第一位node,next指向原來的first 單鏈表 只儲存第乙個node的引用,雙端鍊錶 儲存兩個node的引用,第乙個和最後乙個node,可以從第乙個插入,也可以從最後乙個插入,也可以從頭部和尾部刪除 鏈結點,相當於是車廂 pub...
資料結構 談談單鏈表和雙鏈表
陣列的特點 在記憶體中連續 利用下標定位元素,因此查詢操作的時間複雜度為o 1 增加與刪除元素時,需要進行移動,因此增加與刪除操作的時間複雜度為o n 陣列大小固定,不能直接擴容。如果需要擴容,也是建立乙個更大的陣列,再將元素複製過去。鍊錶的特點 在記憶體中可以不連續 增加與刪除元素的操作很方便,只...