數據結構之線性表(上)

線性表

線性表是最常用且最簡單的一種數據結構。簡而言之,一個線性表是n個數據元素的有限序列。同一線性表中的元素必定具有相同特性。

  • 除第一個元素外,每一個元素有且僅有一個直接前驅;除最後一個元素外,每個元素有且僅有一個直接後繼。
  • 表中元素的個數有限。
  • 表中元素具有邏輯上的順序性。
  • 表中元素的數據類型都相同,意味着每個元素佔有相同大小的存儲空間。

線性表的基本操作:

  • InitList(&L):初始化表。構造一個空的線性表。
  • Length(L):求表長。返回線性表L的長度,即L中數據元素的個數。
  • LocateElem(L,e):按查找操作。在線性表L中查找具有給定關鍵字值e的元素。
  • GetElem(L,i):按查找操作。獲取表L中第i個位置的元素的值。
  • ListInsert(&L,i,e):插入操作。在表L中的第i個位置上插入指定的元素e。
  • ListDelete(&L,i,&e):刪除操作。刪除表L中第i個位置的元素,並用e返回刪除元素的值。
  • PrintList(L):輸出操作。按前後順序輸出線性表L的所有元素值。
  • Empty(L):判空操作。若L爲空表,則返回true,否則返回false。
  • DestroyList(&L):銷燬操作。銷燬線性表,並釋放線性表L所佔用的內存空間。

 

根據存儲結構的不同,線性表可以分爲順序表和鏈表。

線性表的順序存儲--順序表:

  順序表是用一組地址連續的存儲單元依次存儲線性表中的數據元素,從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰。所以順序表的特點是表中元素的邏輯順序與其物理順序相同。

*** 線性表的元素位序是從1開始的,而數組的下標是從0開始的。***

  • 順序表最主要的特點是隨機訪問。即通過首地址和元素序號可在時間O(1)內找到指定的元素。
  • 順序表邏輯上相鄰的元素物理上也相鄰,這樣導致了 插入和刪除操作需要移動大量元素。

插入操作:

//插入操作 在表L中的第i個位置插入元素e
bool ListInsert(Sqlist& L, int i, ElemType e) {
	if (i<1 || i>L.length+1)   //判斷i的值是否超出表
	{
		cout << "error operation!" << endl;
		return false;
	}
	if (L.length >= MaxSize)   //判斷存儲空間是否已滿(用在靜態分配的情況下)
	{
		cout << "error operation!" << endl;
		return false;
	}
	for (int j = L.length; j >=i; j--)
	{
		L.elem[j] = L.elem[j-1]; //把第i個位置往後的元素再往後移動一位,爲插入的元素騰出一個位置
	}
	L.elem[i - 1] = e; //將元素e插入到第i個位置
	L.length++; //表長度加1
	return true;
}

最好情況:在表尾插入,元素後移語句將不執行,時間複雜度爲O(1);

最壞情況:在表頭插入,整個表的元素全部後移一個單位,時間複雜度爲O(n);

平均時間複雜度:O(n);

 

刪除操作:

//刪除操作 刪除表中第i個位置的元素,並用e返回並刪除的元素
bool ListDelete(Sqlist& L, int i, ElemType& e) {
	if (i<1 || i>L.length) //判斷i的範圍是否合法(注意和插入操作的範圍進行比較)
	{
		cout << "error operation!" << endl;
		return false;
	}
	e = L.elem[i - 1];//把即將被刪除的第i個位置的元素賦值給e
	for (int j = i; j < L.length; j++) //將第i個位置後的元素前移
	{
		L.elem[j - 1] = L.elem[j];
	}
	L.length--; //表長度減1
	return true;
}

最好情況:刪除表尾元素,元素後移語句將不執行,時間複雜度爲O(1);

最壞情況:刪除表頭元素,整個表的元素全部向前移一個單位,時間複雜度爲O(n);

平均時間複雜度:O(n);

 

 

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