資料結構 線性表詳解(一)

2021-08-15 18:00:51 字數 4881 閱讀 1745

1、前言

線性表是最常用且是最簡單的一種資料結構。形如:a1、a2、a3….an這樣含有有限的資料序列,我們就稱之為線性表。

2、線性表的兩種表示形式

順序表示(其實就是陣列)

鍊錶表示

3、線性表一般操作的介紹

線性表一般包含如下幾種操作:

線性表的操作包括如下幾種

(1) initlist(& l)

//構造乙個空的線性表

(2) destroylist(& l)

//線性表存在了,消耗乙個線性表

(3) clearlist(&l )

//清空線性表中的內容

(4) listempty(l)

//判斷線性表是否為空

(5) listlength(l)

//返回線性表的長度

(6) getelem(l,i,& e)

//返回線性表i位置上的元素值,通過e返回

(7) priorelem(l,cur_e,&pre_e)

//如果cur_e是線性表中的元素,而且不是第乙個,那麼我們就可以返回該元素前乙個元素的值

(8) nextelem(l,cur_e,&next_e)

//如果cur_e是線性表中的元素,而且不是最後乙個,就返回它下乙個元素的值

(9) listinsert(&l,i,e)

//如果線性表存在了,而且i符合條件,則在i位置插入乙個元素

(10)listdelete(&l,i)

//刪除i位置上的元素

(11) listdelete_data(&l,e,order)

//刪除指定的元素e,order決定是刪除乙個,還是全部。

(12) connect_two_list(l_a,l_b,& l_c)

//連線兩個線性表,除去重複的內容

(13)print(l)

//列印線性表

4、線性表的順序表示實現–表示的格式

我們在之後的那些操作的實現中,我們都是一直使用這些內容,作為我們通過線性表順序結構表示實現線性表操作的一些基礎。

//擴充容量的步伐

#define sizestep 10

//開始的容量的大小

#define startsize 100

//為了便於擴充套件,我們這裡使用型別別名,

//我們使用最簡單的int型作為乙個範例

typedef int elemtype;

struct list ;

5、線性表順序表示實現–initlist函式

因為順序表示就是對陣列進行一些操作,我們在第四點已經給出了我們順序表示線性表的乙個結構體,我們要建立乙個空表(沒有元素的表),我們就是讓表的長度為0,另外,還要對data進行堆記憶體的分配和初始容量的初始化。

//建立乙個空的線性表

void initlist(list

& newlist)

6、線性表順序表示實現–destroylist函式

//線性表存在了,現在要銷毀線性表

void

destroylist(list & newlist)

7、線性表順序表示實現–clearlist函式

//線性表存在了,但是現在想清空整個線性表

void clearlist(list & newlist)

8、線性表順序表示實現–listempty函式

//判讀線性表是否為空

bool listempty(list newlist)

9、線性表順序表示實現–listlength函式

//返回線性表的長度

int listlength(list newlist)

10、線性表順序表示實現–getelem函式

//返回線性表上某個位置上的元素的值,記住我們的位置是從1開始計算的。

void getelem(list newlist, int i, elemtype &e)

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

e = newlist.data[i - 1];

}

我們需要考慮這個函式的時間複雜度:因為我們是通過下標進行查詢對應的元素的,所以它是時間複雜度為:o(1),這個和我們後邊說的鏈式結構的查詢比起來,是佔了很大優勢的

11、線性表順序表示實現–priorelem函式

//判讀元素的位置的函式

//我們這裡直接返回該元素的下標

int locationelem(list newlist, elemtype e)

}return -1;

}這個函式的時間複雜為:假定我們有n個元素,那麼它的查詢時間複雜為o(n),但是因為我們使用的是順序結構,所以我們可以很方便的使用其他可以減低時間複雜的查詢演算法,例如二分查詢,它的時間複雜度為:o(logn)

//獲取前驅的元素

void priorelem(list newlist, elemtype cur_e, elemtype & pre_e)

if (location == 0)

pre_e = newlist.data[location - 1];

}

這個函式的時間複雜主要是受locationelem函式的影響, 

12、線性表順序表示實現–nextelem函式

這個函式和前面的函式是一樣的,我們只要修改乙個位置的引數就可以了,那就是判斷第乙個元素的變為判斷最後乙個元素

//獲取後驅元素

void nextelem(list newlist, elemtype cur_e, elemtype & next_e)

if (location == newlist.length-1)

next_e = newlist.data[location - 1];

}

這個函式的時間複雜為 

13、線性表順序表示實現–listinsert函式

//向線性表中插入乙個元素,這裡我們需要判斷插入位置是否合法

//除此之外,我們還需要檢測元素的容量是否已經到達了最大值

void listinsert(list & newlist, int i, elemtype e)

int j = 0;

//此時達到了線性表的最大容量,我們需要重新為線性表分配新的記憶體。

if (newlist.length == newlist.size)

//擴大容量

newlist.size += sizestep;

delete newlist.data;

//重新分配記憶體

newlist.data = new elemtype[newlist.size];

//恢復之前內容

for (j = 0; j < newlist.length; j++)

}//插入內容

for (int k = newlist.length; k >i-1; k-- )

newlist.data[i - 1] = e;

++newlist.length;

}

線性表的順序結構表示的時候,它的最大的缺點就是在插入和刪除的時候,需要移動大量的元素,此時,我們插入乙個元素的時間複雜為:o(n),時間複雜度雖然是線性的,但是由於它需要移動大量的元素,這也就早造成了它的時間效率的比較低的 

14、線性表順序表示實現–listdelete函式

//線性表刪除乙個元素,我們需要判斷刪除的位置是否合法

void listdelete(list & newlist, int i)

for (int j = i - 1; j < newlist.length; j++)

--newlist.length;

}

線性表的刪除和插入是差不多的意思,都是要對陣列中的元素進行移動。 

15、線性表順序表示實現–listdelete_data函式

//按照元素的值,來刪除對應元素的內容,

//這個時候我們通過傳個引數,來決定我們是刪除第乙個該元素,

//0,刪除乙個,1,刪除所有

//還是把所有的元素都給刪除了

//如果不存在該元素,就直接返回

void listdelete_data(list & newlist, elemtype e,int

order) }}

if(flag==1)

return ;

<< endl;

}

16、線性表順序結構表示實現–connect_two_list函式

當我們要進行兩個線性表的鏈結的時候,我們最好是希望這兩個鍊錶是有序的。

//連線兩個線性表

void

connect_two_list(list a, list b, list & c)

else

if(a.data[i] > b.data[j]) c.data[k++] = b.data[j++];

else

}while (i <= a.length - 1)

while (j <= b.length - 1)

}

我們通過分析我們連線函式的**,我們可以發現,我們將兩個元素組合在一起的時候的時間複雜為o(a.lenght+b.lenght).

17、線性表順序結構表示實現–print函式

void print(list & l) 

cout

<< endl;

}

資料結構 線性表(一)

我們在學習c語言的時候都用過陣列,再學深一點大概會學到結構體,鍊錶之類的。正常情況下,對於這一類的資料結構,我們都能看到他們的共同點。每乙個資料項之間都只跟另乙個資料項鏈結,所以我們把這一類的資料結構叫做線性表。不考慮實際記憶體位址的分配,從邏輯意義上看,我們可以把資料項都連起來,形成乙個像表一樣的...

資料結構(線性表)

1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...

資料結構 線性表

參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...