資料結構與演算法 02線性表 01

2021-07-26 02:38:17 字數 3710 閱讀 6684

一、線性表的定義

線性表(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.鏈式儲存 儲存...