資料結構篇 線性結構之順序表與鍊錶

2021-09-27 00:14:15 字數 4834 閱讀 5356

線性表的概念

線性表簡稱表,是零個或多個元素的有窮序列,通常可以表示成 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 線性表是有長度的,其長度就是元素...

資料結構與演算法 線性表之順序表與鍊錶結構

線性表,全名為線性儲存結構。簡介 將具有 一對一 關係的資料 線性 地儲存到物理空間中,這種儲存結構就稱為線性儲存結構 簡稱線性表 注意 使用線性表的資料所使用的資料型別必須是一致的。有兩種方式線性地儲存資料到記憶體中,即順序儲存和鏈式儲存。下圖為順序儲存在記憶體中的儲存方式 當需要從記憶體中將存放...