資料結構在兩年前就學過了但以前都是走馬觀花,現在重拾起來,總結歸納,最後把各種結構和演算法用c重寫一遍。
adt 線性表(list)
data
在資料元素的非空有限集中,存在唯一乙個首元素(有唯一的後繼)和唯一乙個末尾元素(有唯一的前驅),其他中間元素(有唯一前驅和後繼)。資料元素之間的關係是一對一的關係。
operation
initlist
(*l)
:初始化操作,建立乙個空的線性表。
destrylist
(*l)
;銷毀線性表
clearlist
(*l)
:線性表清空。
listempty
(l):若線性表為空,返回true,否則返回false。
listlength
(l):返回線性表l的元素個數。
getelem
(l,i,
*e):將線性表l中第i個位置元素返回給e。
locateelem
(l,e)
priorelem
(l,cur_e,
&pre_e)
;若cur_e是l的元素且不是第乙個元素則用per_e返回它的前驅
nextelem
(l,cur_e,
&next_e)
;若cur_e是l的元素,且不是最後乙個元素,則用next_e返回它的後繼
listinsert
(*l,i,e)
listdelete
(*l,i,
*e):刪除線性表l中的第i個元素,並用e返回其值
listtranverse
(l,visit()
);依次對l的每個元素呼叫函式visit
(),一旦失敗則操作失敗
優點:
無需為表中元素之間的邏輯關係增加額外的儲存空間,可以快速讀取表中的某個位置的元素,時間複雜度o(1)。
缺點:插入和刪除需要移動大量的元素,當線性表的變化很大時候,很難確定線性表的儲存空間。容易造成儲存空間的碎片化
用一組連續位址空間依次儲存線性表的資料元素。
typedef
struct s_list
s_list;
第a個元素和第a+1個元素位址關係: loc(a+1)=loc(a)+sizeof(elemtpye );
第a個元素和第1個元素位址關係: loc(a)=loc(1)+sizeof(elemtpye )*(i-1);
#include
#define maxsize 100
#if maxsize<=0 || maxsize>100
#error error maxsize
#endif
typedef
int elemtpye;
typedef
struct s_list
s_list;
typedef
enum myenum
result;
/*@breaf 建立乙個空的線性表
@param 線性表指標
@return result
*/result initlist
(s_list *l)
/*@breaf 銷毀線性表
@param l[in]線性表指標
@return result
*/result destrylist
(s_list *l)
/*@breaf 清空線性表
@param l[in]線性表指標
@return result
*/result clearlist
(s_list *l)
/*
@breaf 判斷線性表是否為空
@param l[in]線性表
@return result
*/result listempty
(s_list l)
/*@breaf 獲得線性表長度
@param l[in]線性表
@return 線性表長度
*/int
listlength
(s_list l)
/*@breaf 將線性表l中的第i個位置元素返回給e
@param l[in]線性表
@param i[in]位置
@param e[out]查詢的元素
*/result getelem
(s_list l,
int i,
int*e)
/*@param l[in]線性表
@param e[in]查詢的元素
@return 序列號,-1為失敗
*/
int
locateelem
(s_list l, elemtpye e)
return-1
;}/*@breaf 若cur_e是l的元素且不是第乙個元素則用per_e返回它的前驅
@param l[in]線性表
@param cur_e[in]查詢的元素
@param pre_e[out]返回前驅的元素
@return result
*/result priorelem
(s_list l, elemtpye cur_e, elemtpye *pre_e)
/*@breaf 若cur_e是l的元素且不是最後乙個元素則用per_e返回它的後繼
@param l[in]線性表
@param cur_e[in]查詢的元素
@param pre_e[out]返回後繼的元素
@return result
*/result nextelem
(s_list l, elemtpye cur_e, elemtpye *pre_e)
/*
@param l[in]線性表
@param i[in]序列號
@param e[in]插入的元素
@return result
*/result listinsert
(s_list *l,
int i, elemtpye e)
l->data[i -1]
= e;
/* 將新元素插入 */
l->length++
;return ok;}/*
@breaf 刪除線性表l中的第i個元素,並用e返回其值
@param l[in]線性表
@param i[in]序列號
@param e[out]刪除的元素
@return result
*/result listdelete
(s_list *l,
int i, elemtpye *e)
l->length--
;return ok;}/*
@breaf 依次對l的每個元素呼叫函式visit(),一旦失敗則操作失敗
@param l[in]線性表
@param visit[in]需要操作的函式指標
@return result
*/result listtranverse
(s_list l,
result
(* visit)
(elemtpye e)
)return ok;
}
動態分配
使用堆區動態分配線性表
typedef
struct a_list
a_list;
/*@breaf 建立乙個空的線性表
@param 線性表指標
@return result
*/result initlist
(a_list *l)
。。。。。。。。
1,插入乙個元素所需移動元素次數: n/2
2,刪除乙個元素所需移動元素次數:(n-1)/2
3,對於兩個無序線性表合併,其時間複雜度為o(a.length * b.length)
4,對於兩個有序線性表合併,其時間複雜度為o(a.length + b.length)
5,查詢時間複雜度o(1)
6,插入刪除的時間複雜度o(n)
資料結構(線性表)
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...
資料結構 線性表
線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...