鍊錶的基本功能實現

2021-07-08 20:07:27 字數 4122 閱讀 9455

前言  :  鍊錶的實現,查詢,插入,刪除,這些簡單的操作。在平時的學習中,經常會遇見,故以單鏈表為例做個總結。鍊錶的優缺點,以及適用情況在前面的一篇文中就提到過,就不作介紹了。

一、鍊錶的定義

單鏈表儲存結構

typedef struct lnode

lnode,*linklist; /*linklist為指向結構體lnode的指標型別*/

linklist與lnode *同為結構體指標型別,這兩種型別定義本質上是等價的,為提高程式的可讀性,通常用linklist定義頭指標,lnode*定義指向單鏈表中任意結點的指標變數。例如,linklist  l,則l為單鏈表的頭指標;使用lnode *p,則p為指向單鏈表中任意結點的指標,用*p代表該結點。

二、鍊錶的基本操作的實現

1.初始化

[演算法思想]

1)生成新的結點作為頭結點,用頭指標l指向頭結點。

2)頭結點的指標域置空。

[演算法描述]

int  initlist_l(linklist &l)

2.查詢2.1按序號查詢[演算法思想]從鍊錶的第乙個結點(l->next)開始順著鏈域掃瞄,用指標p指向當前掃瞄到的結點,p的初值指向第乙個結點(p=l->next)。用j做計數器,累計當前掃瞄過的結點數,j的初值為1,當p指向掃瞄的下一結點時,計數器j相應加1。當j=i時,p所指的結點就是要找的第i個結點。

[演算法描述]

int getelem_l(linklist l,int i,int &e)

if(!p || j>i) return error; /*第i個元素不存在*/

e=p->data;

return ok;

}

2.2按值查詢[演算法思想]鍊錶中查詢其值與給定值e相等的資料元素的過程和順序表(陣列)類似,從第乙個結點起,依次和e相比較,如果找到乙個其值與e相等的資料元素,則返回其在鍊錶中的「位置」;如果查遍整個鍊錶都沒有找到其值和e相等的元素,則返回「null」。因此需要設定乙個指標變數p順鏈掃瞄,直到p為「null」,或者p->data和e相同為止。

[演算法描述]

int locateelem_l(linklist l,int e)

if(!p)return null; /*查詢失敗返回null*/

return j;

}

3.插入[演算法思想]將值為e的新結點插入到表的第i個結點的位置上,即插入到結點a(i-1)與ai之間,分為以下幾步:

1)找到結點a(i-1)並由指標p指向該結點。

2)生成乙個新結點*s。

3)將新結點*s的資料域置為e。

4)將新結點*s的指標域指向結點ai;

5)令結點a(i-1)的指標域指向新結點*s。

[演算法描述]

int listinsert_l(linklist &l, int i, int e)

if(!p || j>i-1) return error;

lnode *s=new lnode;

s->data=e; /*將結點s的資料域置為e*/

s->next=p->next; /*將結點s插入l中*/

p->next=s;

return ok;

}

4.刪除[演算法思想]要刪除單鏈表的第i個結點ai,分以下幾步:

1)找到結點a(i-1)並由指標p指向該結點。

2)臨時儲存待刪除結點ai的結點在q中,以備釋放。

3)令p->next指向ai的直接後繼結點。

4)將待刪除結點ai的值保留在e中(此步根據實際應用情況可以省略)。

5)釋放結點ai的空間。

int listdelete_l(linklist &l,int i,int &e)

if(!p||j>i-1) return error;

lnode *q=p->next; /*臨時儲存被刪結點的位址以備釋放*/

p->next=q->next; /*改變刪除結點前驅結點的指標域*/

e=q->data;

delete q; /*釋放刪除結點的空間*/

return ok;

}

5.建立鍊錶鍊錶的建立方法可以分為前插法和後插法。因為後插入比較常用和清晰,故在這裡只是實現了後插法。

[演算法思想]

後插法是通過將新結點逐個插入到鍊錶的尾部來建立鍊錶。同前插法一樣首先要建立乙個只有頭結點的空鍊錶l。不同的是,為了使新結點能插入到表尾,需要增加乙個尾指標r指向鍊錶的尾結點。初始時,r同l均指向頭結點。每讀入乙個資料元素則申請乙個新結點,將新結點插入到尾結點*r之後,再使r指向新的尾結點。

[演算法描述]

void createlist_l(linklist &l,int n)

}

[完整**]

#includeusing namespace std;

typedef struct lnode

lnode,*linklist;

const int ok=1;

const int error = -1;

/*初始化*/

int initlist_l(linklist &l,int n)

if(!p || j>i) /*第i個元素不存在*/

if(!p)

if(!p || j>i-1)

/*刪除*/

int listdelete_l(linklist &l,int i,int &e)

if(!p||j>i-1)

/*後插法建立*/

void createlist_l(linklist &l,int n)

cout<

if(p==null)

cout<>n;

linklist l;

initlist_l(l,n); /*初始化*/

createlist_l(l,n); /*建立鍊錶*/

printlist_l(l);

int e=0;

/*刪除鍊錶*/

listdelete_l(l,1,e);

printlist_l(l);

/*插入鍊錶*/

listinsert_l(l,1,e);

printlist_l(l);

/*按值查詢*/

locateelem_l(l,2);

/*按序號查詢*/

getelem_l(l,3,e);

return 0;

}

[執行結果]

後語:鍊錶的反轉,雙向鍊錶,迴圈鍊錶這些未實現的有機會再補上。

鍊錶的基本功能實現

基本函式和返回型別 bool initlist linklist l 初始化 bool getelem linklist l,int i,elemtype e 取元素 bool destroylist linklist l 刪除鍊錶 bool listdelete linklist l,int i,...

C語言鍊錶的基本功能

結構體的建立 typedef struct nodenode init函式用於結點的初始化 node init 頭插式建立鍊錶函式 void insert head node head,int data 尾插式建立鍊錶函式 void insert tail node head,int data 使用...

ASP基本功能實現

修改資料庫的記錄 若要修改資料庫的記錄,首先使用ado鏈結到access資料庫ntopsamp.mdb,下sql指令尋找待修改的記錄,將結果傳回到rs1的recordset當中,asp程式碼如下 set rs server.createobject adodb.recordset sql selec...