第二章 2 4 線性表的第二類 鏈式陣列表

2021-07-23 14:34:19 字數 2730 閱讀 2560

如前所述,鏈式思想的陣列表,把需要儲存的額外資訊存放在」左邊結構體「中,資料元素本身存放在」右邊陣列「中。

這樣解決了單純陣列表的一些缺陷,又最大化的保留其優點,但依然沒有解決增加或刪除元素效率較差的問題。

鏈式陣列表根據「右邊陣列」的構成,又可以細分為兩種分支。

第一種是右邊陣列大小固定,適用於提前預知資料元素的多少,並且無需擔憂記憶體洩漏。

第二種是右邊陣列大小動態調整,適用於無法提前預知資料元素的多少,但因為需要malloc,free實現動態機制,可能造成記憶體洩漏。

為了簡化程式設計模型,假設我們要處理的資料元素為整型,資料**為鍵盤輸入,右邊陣列固定大小。

構造左邊資訊結構體如下:

struct list

構建右邊陣列如下:

int listdate[49];           //固定大小為50個元素
於是我們可以寫出一系列的功能函式。

①可能的初始化initlist()**如下:

struct list l;                      //建立鏈式陣列表l

l.plistdate = listdate; // 陣列名即為首位址

l.curr_length = 0; // 初始化時無任何元素

l.max_length = sizeof(listdate)/sizeof (int); //或者直接寫成50,但修改起來不方便

l.create_time =__time__;

②偽銷毀表destroylist()**如下:

l.plistdate =null;         //偽銷毀
③重置空表clearlist():

l.curr_length =0;           //空表就是沒有任何元素,但表本身存在。
④獲取表中的資訊infolist():

printf("\n");

printf("當前元素%d個\n",l.curr_length);

printf("最大元素容量%d個\n", l.max_length);

printf("資料表建立時間%s\n", l.create_time);

⑤遍歷表中資料visitlist():

if (l.plistdate ==null)

if (l.curr_length ==0)

printf("資料表的內容如下:\n");

for ( i=0; i<= l.curr_length; i++)

return 1;

⑥增添元素insert():

if(l.curr_length==l.max_length)

if (i<1 || i>l.curr_list)

int *p=&(l.plistdate[i-1]); //需要插入的位置

int *q=&(l.plistdate[l.curr_length-1]); //當前最後乙個元素的位置

for (; q>=p; --q)

*(q+1)=*q; //移動元素

*p = e; //插入e值

++l.curr_length; //表長增1

return 1;

因為c語言陣列是以0為位址起始,所以在計算插入位置和最後元素的位置時,需要減1。插入完成後,不要忘記更新資料表資訊,按照類似的思路,可以寫出刪除元素的演算法。

⑦刪除元素delete():

if (i<1 || i>l.curr_list) 

int *p=&(l.plistdate[i-1]); //需要刪除的位置

int *q=&(l.plistdate[l.curr_length-1]); //當前最後乙個元素的位置

for (; p<=q; ++p)

*p=*(p+1); //移動元素

--l.curr_length; //表長減1

return 1;

根據概率學計算,在鏈式陣列表中插入或刪除乙個資料元素,平均需要移動表中約一半的元素,其時間複雜度為o(n)。

除非資料量不大,否則一般不把這種形式用於增減資料。

個人思考:

每一次插入或者刪除都需要移動元素,造成效率低下,如果能夠連續兩次或者三次做插入刪除,之後再彙總進行一次元素移動,能不能提高效率?

畫圖演算了一下,似乎可行,節約了公共的移動部分。

第二章 線性表

定義 線性表簡稱表,是n n 0 個具有相同型別的資料元素的有限序列,線性表中資料元素的個數稱為線性表的長度。長度等於0時稱空表,乙個非空表通常記作 l a1,a2,an 線性表的性質 1.有限性 元素個數有限 2.相同性 元素型別相同 3.順序性 除首位元素外,相鄰元素都有前驅和後繼 2.1.2線...

第二章線性表

2 1線性表的邏輯結構 1 線性表是n 0個具有相同型別的資料元素的有限序列。空表是長度等於零的線性表。2 特性 有限性 相同性 順序型。2 2線性表的順序儲存結構及實現 1 c 中陣列的下標是從0開始的,而線性表中元素的序號是從1開始的。線性表中第i個元素儲存在陣列中下標為i 1的位置。2 順序表...

第二章 線性表

寫在前邊的話寫 好比寫詩,資料結構就好比唐詩三百首,熟讀並默寫這是基本功能,所以要閒的沒事可以在紙上多寫 線性表的定義和基本操作 線性表的實現 2.1順序儲存結構 2.2鏈式儲存結構 2.3線性表的應用 線性表的邏輯特性 只有乙個表頭元素,只有乙個表尾元素,表頭元素沒有前驅,表尾元素沒有後繼元素,其...