資料結構 王道2017 第2章 線性表

2022-07-31 22:39:17 字數 3301 閱讀 8277

1. 線性表的定義和基本操作

1.1 線性表的定義

線性表**i具有相同資料型別的n(n >= 0)個資料元素的有限序列。其中n為表長,當n=0時,該線性表是乙個空表。若用l命名線性表,則一般表示為:

l=(a1,a2,a3...ai,ai+1...an)

其中,a1是唯一的第乙個資料元素,又稱為表頭元素;an是唯一的最後乙個資料元素,又稱為表尾元素。除第乙個元素外,每個元素有且僅有乙個直接前驅。除最後乙個元素外,每個元素有且僅有乙個直接後繼。以上就是線性表的邏輯特性,這種線性有序的邏輯結構正是線性表名字的由來。

表中的個樹有限

表中元素具有邏輯上的順序性,在序列中各元素排序有先後順序。

表中元素都是資料元素,每乙個元素都是單個元素。

表中元素的資料型別都相同。這意味著每乙個元素占有相同大小的空間。

表中元素具有抽象性。即僅討論元素間的邏輯關係,不考慮元素究竟表示什麼內容。

注意:線性表是一種邏輯結構,表示元素之間一對一的相鄰關係。順序表和煉表是指儲存結構,兩者屬於不同層面的概念,因此不要將其混淆。

1.2 線性表的基本操作

乙個資料結構的基本操作是指其最核心、最基本的操作。其他較複雜的操作可以通過呼叫其基本操作來實現。線性表的主要操作如下:

initlist(&l)  : 初始化表。構造乙個空的線性表。

length(l) : 求表長。返回線性表l的長度,即l中資料元素的個數。

locateelem(l,e): 按值查詢操作。在表l中查詢具有給定關鍵字值的元素。

getelem(l,i): 按位查詢操作。獲取表l中第i個位置的元素的值。

listinsert(&l,i,e): 插入操作。 在表l中第i個位置上插入指定元素e。

listdelete(&l,i,&e): 刪除操作。 刪除表l中第i個位置的元素,並用e返回刪除元素的值。

printlist(l): 輸出操作。按前後順序輸出線性表l的所有元素值。

empty(l) : 判空操作。若l為空表,則返回true,否則返回false.

注意:基本操作的實現取決於採用哪一種儲存結構,儲存結構的不同,演算法的實現也不同。

線性表的定義要求為有限序列,並且具有邏輯上的聯絡。

集合中個元素沒有前後驅關係,因此不是線性表。

鄰接表是一種儲存結構,而線性表是一種邏輯結構。

2. 線性表的順序表示

2.1 線性表的順序儲存又稱為順序表。它是用一組位址連續的儲存單元,依次儲存線性表中的資料元素。

假設線性表l儲存的起始位置為loc(a),sizeof(elemtype)是每個資料元素所占用儲存空間的大小。

假定線性表的元素型別為elemtype,線性表的順序儲存型別描述為

#define maxsize 50      //

定義資料表的最大長度

typedef

struct

sqlist;

//順序表的型別定義

一維陣列可以是靜態分配的,也可以是動態分配的。在靜態分配時,由於陣列的大小和空間實現已經固定,一旦空間佔滿,再加入新的資料將產生溢位,就會導致程式崩潰。

而動態分配時,儲存陣列的空間是在程式執行過程中通過動態儲存分配語句分配的,一旦資料空間佔滿,可以另外開闢一塊更大的儲存空間,用以替換原來的儲存空間。從而達到擴充儲存陣列空間的目的。

#define initsize 100                    //

表長度的初始定義

typedef

struct

seqlist;

//動態分配陣列順序表的型別定義

c的初始動態分配語句:

l.data = (elemtype*)malloc(sizeof(elemtype)*initsize);

c++的初始動態分配語句為:

l.data = new elemtype[initsize];

注意: 動態分配並不是鏈式儲存,同樣還是屬於順序儲存結構,其物理結構沒有變化,依然是隨機儲存方式,只是分配的空間大小可以在執行時決定。

2.2 順序表基本操作的實現

(1)插入操作

在順序表l的第i(1<=i<=l.length+1)個位置插入新元素e。如果i的輸入不合法,則返回false,表示插入失敗;否則,將順序表的第i個元素以及其後的所有元素右移一格位置,騰出乙個空位置插入新元素e,順序表長度增加1,插入成功,返回true.(c++ 按引用傳參)

bool listinsert(sqlist &l, int

i, elemtype e)

else

}

最好情況: 在表尾插入,即i=n+1,元素後移語句不執行,時間複雜度為o(1);

最壞情況: 在表頭插入(即i=1),元素後移語句將執行n次,時間複雜度為o(n);

平均情況: 假設pi(pi=1/(n+1))是在第i個位置上插入乙個結點的概率,則在長度為n的線性表中插入乙個節點時所需移動節點的平均次數為 n/2.

(2)刪除操作

刪除順序表l中第i(1<=i<= l.length) 個位置的元素,成功返回true,並將被刪除的元素用引用變數e返回,否則返回false。

bool listdelete(sqlist & l, int i, elemtype &e){

if(1 > i || l.length < i)

return false;

e = l.data[i-1];

for(int j = i;j l.data[j-1] = l.data[j];

l.length--;

return true;

最好情況刪除隊尾元素,無需移動,時間複雜度為o(1);

最壞情況,刪除表頭元素,需要移動n-1次,時間複雜度為o(n)    

平均情況: 所需移動節點的平均次數為: (n-1)/2;  o(n)

(3) 按值查詢

在順序表l中查詢第乙個元素值為e的元素,並返回其位序.

int locatelem(sqlist l,elemtype e){

for(int i = 0;i < l.length;i++){

if(l.data[i] == e)

return i+1;

return 0;                 //沒找到

最好:在表頭,僅需比較一次,時間複雜度為o(1);

最差:在末尾或不存在,為n次,o(n)

平均 n+1/2  

資料結構 王道2017 第4章 樹與二叉樹

1.樹的定義 樹是n n 0 個結點的有限集合,n 0時,稱為空樹,這是一種特殊情況。在任意一棵非空樹種應滿足 1 有且僅有乙個特定的成為根的結點 2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集合t1,t2,t3.tm,其中每乙個集合,本身又是一棵樹,並且稱為根節點的子樹。顯然樹的定義...

大話資料結構 第2章 演算法

3 演算法設計的要求 4 演算法效率的度量方法 5 函式的逐漸增長 6 演算法時間複雜度 7 常見的時間複雜度 8 最壞情況與平均情況 9 演算法空間複雜度 總結 演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每一條指令表示乙個或者多個操作。演算法的特性 輸入...

資料結構第2章學習小結

你對本章內容的小結 完成作業或實踐時解決困難的經驗分享 目前學習過程中存在的困難,待解決或待改進的問題 上次部落格確定的目標達到了嗎?如果沒達到,請分析原因 接下來的目標 1.線性表小結 一 順序表 l.elem new int maxsize if l.elem 退出,申請失敗 l.length ...