如前所述,鏈式思想的陣列表,把需要儲存的額外資訊存放在」左邊結構體「中,資料元素本身存放在」右邊陣列「中。
這樣解決了單純陣列表的一些缺陷,又最大化的保留其優點,但依然沒有解決增加或刪除元素效率較差的問題。
鏈式陣列表根據「右邊陣列」的構成,又可以細分為兩種分支。
第一種是右邊陣列大小固定,適用於提前預知資料元素的多少,並且無需擔憂記憶體洩漏。
第二種是右邊陣列大小動態調整,適用於無法提前預知資料元素的多少,但因為需要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線性表的應用 線性表的邏輯特性 只有乙個表頭元素,只有乙個表尾元素,表頭元素沒有前驅,表尾元素沒有後繼元素,其...