資料結構 線性表

2021-09-13 22:21:43 字數 4249 閱讀 1690

資料結構在兩年前就學過了但以前都是走馬觀花,現在重拾起來,總結歸納,最後把各種結構和演算法用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...