1.線性表
定義n個資料元素的有限序列,記作(
a1, a2,
…, an
)ai
是表中資料元素,
n 是表長度
線性表特點
除第乙個結點(元素)外,其他每乙個結點有乙個且僅有乙個直接前驅結點。
除最後乙個結點(元素)外,其他每乙個結點有乙個且僅有乙個直接後繼結點。
2.順序表定義和特點
將線性表中的元素相繼存放在乙個連續的儲存空間中。
可利用一維陣列描述儲存結構
特點線性表的順序儲存方式 遍歷
順序訪問, 可以隨機訪問
4.鍊錶
鍊錶分為單鏈表、靜態鍊錶、迴圈鍊錶、雙向鍊錶
每個元素(表項
)由結點
(node)
構成。
線性結構
結點可以連續,可以不連續儲存
結點的邏輯順序與物理順序可以不一致
錶可擴充
5單鏈表定義
typedef char listdata;
typedef struct node listnode;
typedef listnode * linklist;
linklist first; //煉表頭指標
單鏈表插入
5.1頭插
newnode->link = first ;
first = newnode;
5.2 中間插
newnode->link = p->link;
p->link = newnode;
6.帶表頭結點的單鏈表
表頭結點位於表的最前端,本身不帶資料,僅標誌表頭。
設定表頭結點的目的是
統一空表與非空表的操作
簡化鍊錶操作的實現。
7.頭插法建立單鏈表
從乙個空表開始,重複讀入資料:
生成新結點
將讀入資料存放到新結點的資料域中
將該新結點插入到鍊錶的前端
直到讀入結束符為止。
8.尾插法建立單鏈表
每次將新結點加在鍊錶的表尾;
設定乙個尾指標 r,總是指向表中最後乙個結點,新結點插在它的後面;
尾指標 r 初始時置為指向表頭結點位址
9.迴圈鍊錶
迴圈鍊錶是單鏈表的變形。
迴圈鍊錶最後乙個結點的 link 指標不 為
null
,而是指向了表的前端。
為簡化操作,在迴圈鍊錶中往往加入表頭結點。
10.雙向鍊錶
雙向鍊錶是指在前驅和後繼方向都能遊歷(遍歷
)的線性鍊錶。
雙向鍊錶通常採用帶表頭結點的迴圈鍊錶形式。
11.順序表與鍊錶的比較
基於空間的比較
儲存分配的方式
順序表的儲存空間是靜態分配的
鍊錶的儲存空間是動態分配的
儲存密度 = 結點資料本身所佔的儲存量
/結點結構所佔的儲存總量
順序表的儲存密度 = 1
鍊錶的儲存密度
< 1
基於時間的比較
訪問方式
順序表可以隨機訪問,也可以順序訪問
鍊錶是順序訪問的
插入/刪除時移動元素個數
順序表平均需要移動近一半元素
鍊錶不需要移動元素,只需要修改指標
若插入/刪除僅發生在表的兩端,宜採用帶尾指標的迴圈鍊錶
12.棧
定義●只允許在一端插入和刪除的線性表;
●允許插入和刪除的一端稱為棧頂(top)
,另一端稱為棧底
(bottom)
特點:後進先出 (lifo)
13.棧的主要操作
adt stack seqstack;
int stackempty (seqstack *s) {
//判斷棧是否空?空則返回
1,否則返回0
return s->top == -1;
int stackfull (seqstack *s) {
//判斷棧是否滿?滿則返回
1,否則返回0
return s->top == stacksize-1;
void initstack ( seqstack *s) { //置空棧
s->top = -1;
int push (seqstack *s, stackdata x) {
//若棧滿返回
0, 否則新元素
x 進棧並返回1
if ( stackfull (s) ) return 0;
s->data[++s->top] = x; //加入新元素
return 1;
int gettop (seqstack *s, stackdata &x) {
//若棧空返回
0, 否則棧頂元素讀到
x並返回1
if ( stackempty(s) ) return 0;
x = s->data[s->top];
return 1;
int pop (seqstack *s, stackdata &x) {
//若棧空返回
0, 否則棧頂元素退出到
x並返回1
if ( stackempty(s) ) return 0;
x = s->data[s->top--];
return 1;
15.鏈式棧
鏈式棧無棧滿問題,空間可擴充
插入與刪除僅在棧頂處執行
鏈式棧的棧頂在鏈頭
適合於多棧操作
16.佇列
定義佇列是只允許在一端刪除,在另一端插入的線性表
允許刪除的一端叫做隊頭(front),允許插入的一端叫做隊尾
(rear)。
特性先進先出(fifo, first in first out)
17佇列進隊和出隊原則
進隊時隊尾指標先進一 rear = rear + 1,再將新元素按
rear
指示位置加入。
出隊時隊頭指標先進一 front = front + 1,再將下標為
front
的元素取出。
隊滿時再進隊將溢位出錯;
隊空時再出隊將隊空處理。
解決辦法之一:將佇列元素存放陣列首尾相接,形成迴圈(環形
)佇列。
18.迴圈佇列
佇列存放陣列被當作首尾相接的表處理。
隊頭、隊尾指標加1時從
queuesize -1
直接進到
0,可用語言的取模(餘數
)運算實現。
隊頭指標進1: front = (front+1) % queuesize;
隊尾指標進1: rear = (rear+1) % queuesize;
佇列初始化:front = rear = 0;
隊空條件:front == rear;
隊滿條件:(rear+1) % queuesize == front
19.佇列的鏈結表示 — 鏈式佇列
隊頭在鏈頭,隊尾在鏈尾。
鏈式佇列在進隊時無隊滿問題,但有隊空問題。
隊空條件為 front == null
資料結構複習一
一 名詞術語 資料 描述客觀事物的數字,字元以及一切能夠輸入到計算機中,並且能夠被電腦程式處理的符號的集合。資料元素 資料這個集合中的乙個個的元素,乙個資料元素可以包含乙個或若干個資料項。資料物件 具有相同特性的資料元素的集合。結構 資料元素之間具有的關係。資料結構 就是具有結構的資料元素的集合。二...
資料結構複習(一)
資料結構的物理結構主要分為兩種 1 順序儲存結構 2 鏈式儲存結構 1 順序儲存結構 順序儲存結構 是把資料元素存放在位址連續的儲存單元中,其資料的邏輯關係和物理關係一致,即邏輯上的前驅後繼關係對應儲存結構也是前驅後繼關係 我們在之前的c語言課程中,陣列就是順序儲存結構。2 鏈式儲存結構 指標 鏈式...
資料結構複習(一)
一 單項選擇題 1.資料的四種基本邏輯結構是指。a.鍊錶 陣列 串 圖狀結構 b.線性表 鍊錶 棧佇列 陣列 c.線性結構 鍊錶 樹形結構 圖形結構 d.集合 線性結構 樹形結構 圖狀結構 2 評價演算法的時間複雜性,比較 對數階量級 與 線性階量級 則有。a 對數階量級複雜性大於線性階量級 b 對...