線性表的鏈式表示和實現

2021-10-02 13:41:41 字數 3563 閱讀 5898

線性表鏈式儲存結構的特點是:用一組任意的儲存單元儲存線性表的資料元素(這組儲存單元可以是連續的,也可以是不連續的)。因此,為了表示每個資料元素ai與其直接後繼資料元素a i+1之間的邏輯關係,對資料元素ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後續的資訊(即直接後續的儲存位置)。這兩部分資訊組成資料元素ai的儲存映像,稱為結點

。它包括兩個域:其中儲存資料元素資訊的域稱為資料域

;儲存直接後繼儲存位置的域稱為指標域

。指標域中儲存的資訊稱為指標

。n個結點(ai(1<=i<=n)的儲存印象)鏈結成乙個鍊錶

,即為線性表的鏈式儲存結構。又由於此鍊錶的每個結點只包含乙個指標域,故又稱線性鍊錶

單鏈表

。單鏈錶可由頭指標唯一確定,在c語言中可用「結構指標」來描述:

//單鏈表的儲存結構

typedef struct lnode

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

下面對首原結點、頭結點、頭指標三個容易混淆的概念加以說明

鍊錶增加頭結構的作用如下。

便於首元結點的處理。

便於空表和非空表的統一處理。

演算法 單鏈表的初始化

演算法步驟

演算法描述

status initlist(linklist &l)

和順序表不同,鍊錶中邏輯相鄰的結點並沒有儲存在物理相鄰的單元中,這樣,根據給定的結點位置序號i,在鍊錶中獲取該結點的值不能像順序表那樣隨機訪問,而只能從鍊錶的首元結點出發,順著鏈域next逐個結點向下訪問。

演算法 單鏈表的取值

演算法步驟

(1)用指標p指向首元結點,用j做計數器初始值賦為1.

(2)從首元結點開始依次順著鏈域next向下訪問,只要指向當前節點的指標p不為空,並且沒有到達序號為i的節點,則迴圈執行如下操作在;

(3)退出迴圈時,如果指標p為空,或者計數器j大於i,說明指定的序號i值不合法(i大於表長n或i小於等於0),取值失敗返回error;否則取值成功,此時j=i時,p所指的結點就是要找的第i個節點,用引數e儲存當前結點的資料域,返回ok。

演算法描述

status getelem(linklist l,int i,elemtype &e)

if(!p||j>i)return error;//i值不合法i>n或i<=0

e=p->data; //取第i個結點的資料域

return ok;

}

鍊錶中按值查詢的過程和順序表類似,從鍊錶的首元結點出發,依次將結點值和給定值e進行比較,返回查詢結果。

演算法 單鏈表的按值查詢

演算法 單鏈表的按值查詢

演算法步驟

演算法描述

lnode *locateelem (linklist l, elemtype e)

演算法 單鏈表的插入

演算法步驟

將值為e的新結點插人到表的第1個結點的位置上,即插人到結點ai-1與ai之間,具體插人過程如圖2.12所示,圖中對應的5個步驟說明如下。

演算法描述

status listinsert (linklist gl,int 1,elemtype e)

//查詢第1-1個結點,p指向該結點

if(!p||j>i-1) return error; //i>n+1或者i<1

s=new lnode; //生成新結點*s

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

s->next=p->next; //將結點*s的指標域指向結點ai

p->next=s; //將結點*p的指標域指向結點*s

return ok;

}

演算法 單鏈表的刪除

演算法步驟

演算法描述 

status listdelete(linklist &l,int i)

if(!(p->next)||(j>i-1) return error; //當i>n或i<1時,刪除位置不合理

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

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

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

return ok;

}

根據結點插入位置的不同,鍊錶的建立方法可分為前插法和後插法。

前插法的演算法描述

void createlist_h(linklist &l,int n)

}

後插法的演算法描述

void createlist_r(linklist &l,int n)

}

迴圈鍊錶是另-種形式的鏈式儲存結構。其特點是表中最後乙個結點的指標域指向頭結點,整個鍊錶形成乙個環。 由此,從表中任一-結點出發均可找到表中其他結點,迴圈單鏈表的操作和單鏈表基本一致,差別僅在於:當鍊表遍歷時,判別當前指標p是否指向表尾結點的終止條件不同。在單鏈表中,判別條件為p!=null或p->next!=null.而迴圈單鏈表的判別條件為p!=l或p->next!=l。

以上討論的鏈式儲存結構的結點中只有乙個指示直接後繼的指標域,由此,從某個結點出發只能順指標向後尋查其他結點。若要尋查結點的直接前驅,則必須從表頭指標出發。換句話說,在單鏈表中,查詢直接後繼結點的執行時間為o(1),而查詢直接前驅的執行時間為o(n)。為克服單鏈表這種單向性的缺點,可利用雙向鍊錶

。顧名思義,在雙向鍊錶的結點中有兩個指標域,乙個指向直接後繼,另乙個指向直接前驅,在c語言中可描述如下:

//雙向鍊錶的儲存結構

typedef struct dulnode

dulnode, * dulinklist;

演算法 雙向鍊錶的插入

演算法描述

status listinsert-dul(dulinklist &l,int i,elemtype e)

演算法 雙向鍊錶的刪除 

演算法描述 

status listinsert-dul(dulinklist &l,int i,elemtype e)

線性表的鏈式表示和實現(鏈式)

課程名 資料結構 實驗目的 1 掌握線性表的定義 2 掌握線性表的基本操作,如建立 查詢 插入和刪除等。實驗要求 定義乙個包含學生資訊 學號,姓名,成績 的順序表和煉表,使其具有如下功能 1 根據指定學生個數,逐個輸入學生資訊 2 逐個顯示學生表中所有學生的相關資訊 3 根據姓名進行查詢,返回此學生...

線性表的鏈式表示和實現

標頭檔案 函式的宣告 include include include include typedef int elemtype typedef struct node listnode,linklist listnode鍊錶的結點型別,linklist指向鍊錶結點的指標型別 void initlis...

線性表的鏈式表示和實現

線性表的鏈式表示和實現 include include include exit 等 typedef int status define overflow 2 define error 0 define ok 1 線性表的單鏈表儲存結構 struct lnode typedef lnode link...