使用結構和指標(單 雙鏈表)

2021-08-03 14:00:02 字數 1963 閱讀 4733

為了記住鍊錶的起始位置,可以使用乙個根指標。根指標指向鍊錶的第乙個節點。注意,根指標只是乙個指標,它不包含任何資料,它指向鍊錶的第乙個節點。

插入資料到鍊錶中,對於無序單鏈表,新值可以插入到任何位置。 把乙個新節點插入到鍊錶需要兩個步驟。首先,新節點的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 陣列大小固定,不能直接擴容。如果需要擴容,也是建立乙個更大的陣列,再將元素複製過去。鍊錶的特點 在記憶體中可以不連續 增加與刪除元素的操作很方便,只...