資料結構 單鏈表

2021-10-16 23:15:50 字數 3568 閱讀 9642

二、單鏈表的操作

2.判空

3.插入

4.指定結點的後插

5.指定結點的前插

6.刪除

7.指定結點的刪除

8.按位序查詢

9.按值查詢

10.求表長

11.尾插法建立單鏈表

12.頭插法建立單鏈表

鍊錶和順序表(陣列)一樣,都是在邏輯上線性儲存,所以都歸於線性表的行列。但在物理儲存上不一樣,順序表在邏輯還是物理上都是順序儲存,鍊錶在物理儲存上是離散型的儲存。這樣的儲存結構就使得鍊錶可以很方便地改變容量、刪除結點、增加結點,但同時也讓鍊錶訪問乙個資料變得很麻煩。

typedef

struct lnode lnode,

*linklist;

注意

若定義時不用typedef,則以後使用lnode型別都要加上struct關鍵字

使用lnode時,是為了強調這是乙個結點

使用linklist時,是為了強調這是乙個鍊錶

①帶頭結點

bool

initlist

(linklist &l)

補充:new的用法

int

* p =

newint[5

];//分配5個int型別的空間,並將這片空間的位址給p

int* p =

newint(5

);//分配1個int型別的空間,並賦初值5

②不帶頭結點
bool

initlist

(linklist &l)

bool

empty

(linklist l)

要想在鍊錶(帶頭結點)的第i個位置插入乙個元素,就需要先通過遍歷找到第i-1個位置,再建立乙個新的結點並把資料e存入新的結點,最後把這個新結點與鍊錶連在一起。

若是不帶頭結點的鍊錶想插入資料要稍微麻煩些,需要對i=1進行特殊處理多寫幾行**,其餘部分**相同。

bool

listinsert

(linklist &l,

int i, elemtype e)

if(p =

null

)return

false

;//i值不合法(偏大)

lnode* s =

new lnode;

//建立乙個新的結點

s->data = e;

//把資料e存入新的結點

/*下面兩行**不能調換位置,否則會使i位置後的所有節點丟失*/

s->next = p-next;

p->next = s;

return

true

;}

bool

insertnextnode

(lnode* p, elemtype e)

前插比後插麻煩許多,按照正常思路,我們需要先找到p結點的前驅結點,也就是要從頭開始遍歷來找到p結點前面乙個結點,這樣時間複雜度為o(n)。但如果我們借鑑後插的操作,先在p結點後面插入乙個新的結點,最後把p結點和新結點的資料域交換一下(也就是掉包一下),也可以達成同樣的效果,並且時間複雜度只有o(1)。

bool

insertpriornode

(lnode* p, elemtype e)

要想刪除鍊錶(帶頭結點)中第i個結點,直接找到第i-1個結點,讓它連到第i+1個結點,並釋放掉第i個結點。

若是不帶頭結點的鍊錶,想要刪除結點,同樣需要對i=1時進行特殊處理。

bool

listdelete

(linklist &l,

int i, elemtype &e)

if(p ==

null

)//i值不合法(偏大)

return

false

; lnode* q = p-

>next;

//讓q指向要被刪除的結點

e = q-

>data;

//用e帶回被刪除的元素

p->next = q-

>next;

//將結點q從鍊錶中脫離出去

delete q;

//釋放結點中的資料

return

true

;}

按照常規思路,要想刪除指定的結點,就要找到該結點的前一結點,但這樣很麻煩,所以我們可以採用類似前插的思路(掉包)。先將被刪結點後一結點中的資料往前移乙個結點,這樣保證了不想被刪除的結點中的資料不會丟失,然後再刪除這一結點。

當然,上述方法以及下述**都只適用於要刪除的結點不是最後乙個結點的情況,如果非要刪除鍊錶中最後乙個結點,就必須從表頭開始遍歷,用常規思路。

bool

deletenode

(lnode* p)

找到鍊錶(帶頭結點)中第i個結點,並返回。

lnode*

getelem

(linklist l,

int i)

return p;

//返回該結點

}

找到鍊錶(帶頭結點)中值為e的結點,並返回。

lnode*

locateelem

(linklist l, elemtype e)

int

length

(linklist l)

return len;

}

從頭結點開始,乙個結點乙個結點往後接,每次都是從當前鍊錶的最尾部新增新的結點(越新的結點越遠離頭結點),以此建立乙個鍊錶。

linklist list_tailinsert

(linklist &l)

r->next =

null

;//建立結束,將鍊錶最尾部指標後接上null

return l;

//返回建立好的鍊錶

}

每次從表頭開始插入新結點(越新的結點越靠近頭結點),以此建立乙個鍊錶。

linklist list_headinsert

(linklist &l)

return l;

//返回建立好的鍊錶

}

注意:頭插法建立的單鏈表中存放的資料順序正好與輸入資料的順序相反,所以可以用來將鍊錶逆置。

資料結構單鏈表

初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...

資料結構 單鏈表

今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...

資料結構 單鏈表

實現乙個單鏈表 1 查詢 查詢第index個節點 查詢指定的元素 2 插入 將指定的元素插入到第index個節點上 3 刪除 將第index個節點刪除 規律 刪除和新增元素前務必儲存兩個元素的位址引用資訊 public class mylinkedlist 記錄鍊錶結構的頭結點位址引用 privat...