資料結構 第二章 線性表(二)單鏈表

2021-09-29 10:29:34 字數 3696 閱讀 7860

筆記【資料結構】第二章 線性表(二)

** 單鏈表**

通過指標把它的一串儲存結點鏈結成乙個鏈

儲存結點由兩部分組成: data欄位 ,link欄位

單鏈表的儲存映像

結點之間可以連續,也可以不連續儲存;

結點的邏輯順序與物理順序可以不一致;

錶可擴充。

在c++中,可以用結構型別來描述單鏈表的結點 ,由於結點的元素型別不確定,所以採用c++的模板機制。

template struct node 

;

頭結點:如果鍊錶有頭節點,則鏈式結構中的第乙個節點稱為頭結點:其資料域可以儲存一些附加資訊,如鍊表長度;其指標域指向鍊錶中的第乙個節點。

帶頭結點的空單鏈表

單鏈表的實現

template class linklist 

linklist ( t a[ ], int n ) ;

~linklist ( ) ;

int length ( ) ;

t get ( int i ) ;

int locate ( t x ) ;

void insert ( int i, t x ) ;

t delete ( int i ) ;

void printlist ( ) ;

private:

node*first; // 單鏈表的頭指標 , 可以省略

};

頭插法:template linklist:: linklist(t a[ ], int

n) }

尾插法:template linklist:: linklist(t a[ ], int

n)

r->next=null; //單鏈表建立完畢,將終端結點的指標域置空

}

單鏈表的遍歷

template linklist:: printlist()

}

補充:不帶頭結點的單鏈表的構造

頭插法:

}

不帶頭結點的單鏈表的構造

尾插法:

node*r;

head=null;

if(n<=0)return;

s=new node;

s->data=a[0];

s->next=head;

head=s;

r=head;

for(int i=1;i;

s->data=a[i];

r->next=s;

r=s;

}

查詢演算法:

1工作指標p初始化,計數器初始化

2執行下列操作,直到p為空或指向第i個節點

2.1工作指標後移

2.2 計數器增1

3 若p為空,則第i個元素不存在,丟擲位置異常;否則查詢成功,返回節點p的資料元素

template t linklist::get(int i) 

if (!p) throw "位置";

else return p->data;

}

複雜性分析

template t linklist::get(int i) 

if (!p) throw "位置";

else return p->data;

}

查詢演算法的基本語句是工作指標 p 後移,該語句執行的次數與被查結點在表中的位置有關。

在查詢成功的情況下,若查詢位置為 i ( 1 ≤ i ≤ n ),則需要執行 i 次, 等概率情況下,平均時間效能為 o ( n ) 。

單鏈表插入的演算法描述

1 工作指標p初始化,計數器初始化

2 查詢第i-1個節點,並使工作指標p指向該節點

3 若查詢不成功(p==null),說明位置錯誤,丟擲位置異常,否則

3.1生成乙個元素值為x的新節點s

3.2 將s插入到p之後

template void linklist::insert(int i, tx)

if (!p) throw "位置";

else

}

不帶頭結點的單鏈表中插入結點

insert(int i, t x)

p=first ; j=1; //工作指標p初始化

while (p && jnext; //工作指標p後移

j++; }

if (!p) throw "位置";

else

}

刪除演算法分析

1.工作指標p初始化;累加器j清零,1i主意工作指標 p要指向頭結點2查詢第ir1個結點並使工作指標p指向該結點;

3.若p不存在或p的後繼結點不存在,丟擲位置異常:

否則,3.1 暫存被刪結點和被刪元素值;

3.2摘鏈,將結點p的後繼結點從鍊錶上摘下,33釋放被刪結點:34返回被刪元素值;

template t linklist::delete(int i)

if (!p || !p->next) throw "位置"; //結點p不存在或結點p的後繼結點不存在

else

}

2.迴圈鍊錶

不增加額外儲存花銷,卻給不少操作帶來了方便

從迴圈表中任一結點出發,都能訪問到表中其他結點。

特點:

首尾相接的鍊錶。

可以從任一節點出發,訪問鍊錶中的所有節點。

判斷迴圈鍊錶中尾結點的特點:

空表的構造

template cyclelinklist:: cyclelinklist(

)

尾插法構造迴圈鍊錶

template cyclelinklist:: cyclelinklist(t

a[ ], int n)

r->next=first; //單鏈表建立完畢,將終端結點的指標域指向頭結點

}

頭插法構造迴圈鍊錶

template cyclelinklist:: cyclelinklist(t

a[ ], int n,int k)

}

將非迴圈的單鏈表改造成迴圈的單鏈表

p=first;

while(p->next)

p->next=first

資料結構 第二章 線性表

線性表 是具有相同型別的n n 0 個元素的有限序列,其中n為表長,當n 0時,該錶為空表。線性表的特點 線性表的九種基本操作 initlist l 初始化表。構造乙個空的線性表。destroylist l 銷毀操作。銷毀線性表,並釋放線性表l所占用的記憶體空間。locateelem l,e 按值查...

資料結構 第二章 線性表

線性表 順序儲存 鏈式儲存 順序表單鍊錶 雙鏈表迴圈鍊錶 靜態鍊錶 陣列指標實現 借助陣列實現 定義 線性表是具有相同資料型別的n n 0 個資料元素的有限序列,其中n為表長,當n 0時該線性表是乙個空表。特點 1 個數有限 2 表中元素具有邏輯上的順序性。3 表中元素都是資料元素,每個元素都是單個...

資料結構 第二章 線性表

資料結構 第二章 線性表 模板 引數化的多型 引數化多型性 講程式所處理的物件型別引數化,使一段 可用於處理多種不同型別的物件 採用模板程式設計 提供 共享機制 邏輯功能相同,資料型別不同 定義格式 template 尖括號內又稱模板形參表 返回值型別 函式名 參數列 如果變數被引數化,則返回值型別...