線性表的順序儲存結構 順序表

2021-08-22 13:15:29 字數 4083 閱讀 5752

線性表的順序儲存結構-順序表
一.

在c/c++語言中,借助陣列型別來實現順序表,也就是說,用陣列存放線性表的元素及其邏輯關係,陣列的基本型別就是線性表中元素的的型別,陣列大小(即陣列上界-下界+1)要大於等於線性表的長度,否則該陣列不能存放對應線性表的所有元素。所以當線性表長度小於陣列大小時,該陣列中會有一部分空閒空間。

注意:順序表採用陣列來實現,但不能將任何乙個陣列都當作是乙個順序表,二者的運算是不同的。

2.在定義乙個線性表的順序儲存型別時,需要定義乙個陣列來儲存線線表中的所有元素和定義乙個整型變數來儲存線性表的長度。

假定陣列用data[maxsize]表示,長度整型變數用length表示,並採用結構體型別表示,則元素型別為通用型別識別符號elemtype的線性表的順序儲存型別可描述如下:

typedef struct 

sqlist; //順序表型別

其中data成員存放元素,length成員存放線性表的實際長度。

二.順序表基本運算實現

1.一旦採用順序表儲存結構,我們就可以用c/c++語言實現線性表的各種基本運算。為了方便,假設elemtype為char型別,使用如下自定義型別語句:

typedef

char elemtype;

①.建立順序表

其方法是將給定的含有n個元素的陣列的每個元素依次放入到順序表中,並將n賦給順序表的長度成員。演算法如下: 

void createlist(sqlist *&l,elemtype a,int n)  

//建立順序表

②.順序表基本運算演算法

(1)初始化線性表initlist(l)

該運算的結果是構造乙個空的線性表l。實際上只需將length成員設定為0即可。

void initlist(sqlist *&l)   //引用型指標

本演算法的時間複雜度為o(1)。

(2)銷毀線性表destroylist(l)

該運算的結果是釋放線性表l占用的記憶體空間。

void destroylist(sqlist *&l)

本演算法的時間複雜度為o(1)。

(3)判定是否為空表listempty(l)

bool listempty(sqlist *l)

本演算法的時間複雜度為o(1)。

(4)求線性表的長度listlength(l)

該運算返回順序表l的長度。實際上只需返回length成員的值即可。

int listlength(sqlist *l)

本演算法的時間複雜度為o(1)。

(5)輸出線性表displist(l)

該運算當線性表l不為空時,順序顯示l中各元素的值。

void displist(sqlist *l)

(6)求某個資料元素值getelem(l,i,e)

該運算返回l中第 i(1≤i≤listlength(l))個元素的值,存放在e中。

bool getelem(sqlist *l,int i,elemtype &e)

本演算法的時間複雜度為o(1)。

(7)按元素值查詢locateelem(l,e)

該運算順序查詢第1個值域與e相等的元素的邏輯位序。若這樣的元素不存在,則返回值為0。

int locateelem(sqlist *l, elemtype e)

(8)插入資料元素listinsert(l,i,e)

該運算在順序表l的第i(1≤i≤listlength(l)+1)個位置上插入新的元素e。如果i值不正確,則顯示相應錯誤資訊;否則將順序表原來第i個元素及以後元素均後移乙個位置,移動方向從右向左,如下圖所示,騰出乙個空位置插入新元素,最後順序表長度增1。

bool listinsert(sqlist *&l,int i,elemtype e)

對於本演算法來說,元素移動的次數不僅與表長l.length=n有關,而且與插入位置i有關:當i=n+1時,移動次數為0;當i=1時,移動次數為n,達到最大值。

因此插入演算法的平均時間複雜度為o(n)。

(9)刪除資料元素listdelete(l,i,e)

該運算刪除順序表l的第i(1≤i≤listlength(l))個元素。如果i值不正確,則顯示相應錯誤資訊;否則將線性表第i個元素以後元素均向前移動乙個位置,移動方向為從左向右,如下圖所示,這樣覆蓋了原來的第i個元素,達到刪除該元素的目的,最後順序表長度減1。

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

例:已知長度為n的線性表a採用順序儲存結構,編寫乙個(時間複雜度為o(n)、空間複雜度為o(1)的演算法)該演算法刪除線性表中所有值為x的資料元素。

分析:

如果每刪除乙個值為x的元素都進行移動,其時間複雜度為o(n2),空間複雜度為o(1)。

如果用乙個新的順序表來實現,其時間複雜度為o(n),空間複雜度為o(n)。

解法一:設刪除l中所有值等於x元素後的順序表為l1,顯然l1包含在l中,為此l1重用l的空間。掃瞄順序表l,重建l只包含不等於x的元素。演算法如下:(演算法1:類似於建順序表

void delnode1(sqlist *&l,elemtype x)

l->length=k; //順序表l的長度等於k

}

解法二:用k記錄順序表l中等於x的元素個數,一邊掃瞄l一邊統計k值,並將不為x的元素前移k個位置,最後修改l的長度。演算法如下:

void delnode2(sqlist *&l,elemtype x)

l->length-=k; //順序表l的長度遞減k

}

**:

#include "sqlist.cpp"  

void swap(int &x,int &y) //交換x和y

void move1(sqlist *&l)

swap(l->data[0],l->data[i]); //將l->data[0]和l->data[i]進行交換

}void move2(sqlist *&l)

l->data[i]=pivot;

printf("i=%d\n",i);

}int main()

; createlist(l,a,5);

printf("l:");displist(l);

printf("執行移動運算\n");

move1(l);

printf("l:");displist(l);

destroylist(l);

return 1;

}

例:將整數順序表l中所有奇數移動到偶數的前面

#include "sqlist.cpp"  

void swap(int &x,int &y) //交換x和y

/*解法一*/

void move1(sqlist *&l)

}/*解法二:*/

void move2(sqlist *&l)

}int main()

; createlist(l,a,10);

printf("l:");displist(l);

printf("執行移動運算\n");

move1(l);

printf("l:");displist(l);

destroylist(l);

return

1;}

線性表的順序儲存 線性表的順序儲存結構

1,本文實現乙個線性表 2,順序儲存定義 1,線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表中的資料元素 2,在 c 中可以用乙個陣列作為介質來儲存資料元素 3,設計思路 1,可以用一維陣列實現順序儲存結構 1,儲存空間 t m array 2,當前長度 int m length...

線性表的順序儲存結構 順序表

什麼是線性表?線性表簡稱表,是n n 0 個具有相同型別的資料元素的有限序列,線性表中資料元素的個數稱為線性表的長度,長度為0的表稱為空表。什麼是順序表?線性表的順序儲存結構稱為順序表。順序表是用一段位址連續的儲存單元依次儲存線性表的資料元素,因為線性表中每個元素的型別相同,通常用一維陣列來實現線性...

順序表(線性表的順序儲存結構)

邏輯結構上呈線性分布的資料元素在實際的物理儲存結構中也同樣相互之間緊挨著,這種儲存結構稱為線性表的順序儲存結構。也就是說,邏輯上具有線性關係的資料按照前後的次序全部儲存在一整塊連續的記憶體空間中,之間不存在空隙,這樣的儲存結構稱為順序儲存結構。使用順序儲存結構儲存的資料,第乙個元素所在的位址就是這塊...