一、線性表的定義
線性表(list):由零個或多個資料元素組成的有限序列。
這裡強調幾個關鍵的地方:
首先它是乙個序列,也就是說元素之間有個先來後到的順序。若元素存在多個,則第乙個元素無前驅,最後乙個元素無後繼,其他元素都有且只有乙個前驅與後繼,另外,線性表強調是有限的。
二、抽象資料型別
1.資料型別:指一組性質相同的值的集合以及定義在此集合上的一些操作的總稱。例如整型,浮點型,字元型。
2.抽象:是指取出事物具有的普遍性的本質。他要求抽出問題的特徵而忽略非本質的細節,是對具體事物的一種概括,抽象是一種思考問題的方式。
3.抽象資料型別(abstract data type,adt)是指乙個數學模型及定義再該模型上的一組操作。
描述抽象資料型別的標準格式:
adt 抽象資料型別名
data
資料元素之間邏輯關係的定義
operation
操作endadt
三、線性表的抽象資料型別定義:
adt 線性表(list)
data
線性表的資料物件集合為,每個元素的型別均為datatype。
其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。
資料元素之間的關係是一對一的關係。
operation
initlist(*l): 初始化操作,建立乙個空的線性表l。
listempty(l): 判斷線性表是否為空表,若線性表為空,返回true,否則返回false。
clearlist(*l): 將線性表清空。
getelem(l,i,*e): 將線性表l中的第i個位置元素值返回給e。
listdelete(*l,i,*e): 刪除線性表l中第i個位置元素,並用e返回其值。
listlength(l): 返回線性表l的元素個數。
endad
對於不同的應用,線性表的基本操作時不同的,上述操作是最基本的,對於實際問題中設計的關於線性表的複雜操作,完全可以用這些基本操作的組合來實現。
四、線性表的順序儲存結構
1.線性表的順序儲存結構:
指的是用一段位址連續的儲存單元一次儲存線性表的資料元素。
物理上的儲存方式事實上就是在記憶體中找個初始位址,然後通過佔位的形式,把一定的記憶體空間給佔了,然後把相同資料型別的資料元素依次放在這塊空地中。
2.sqlist
#define maxsize 40
typedef
int elemtype;
typedef
struct
sqlist;
這裡我們封裝了乙個結構,事實上就是對陣列進行封裝,增加了個當前長度的變數罷了。
總結下,順序儲存結構封裝需要三個屬性:
儲存空間的起始位置,陣列data,它的儲存位置就是線性表儲存空間的儲存位置。
線性表的最大儲存容量:陣列的長度maxsize。
線性表的當前長度:length。
注意,陣列的長度與線性表的當前長度需要區分一下:
陣列的長度是存放線性表的儲存空間的總長度,一般初始化後不變。而線性表的當前長度是線性表中元素的個數,是會變化的。
五、獲取元素操作(getelem)
1.獲取元素演算法思路: 實現getelem的具體操作,即將線性表l中的第i個位置元素值返回。
就程式而言非常簡單了,我們只需要把陣列第i-1下標的值返回即可。
2.getelem
#define ok 1;
#define error 0;
typedef int status;
//status 是函式型別,其值是函式結果狀態**,如ok等。
//初始條件:順序線性表l已存在,1 <= i <= listlength(l)
//操作結果:用e返回l中第i個資料元素的值。
status getelem(sqlist l,int i,elemtype *e)
*e = l.data[i-1];
return ok;
}
六、插入操作(listinsert)1.插入演算法的思路:
如果插入位置不合理,丟擲異常;
如果線性表長度大於等於陣列長度,則丟擲異常或動態增加陣列容量;
從最後乙個元素開始向前遍歷到第i個位置,分別將它們都向後移動乙個位置;
將要插入元素填入位置i處;
線性表長度+1
2.listinsert
/*初始條件:順序線性表l已存在,1 <= i <= listlength(l)*/
/*操作結果:在l中第i個位置之前插入新的 資料元素e,l長度+1*/
status listinsert(sqlist *l,int i,elemtype e)
if (i<1||i>l->length+1)//當i不在範圍內時
if(i<=l->length)//若插入資料位置不在表尾
}l->data[i-1] =e;//插入新元素
l->length++;
}
七、刪除操作(listdelete)1.刪除演算法思路
如果刪除位置不合理,丟擲異常;
取出刪除元素;
從刪除元素位置開始遍歷到最後乙個元素位置,分別將它們都向前移動乙個位置;
表長-1。
2.listdelete
status
listdelete(sqlist *l,int i,elemtype e)
if (i<1 || i>l->length)
*e = l->data[i-1];
if(i<=l->length)
}l->length--;
return ok;
}
八、線性表順序儲存結構的優缺點1.時間複雜度:
線性表的順序儲存結構,在存、讀資料時,不管是哪個位置,時間複雜度都是o(1)。而在插入或刪除時,時間複雜度都是o(n)。
這就說明,它比較適合元素個數比較穩定,不經常插入和刪除元素,而更多的操作是訪問資料的應用。
2.優點:
無須為表示表中元素之間的邏輯關係而增加額外的儲存空間。可以快速地訪問表中任意位置的元素。
3.缺點
插入和刪除操作需要移動大量元素。
當線性表長度變化較大時,難以確定儲存空間的容量。容易造成儲存空間的「碎片」。
01 資料結構之線性表
記錄資料結構之線性表的 實現 typedef struct vector vector vector init int n void clear vector v int expand vector v if p null return 0 v data p v size extr size ret...
資料結構與演算法 01 線性表的順序儲存結構
正在學習資料結構與演算法,學習資料是小甲魚的 資料結構和演算法 記錄日誌 main.c include data.h include int main deleteelem l,15,e printf d n e getelem l,10,e printf d n e for j 0 j l len...
資料結構 線性表演算法
1.線性表 線性表是n個具有相同特性的資料元素的有限序列。線性表的主要儲存結構 順序儲存結構 順序表 鏈式儲存結構 鍊錶 2.順序儲存 儲存空間連續,用一組連續的儲存單元依次存放資料元素 即邏輯上相鄰的元素,其物理位置也相鄰。優點 隨機訪問 缺點 插入刪除結點困難 擴充套件不靈活 3.鏈式儲存 儲存...