線性表之單鏈表

2022-07-24 05:30:18 字數 1878 閱讀 5923

單鏈表的每節點中除了資料域外,還包含乙個指標域,用來指向下乙個節點,主要有帶頭結點和不帶頭結點兩種。

單鏈表定義如下:

//

單鏈表結構體定義

typedef struct

lnode lnode;

.不妨設在節點a和節點b直間插入節點s,則具體分兩步實現:

//

讓節點s指向b

s->next = a->next;

//

節點a指s

a->next = s

注意,這兩步的順序不能弄反,否則會丟失資料;

同理,不妨設刪除節點b,則只需要找到前乙個節點a即可,具體實現如下:

//

p是要刪除的節點

p = a->next;

a->next = a->next->next;

//釋放節點b的空間

free(p);

插入的新節點在表頭,舊的節點在新節點之後,不妨設已有頭節點b,現插入節點a,則形式為a->b,關鍵**如下所示:

a->next = b->next;

b->next=a;

具體實現如下:

//

插入的節點在表頭

status createlistoff(lnode *&p, int a, int

n)

return

ok;}

關鍵在於新插入的節點在鍊錶的尾部,不妨設最後插入的節點是f,則最後必須加上f->next = null,具體實現如下:

//

插入的節點在表尾

status createlistofr(lnode *&p, int a, int

n) r->next =null;

return

ok;}

status printlist(lnode *p) 

while (p->next !=null)

cout

ok;}

刪除元素兩個關鍵點:

具體實現如下:

status findanddel(lnode *&p,int

x) pre =p;

p = p->next;

}//查詢部分結束

if (p ==null)

else

}

遞增有序鍊錶在這使用尾插法,將兩個有序的鍊錶的元素一一比較,將較小的乙個插入c中,依次遞推。

注意:a和b中的元素有可能乙個已經完全插入,另外乙個部分插入。不妨設a完全插入,b部分插入,這說明b的剩下元素完全大於b,這是只需要將b接入c即可;

具體實現如下:

status mergelistrise(lnode *a, lnode *b, lnode *&c) 

else

}r->next =null;

//處理有一部分插完而另外一部分未插完;

if (pa !=null)

if (pb->next !=null)

return

ok;}

同上述合併成乙個遞增有序鍊錶類似,但這裡使用頭插法構建c,不需要r指標指向c的尾節點,具體實現如下:

status mergelistfall(lnode *a, lnode *b, lnode *&c) 

else

}//當某乙個鍊錶先處理完時

while (pa !=null)

while (pb !=null)

return

ok;}

線性表之單鏈表

cpp view plain copy linkedlist linc 2013.2.26 include include include define ok 1 define error 1 define ture 1 define false 0 struct node typedef stru...

線性表之單鏈表

零個或多個資料元素的有限序列,線性表中的元素是一對一的關係,除了第乙個元素和最後乙個元素外,其他元素都是首尾相接的。線性表有兩種儲存方式,一種是順序儲存結構,另一種是鏈式儲存結構。指用一段位址連續的儲存單元依次儲存線性表的資料元素。優點 無需為表示元素間的邏輯關係而增加額外的儲存空間 隨機查詢元素,...

線性表之單鏈表

template typenamet structnode 頭結點 如果鍊錶有頭節點,則鏈式結構中的第乙個節點稱為頭結點 其資料域可以儲存一些附加資訊,如鍊表長度 其指標域指向鍊錶中的第乙個節點。template class linklist linklist t a int n linklist ...