線性表 順序表

2021-07-11 16:21:48 字數 3008 閱讀 8260

線性結構的特點是:在非空的有限集合中,只有唯一的第乙個元素和唯一的最後乙個元素。第乙個元素沒有直接前驅元素,最後乙個沒有直接的後繼元素。其它元素都有唯一的前驅元素和唯一的後繼元素。

要想將線性表在計算機上實現,必須把其邏輯結構轉化為計算機可識別的儲存結構。線性表的儲存結構主要有兩種:順序儲存結構和鏈式儲存結構。

線性表的順序儲存結構指的是將線性表中的元素存放在一組連續的儲存單元中。這樣的儲存方式使得線性表邏輯上相鄰的元素,其在物理儲存單元中也是相鄰的。採用順序儲存結構的線性表稱為順序表。

假設線性表有n個元素,每個元素占用m個儲存單元,如果第乙個元素的儲存位置為loc(a1),第i個元素的位置為loc(an-1),由於順序表中各元素之間是相鄰的,因此,線性表的第i個元素的儲存位置與第乙個元素a1的儲存位置滿足一下關係:

loc(an)=loc(a1)+(i-1)*m

其中,第乙個元素的位置loc(a1)稱為起始位址或基位址。

順序表反映了線性表中元素的邏輯關係,只要知道第乙個元素的儲存位址,就可以得到線性表中任何元素的儲存位址。同樣,已知任何乙個元素的儲存位址都可以得到其他元素的儲存位址。因此,線性表中的任何乙個元素都可以隨機訪問,線性表的順序儲存結構是一種隨機訪問的儲存結構。

由於在c語言中,陣列可以隨機訪問且陣列中的元素占用連續的儲存空間,因此,我們採用陣列描述線性表的順序儲存結構。線性表的順序儲存結構描述如下:

typedef

int datatype;

typedef

struct

seqlist;

例如,如果要定義乙個變數名為l的結構體,可以定義為seqlist l。如果要定義乙個指向結構體指標的變數,可以定義為seqlist *l。

在順序儲存結構中,線性表的基本運算如下。該演算法的實現儲存在檔案seqlist.h

順序表的初始化就是要把順序表初始化為空的順序表,只需要將順序表的長度length置為0即可:

//順序表的初始化操作

void initlist(seqlist *l) /*將順序表初始化為空*/

順序表為空的標誌就是順序表的長度length為0.

//判斷順序表是否為空,為空返回1,否則返回0

int listempty(seqlist l)

else

}

查詢分為兩種:按序號查詢和按內容查詢。

按序號查詢就是查詢順序表l中的第i個元素,如果找到,將該元素值賦值給e。查詢第i個元素時,首先要判斷要查詢的序號是否合法,如果合法,獲得對應位置的值,並返回1表示查詢成功,否則,返回-1,表示錯誤。

//按序號查詢操作,查詢順序表中的第i個元素

int getelem(seqlist l, int i, datatype *e)

*e = l.list[i - 1]; //將第i個元素賦值為e

return

1;}

按內容查詢就是查詢順序表l中與給定的元素e相等的元素。如果找到,返回該元素在順序表中的序號;如果沒有找到與e相等的元素,則返回-1,表示失敗。

//按內容查詢操作

int locateelem(seqlist l, datatype e)

return -1;

}}

插入操作就是在順序表l中的第i個位置插入新元素e,使順序表變為,順序表的長度也由n變成n-1.

在順序表的第i個元素插入元素e,首先要將第i個位置以後的元素(包括第i個元素)依次向後移動乙個位置,然後將元素e插入到第i個位置。移動元素時要從後往前移動元素,先移動最後乙個元素,在移動倒數第二個元素,依次類推。

插入元素之前,要判斷插入的位置是否合法,順序表是否已滿;在插入元素後,要將表長增加1。

//插入操作。

//在順序表的第i個元素插入元素e,插入成功返回1,

//如果插入位置不合法,返回-1,順序表滿返回0.

int insertlist(seqlist *l, int i, datatype e)

else

if (l->length >= listsize)

else

l->list[i - 1] = e; //插入元素到第i個位置

l->length++;

return

1; }

}

刪除操作就是將順序表l中的第i個位置元素刪除,使順序表變為,順序表的長度也又n變成n-1。

為了刪除第i個元素,需要將第i+1及其後面的元素依次向前移動一位,將前面的元素覆蓋掉。移動元素時要先將第i+1個元素移動到第i個位置,在將第i+2個元素移動到第i+1個位置,依次類推,直到最後乙個元素移動到倒數第二個位置。最後將順序表的長度減1.

在進行刪除操作時,要首先判斷順序表中是否有元素,還要判斷刪除的序號是否合法,刪除成功要將表長減1.

//刪除操作

int deletelist(seqlist *l, int i, datatype *e)

else

if (i<1 || i>l->length)

else

l->length--;

return

1; }

}

刪除操作中函式形參i的合法範圍是1<=i<=l-length時,表示要刪除的是最後乙個元素,對應c語言陣列中的最後乙個元素。

線性表的長度就是順序表中的元素個數,只需要返回順序表l的length域值。

//返回順序表的長度操作。

int listlength(seqlist l)

順序表的清空操作就是將順序表中的元素刪除。要刪除順序表中的所有元素,只需要將順序表的長度置為0即可。

//清空操作

void clearlist(seqlist *l)

線性表 順序表

1 線性表 線性表是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表的邏輯結構簡單,便於實現和操作。因此,線性表這種資料結構在實際應用中是廣泛採用的一種資料結構。線性表 list,零個或多個資料...

線性表 順序表

基本思想 用一段位址連續的儲存單元一次儲存線性表的資料元素 隨機訪問 注意事項 c 語言中陣列下標是從0開始的,而線性表中元素序號是從1開始的,也就是說 線性表中第i個元素儲存結構在陣列中下標為i 1的位置。首先是大體的函式宣告 const int maxsize 100 根據實際問題定義具體的大小...

線性表 順序表

線性表的adt list.h templateclass list 順序表的事先宣告 沒有定義成內嵌的順序表成員函式的實現 alist.h include stdafx.h include list.h define defaultlistsize 255 template class alist ...