筆記【資料結構】第二章 線性表(二)
** 單鏈表**
通過指標把它的一串儲存結點鏈結成乙個鏈
儲存結點由兩部分組成: 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 尖括號內又稱模板形參表 返回值型別 函式名 參數列 如果變數被引數化,則返回值型別...