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...