C 線性表的順序存儲實現及插入、刪除等操作示例

一、線性表的定義

線性表(Linear List)是由同一類型元素構成的有序序列的線性結構。線性表中元素的個數稱爲線性表的長度;線性表內沒有元素(長度爲0)時,稱爲空表;表的起始位置稱爲表頭,表的結束位置稱爲表尾。

線性表的抽象數據類型描述爲:

類型名稱:線性表(List)

數據對象集:線性表是由n個元素構成的有序序列(a1到an),其中a1是表的第一個元素(表頭),an是表的最後一個元素(表尾)。ai+1稱爲ai的直接後繼,ai稱爲ai+1的直接前驅,直接後繼和直接前驅反映了元素之間一對一的鄰接邏輯關係。

操作集:對於一個具體的線性表L,其內部有表示位序的整數i以及和其對應的元素x。

二、線性表的順序存儲實現

線性表的順序存儲是指在內存中用地址連續的一塊存儲空間順序存放線性表的各元素。在程序設計語言中,一維數組在內存中佔用的存儲空間就是一組連續的存儲區域,因此,用一維數組來表示順序存儲的數據區域是再適合不過了。

考慮到線性表的操作有插入、刪除等,及表的長度是動態可變的,因此,數組的容量需設計得足夠大。假設用Data[MAXSIZE]表示,其中MAXSIZE是一個根據實際問題定義的足夠大的整數,線性表中的數據從Data[0]開始順序存放。由於當前線性表中的實際元素可能未達到MAXSIZE多個,因此需要用一個變量Last來記錄當前線性表中最後一個元素在數組中的位置。即Last起一個指針(實際是數組下標)的作用,始終指向線性表的最後一個元素。表空時Last = -1。

如下圖所示,若當前表長爲Last +1,數據元素a0,a1......an分別存儲在Data[0]到Data[Last]之間。

typedef struct LNode* List;
struct LNode
{
	int Data[20];
	int lastPosition;//最後一個元素下標值
};

 

三、線性表的基本操作

3.1 List MakeEmpty():初始化一個新的空線性表

//創建線性表並初始化爲空
List MakeEmpty()
{
	List L;
	L = (List)malloc(sizeof(struct LNode));//申請內存空間
	L->lastPosition = -1;//lastPosition置爲-1,說明表空
	return L;
}

3.2 int FindKth(List L, int P):根據制定的位序P,返回L中相應的元素

//返回指定位置的元素值
int FindKth(List L, int P)
{
	if (P > L->lastPosition)
		return -1;
	else
		return L->Data[P];
}

3.3 int Find(List L, int X):返回L中第一個X元素的下標值

//尋找線性表中第一個X的下標
int Find(List L, int X)
{
	for (int i = 0; i <= L->lastPosition+1; i++)
	{
		if (i == L->lastPosition+1)
			return -1;//未找到
		else if (L->Data[i] == X)
			return i;//返回對應下標
	}
}

3.4 bool Insert(List L, int P, int X):在L中下標爲P的位置插入X

插入元素時,先將線性表長度向後擴展1個元素長,之後將要插入位置及其後面的所有元素均向後移動一位,空出位置後再將新元素插入。

//在下標爲P的位置插入X
bool Insert(List L, int P, int X)
{
	if (L->lastPosition == 20 || P > L->lastPosition)//如果線性表已滿或所插位置不在線性表內,返回false
		return false;
	L->lastPosition++;//若能插入,線性表長度加1
	//從P位置到最後,所有元素均向後移一位
	for (int i = L->lastPosition; i > P; i--)
	{
		L->Data[i] = L->Data[i-1];
	}
	L->Data[P] = X;//在空出的P位置插入新的元素
	return true;
}

3.5 bool Delete(List L, int P):刪除L中下標爲P的元素

將相應位置元素刪除後,原來在其後面的元素均向前移動一位,空出最後一個位置,最後將線性表長度減去1個元素長,刪去線性表空餘的位置。

//刪除下標爲P的元素
bool Delete(List L, int P)
{
	if (P > L->lastPosition)//如果所刪元素位置不在線性表內,返回false
		return false;
	//將位置P後的元素均向前移一位
	for (int i = P; i < L->lastPosition; i++)
	{
		L->Data[i] = L->Data[i + 1];
	}
	L->lastPosition--;//成功刪除原位置爲P的元素,線性表長度減1
	return true;
}

3.6 int Length(List L):返回線性表L長度

//返回線性表L長度
int Length(List L)
{
	return L->lastPosition + 1;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章