一步一步學習資料結構(2) 鍊錶及其操作

2021-07-25 07:42:37 字數 3989 閱讀 2073

(1)單鏈表的節點插入操作

假設p指向乙個節點,要將

s所指節點插入

p所指節點之後的操作如下:

s->next=p->next;

p->next=s;

(2)單鏈表的節點刪除操作

節點a,節點b,

......假設p

為指向a

的指標,只需要將

p的指標域

next

指向原來p

(注意釋放所刪除節點的記憶體空間)

q=p->next;  

p->next=p->next->next;

free(q);//呼叫

free

函式來釋放

q所指節點的記憶體空間 (3

)尾插法建立單鏈表的演算法

假設有n

個元素已經儲存在陣列

a中,用尾插法建立鍊錶c。

void createlistr(lnode *&c,int a,int n){                   //要改變的變數用引用型

lnode *s,

*r;                 

//s用來指向新申請的節點,

r始終指向

c的終端節點

int i;

c=(lnode *

)malloc

(sizeof

(lnode

));//申請c

的頭節點空間

c->next=null;

r=c;             //r指向頭節點,因為此時頭節點就是終端結點

for(i=1;

i<=n;++i){//

迴圈申請

n個節點來接受陣列

a中的元素

s=(lnode *)malloc(sizeof(lnode));//s指向新申請的結點

s->data=a[i];//用新申請的節點來接受

a中的元素

r->next=s;//用

r來接納新結點

r=r->next;

r->next=null;

(4)頭插法建立單鏈表的演算法

void createlistr(lnode *&c,int a,int n){  

lnode *s;

int i;

c=(lnode*

)malloc

(sizeof

(lnode

));

c->next=null;

for(i=1;i<=n;++i){

s=(lnode*)malloc(sizeof(lnode));

s->data=a[i];

/*下面兩句是頭插法的關鍵步驟*/

s->next=c->next;//s所指新節點的指標域

next指向c

中的開始節點

c->next=s;

(5)單鏈表的歸併演算法a和b

是兩個單鏈表,其中元素遞增有序,將a和

b歸併成乙個按元素值非遞減有序的鍊錶c,

c由a和

b中的節點組成。

具體做法描述如下:

已知a,

b中的元素遞增有序,可以從a,

b中挑選最小的元素插入

c的尾部,這樣當a,

b中的元素全部都插入

c中時,

c一定是遞增有序的。

注意:a和b

中的元素有可能乙個已經全部被插入到

c中,另乙個還沒有插完。若

a中所有的元素已經全部被插入到c中而

b還沒有插完,則說明

b中所有元素都大於

c中元素,因此只要將

b中的剩餘部分鏈結到

c的尾部即可。

void merge(

lnode *&a

,lnode *&b

,lnode *&c){

lnode *p=a->next;//p用來跟蹤

a的最小值結點

lnode *q=b->next;//q用來跟蹤

b的最小值結點

lnode *r;      

//r始終指向

c的終端結點

c=a;          //用

a的頭結點來做

c的頭結點

c->next=null;

free(b);        //b的頭結點已無用,則釋放掉

r=c;           //r指向

c,因為此時頭結點也是終端結點

while(p!

=null&&q!=null){//當p

與q都不空時,選取p與

q所指節點中的較小者插入c尾部

/*以下的

if else

語句中,

r始終指向當前鍊錶的終端結點,作為接納新節點的乙個媒介,通過它新結點被鏈結入

c並且重新指向新的終端結點,以便於接受下乙個新節點,這裡體現了建立鍊錶的尾插法思想*/

if(p->data<=q->data){

r->next=p;

p=p->next;

r=r->next;

else{

r->next=q;

q=q->next;

r=r->next;

r->next=null;

/*以下兩個

if語句將還有剩餘結點的鍊錶鏈結在

c的尾部*/

if(p!=null) r->next=p;

if(q!=null) r->next=q;

(6)採用尾插法建立雙鏈表

void createdlistr(dlnode *&l,int a,int n){

dlnode *s,*r;

int i;

l=(dlnode *)malloc(sizeof(dlnode));

l->next=null;

r=l;

for(i=1;i<=n;++i){

s=(dlnode*)malloc(sizeof(dlnode));//建立新結點

s->data=a[i];

/*下邊

3個語句將

s插入在

l的尾部並且r指向

s,s->prior=r;

這一句是和建立單鏈表不同的地方*/

r->next=s;

s->prior=r;

r=s;

r->next=null;

(7)雙鏈表查詢結點的演算法

在雙鏈表中查詢第乙個結點值為x

的結點。從第乙個結點開始,邊掃瞄邊比較,若找到這樣的結點,則返回指標,否則返回

null

。演算法**如下:

dlnode* searchnode(

dlnode *c

,int x){

dlnode *p=c->next;

while(p!=null){

if(p->data==x)

break;

p=p->next;

return p;//如果找到,則

p中內容是結點位址(迴圈因

break

結束);若沒找到,

//則p中內容是

null

(迴圈因

p=null

而結束)。因此這一句可以將題幹中要 //求的兩種返回值情況統一起來

(8)雙鏈表插入結點的演算法

假設在雙鏈表中p

所指的結點之後插入乙個節點

s,其操作語句為:

s->next=p->next;

s->prior=p;

p->next=s;

s->next->prior=s;//假如

p指向最後乙個結點,則本行可以去掉

(9)雙鏈表刪除結點

設要刪除雙鏈表中p

結點的後繼結點,其操作語句如下:

q=p->next;

p->next=q->next;

q->next->prior=p;

free(q);

一步一步學鍊錶

首先是基本框架 1.錄入鍊錶 2.插入乙個元素 3.刪除乙個元素 4.遍歷鍊錶,輸出所有 5.鍊錶排序 6.退出 看了一下資料,了解了不少,寫了基本框架,今天先把錄入和輸出給實現了吧!先把 貼出來 首先是主函式 include include define null 0 typedef struct...

C C 資料結構之鍊錶(一步一步拆解單鏈表)

困擾了很久的資料結構重新拾起來,參考部落格大牛的文章,思考出一點自己的理解,希望給在學習資料結構這條路上的兄弟姐妹有所幫助,也為自己家能夠理清思路。廢話不多說,直接上 所需標頭檔案如下並且遮蔽安全警告 define crt secure no warnings include include inc...

一步一步學習IdentityServer3 8

identityserver3結合hangfire及cookies中介軟體實現授權 idr3資料庫token過期管理 globalconfiguration.configuration.usesqlserverstorage hangfire globalconfiguration.configur...