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, inti, 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 ...