資料結構和演算法之線性表

2021-10-24 08:30:36 字數 4304 閱讀 8879

因為要準備筆試,要涉及到一些資料結構和演算法基礎。所以準備重新學習和整理下資料結構演算法的的知識。按照但不全按照下圖的思維導圖展開。

定義:元素一條線布局,可以不同,有先後順序。除了第乙個沒有直接前驅,最後乙個沒有直接後繼。其他節點都有直接前驅和後繼。下儲存可分順序儲存和鏈式儲存。

定義:元素放在一塊連續的記憶體區域中,實體地址和邏輯位址一樣。是一種隨機訪問的儲存結構。

操作

(1)定義

typedef

struct

seqlist;

(2)初始化

//初始化順序表

void initlist(seqlist *l)

(3)判斷是否為空

//判斷線性表是否為空,空返回1,否則返回0

intlistempty

(seqlist l)

(4)按序號查詢

//查詢順序表對應位置元素值,若存在賦值給指標變數e

intgetelem

(seqlist l,

int i,datatype *e)

(5)按內容查詢

//查詢線性表中元素值為e的元素

intlocateelem

(seqlist l,datatype e)

(6)插入操作

//在順序表的第i個位置插入元素e,成功返回1,失敗返回-1,順序表滿了返回0

intinsertlist

(seqlist *l,

int i ,datatype e)

//判斷陣列容量是否已滿,已滿返回0

else

if(l-

>length >= listsize)

else

l->list[i-1]

=e ;

//插入元素到i個位置

l->length =l-

>length+1;

return1;

}}

(7)刪除操作

//刪除順序表中的第i個位置的元素e,如果容器為空返回0,位置越界返回-1,成功返回1並將刪除變數由指標變數e帶出

intdeletelist

(seqlist *l,

int i ,datatype *e)

//判斷訪問是否越界,越界返回-1

else

if(i<

1||i>l-length)

else

//更新長度

l->length = l-

>length-1;

return1;

}}

小結:優點:訪問時間複雜度為o(1),操作簡單。易於理解,程式設計師不用太關心指標記憶體,安全。

缺點:增加和刪除元素複雜度為o(n),需要事先分配好記憶體空間,難以適應需求。

定義:元素放在一塊連續或者非連續的的記憶體區域中,實體地址和邏輯不一樣。鏈式節點中有一片用來存資料(資料域)另一片用來存下乙個節點的位址(指標域)。下可分為單鏈,雙鏈表,迴圈單/雙鏈表。

操作:

單鏈表為例,為了方便操作的統一(如在首元節點前插入或則刪除首元節點時),會給鍊錶前面新增乙個資料域無效的頭節點。為了防止節點指標域指向一些非法記憶體區域導致程式執行錯誤甚至是終止,指標域應該賦值為null。

(1)定義

typedef

struct nodelistnode,

*linklist;

(2)初始化單鏈表

//初始化單鏈表為其分配記憶體空間

void

initlist

(linklist *head)

//將單鏈表的頭結點指標域置為空

(*head)

->next =

null

;」

(3)判斷單鏈表是否為空

//判斷單鏈表是否為空,為空返回1,否則返回0

intlistempty

(linklist head)

else

}

(4)按序號在單鏈表中查詢元素

//按序號查詢單鏈表中第i個結點的元素並返回

listnode *

get(linklist head,

int i)

if(i<1)

j =0;

p =head;

while

(p->next !=

null

&& j

if(j==i)

//找到第i個結點

return p;

else

return

null

;}

(5)按內容查詢單鏈表中指定的元素

//按內容查詢單鏈表中元素值為e的元素

listnode *

locateelem

(linklist head,datatype e)

else

}return p;

}

(6)插入操作

//在單鏈表的指定位置插入指定元素

intinsertlist

(linklist head,

int i,datatype e)

if(j!=i-1)

//如果沒找到,插入位置出錯

return0;

//新生乙個結點if(

(p=(listnode*

)malloc

(sizeof

(listnode)))

==null

) p-

>data =e;

//將e賦值給結點的資料域

p->next =pre-

>next;

pre-

>next =p;

return1;

}

(7)刪除操作

//刪除單鏈表的指定位置元素並賦值給指標變數e返回

intdeletelist

(linklist head,

int i,datatype *e)

if(j!=i-1)

//指標p指向單鏈表中的第i個結點,並將該結點資料域值賦值給e

p = pre-

>next;

*e =p-

>data;

//將前驅結點的指標域指向要刪除結點的下乙個結點

pre-

>next =p-

>next;

free

(p);

//釋放p指向的結點

return

1;}

小結:優點:鏈式結構儲存空間靈活,空間既可以連續也可以非連續。插入和刪除操作的時間複雜度為o(1).

缺點:由於要用到指標存在記憶體洩漏和訪問非法空間的風險。查詢操作的時間複雜度為o(n).操作較為複雜。由於有頭節點和指標域的存在,空間利用率也不高。

(1)線性表中的元素之間是一對一的關係,除了第乙個元素元素沒有直接前驅和最後乙個元素沒有直接直接後繼,其他元素都有直接前驅和直接後繼。

(2)線性表有順序儲存和鏈式儲存兩種方式。採用順序儲存結構的線性表成為順序表,採用鏈式儲存結構的線性表成為鍊錶。

(3)順序表中資料元素的邏輯順序與物理順序一致,因此可以隨機訪問。鍊錶是靠指標域表示元素之間的邏輯關係。

(4)鍊錶又分為單鏈表和雙向鍊錶,這兩種鍊錶又可構成單迴圈鍊錶、雙向迴圈鍊錶。單鏈表只有乙個指標域,指標域指向直接後繼結點。雙向鍊錶的乙個指標域指向直接前驅結點,另乙個指標域指向直接後繼結點。

(5)順序表的優點是可以隨機訪問任意乙個元素,演算法實現較為簡單,儲存空間利用率高,缺點是需要預先分配儲存空間,儲存規模不好確定,插入和刪除操作需要移動大量元素。鍊錶的優點是不需要事先確定儲存空間的大小,插入和刪除元素不需要移動大量元素;缺點是只能從第乙個結點開始順序訪問元素,儲存單元利用率不高,演算法實現較複雜,因涉及指標操作,操作不當會產生無法預料的記憶體錯誤。

資料結構和演算法之線性表(C )

線性表的順序儲存結構的特點是,用物理上的鄰接關係表達邏輯上的前驅和後繼,因此可以通過簡單的公式獲取表中的任意元素的位址,但是在插入和刪除過程中需要移動大量元素,同時對儲存空間的利用不是很合理。接下來我用c 的模板式程式設計來實現線性表的基本功能 template typename t class l...

mysql 線性表 資料結構之線性表

概要 參考 大話資料結構 把常用的基本資料結構梳理一下。線性表定義 線性表 list 零個或多個資料元素的有限序列。若將線性表記為 a 1,cdots,a a i,a cdots,a n 則表中 a 領先於 a i a i 領先於 a 稱 a 是 a i 的直接前驅元素,a 是 a i 的直接後繼元...

資料結構 線性表演算法

1.線性表 線性表是n個具有相同特性的資料元素的有限序列。線性表的主要儲存結構 順序儲存結構 順序表 鏈式儲存結構 鍊錶 2.順序儲存 儲存空間連續,用一組連續的儲存單元依次存放資料元素 即邏輯上相鄰的元素,其物理位置也相鄰。優點 隨機訪問 缺點 插入刪除結點困難 擴充套件不靈活 3.鏈式儲存 儲存...