線性表的概念
線性表簡稱表,是零個或多個元素的有窮序列,通常可以表示成 k0,k1, …,kn-1(n ≥ 1)
線性表的一些名詞
– 表目:線性表中的元素(可包含多個資料項,記錄)
– 索引(下標):i 稱為表目 ki 的「索引」或「下標」
– 表的長度:線性表中所含元素的個數 n
– 空表:長度為零的線性表 ( n = 0 )
線性表的特點
– 操作靈活,其長度可以增長、縮短
線性結構
二元組? = ?, ? ? = ? =
– 有乙個唯一的 ,它沒有前驅,有乙個唯一的直接後繼
– 乙個唯一的 ,它有乙個唯一的直接前驅,而沒有後繼
– 其它的結點皆稱為 內部結點,每乙個內部結點都有且僅有乙個唯一的直
接有前驅,也有乙個唯一的直接後繼
< ??, ??+1 > ??是??+1的前驅,??+1是??的後繼
– 前驅/後繼關係r,具有 反對稱性 和 傳遞性
線性結構的特點線性結構的分類
• 按複雜程度劃分
– 簡單的:線性表、棧、佇列、雜湊表
– 高階的:廣義表、多維陣列、檔案……
• 按訪問方式劃分
– 直接訪問型 (direct access)
– 順序訪問型 (sequential access)
– 目錄索引型 (directory access)
• 按操作劃分(詳見後)
– 線性表
所有表目都是同一型別結點的線性表
不限制操作形式
根據儲存的不同分為:順序表,鍊錶
– 棧 (lifo, last in first out)
插入和刪除操作都限制在表的同一端進行
– 佇列 (fifo, first in first out)
插入操作在表的一端, 刪除操作在另一端
線性表類模板
template class list ;
線性表的邏輯結構
–線性表的長度
– 表頭 (head)
– 表尾 (tail)
– 當前位置 (current position)
線性表的儲存結構
1.順序表
– 按索引值從小到大存放在一片相鄰的連續區域
– 緊湊結構,儲存密度為 1
2.鍊錶
– 單鏈表
– 雙鏈表
– 迴圈鍊錶
線性表按操作分類
• 線性表
– 不限制操作
• 棧– 在同一端操作
• 佇列
– 在兩端操作
線性表運算
• 建立線性表
• 清除線性表
• 插入乙個新元素
• 刪除某個元素
• 修改某個元素
• 排序
• 檢索
class arrlist : public list
~arrlist()
void clear()
int length(); // 返回當前實際長度
bool insert(const int p, const t value); // 插入元素
bool delete(const int p); // 刪除位置 p 上元素
bool setvalue(const int p, const t value); // 設元素值
bool getvalue(const int p, t& value); // 返回元素
bool getpos(int &p, const t value); // 查詢元素
};
順序表也稱向量,採用定長的一維陣列儲存結構
順序表的特性
– 元素的型別相同
– 元素順序地儲存在連續儲存空間中,每乙個元素有唯一的索引值
– 使用常數作為向量長度
順序表的插入
// 設元素的型別為t, alist是儲存順序表的陣列, maxsize是其最大長度;
// p為新元素value的插入位置,插入成功則返回true, 否則返回false
template bool arrlist:: insert (const int p, const t value)
if (p < 0 || p > curlen)
for (i = curlen; i > p; i--)
alist[i] = alist[i-1]; // 從表尾 curlen -1 起往右移動直到 p
alist[p] = value; // 位置 p 處插入新元素
curlen++; // 表的實際長度增 1
return true;
}
線性表的刪除
// 設元素的型別為 t;alist是儲存順序表的陣列; p 為即將刪除元素的位置
// 刪除成功則返回 true,否則返回 false
template // 順序表的元素型別為 t
bool arrlist:: delete(const int p)
if (p < 0 || p > curlen-1)
for (i = p; i < curlen-1; i++)
alist[i] = alist[i+1]; // 從位置p開始每個元素左移直到 curlen
curlen--; // 表的實際長度減1
return true;
}
根據鏈結方式和指標多少來分類
單鏈表
• 帶頭結點的單鏈表
– 整個單鏈表: head
– 第乙個結點: head->next,head ≠ null
– 空表判斷: head->next == null
當前結點a1:fence->next (curr 隱含)
單鏈表的節點型別
template class link
link(const link* nextvalue)
};
單鏈錶類的定義
template class lnklist : public list
單鏈表的插入演算法
// 插入資料內容為value的新結點作為第 i 個結點
template // 線性表的元素型別為 t
bool lnklist:: insert(const int i, const t value)
q = new link(value, p->next);
p->next = q;
if (p == tail) // 插入點在鏈尾,插入結點成為新的鏈尾
tail = q;
return true;
}
雙鏈表
為彌補單鏈表的不足,而產生雙鏈表
• 單鏈表的 next 字段僅僅指向後繼結點,不能有效地找到前驅, 反之亦然
• 增加乙個指向前驅的指標
雙鏈表的節點型別
template class link
link(link* prevalue = null, link* nextvalue = null)
}
迴圈鍊錶
• 將單鏈表或者雙鏈表的頭尾結點鏈結起來,就是乙個循
環鏈表• 不增加額外儲存花銷,卻給不少操作帶來了方便
– 從迴圈表中任一結點出發,都能訪問到表中其他結點
鍊錶的注意事項
鍊錶的邊界條件
• 幾個特殊點的處理
– 頭指標處理
– 非迴圈鍊錶尾結點的指標域保持為 null
– 迴圈鍊錶尾結點的指標回指頭結點
• 煉表處理
– 空鍊錶的特殊處理
– 插入或刪除結點時指標勾鏈的順序
– 指標移動的正確性
• 插入
• 查詢或遍歷
• 順序表
– 插入、刪除運算時間代價 o(n),查詢則可常數時間完成
– 預先申請固定長度的連續空間
– 如果整個陣列元素很滿,則沒有結構性儲存開銷
• 鍊錶
– 插入、刪除運算時間代價 o(1),但找第i個元素運算時間
代價 o(n)
– 儲存利用指標,動態地按照需要為表中新的元素分配存
儲空間– 每個元素都有結構性儲存開銷
順序表和煉表的選擇
• 順序表
– 結點總數目大概可以估計
– 線性表中結點比較穩定(插入刪除少)
– n > de / (p + e)
• 鍊錶
– 結點數目無法預知
– 線性表中結點動態變化(插入刪除多)
– n < de / (p + e)
資料結構 A 線性結構之順序表
1.線性表 線性表 linear list 是n個具有相同特性的資料元素的有限序列。線性表是一種在實際中廣泛使用的資料結構,常見的線性表 順序表 鍊錶 棧 佇列 字串。線性表在邏輯上是線性結構,也就說是連續的一條直線。但在物理結構上並不一定是連續的,線性表在物理上儲存時,通常以陣列和鏈式結構的形式儲...
資料結構之線性表(順序表 鍊錶)
線性表是資料結構的一種,乙個線性表是n個具有相同特性的資料元素的有限序列。線性表的邏輯結構簡單,便於實現和操作。線性表的特徵 1 線性表是乙個序列 2 n 0時,線性表是乙個空表 3 線性表中的第乙個元素無前驅,最後乙個元素無後繼,其他元素有且只有乙個前驅和後繼。4 線性表是有長度的,其長度就是元素...
資料結構與演算法 線性表之順序表與鍊錶結構
線性表,全名為線性儲存結構。簡介 將具有 一對一 關係的資料 線性 地儲存到物理空間中,這種儲存結構就稱為線性儲存結構 簡稱線性表 注意 使用線性表的資料所使用的資料型別必須是一致的。有兩種方式線性地儲存資料到記憶體中,即順序儲存和鏈式儲存。下圖為順序儲存在記憶體中的儲存方式 當需要從記憶體中將存放...