資料結構 順序表 單鏈表的 比較 總結

2021-08-08 09:03:00 字數 3828 閱讀 8752

(優缺點文字部分**:

順序表和煉表de優缺點

順序表的優點

方法簡單,各種高階語言中都有陣列,容易實現。

不用為表示結點間的邏輯關係而增加額外的儲存開銷(鍊錶要增加額外的指標域)。

順序表具有按元素序號隨機訪問的特點。

缺點在順序表中做插入刪除操作時,平均移動大約表中一般的元素,因此對n較大的順序表效率低。

需要預先分配足夠大的儲存空間,估計過大,可能會導致順序表後部大量閒置;預先分配過小,又會造成溢位。

鍊錶的優缺點恰好和順序表相反。

鍊錶和順序表的插入、刪除操作時間複雜度o(n)是兩個不同的概念,鍊錶o(n)主要是花費在查詢上,順序表o(n)主要花費在移動元素上,兩者沒有可比性。

在實際中應怎樣選擇儲存結構?

1. 基於儲存的考慮

順序表在程式執行之前必須明確規定它的儲存規模,也就是說事先對「maxsize」要有合適的設定,過大造成浪費,過小造成溢位。可見對線性表的長度或儲存規模難以估計時,不宜採用順序表;

鍊錶不用事先估計儲存規模但鍊錶的儲存密度較低,順序儲存結構儲存密度是1,鏈式儲存結構的儲存密度是小於1的。

2. 基於運算的考慮

在順序表中按序號訪問ai的時間效能是o(1),而鍊錶中按序號訪問的時間效能是o(n),所以如果經常做的運算是按序號訪問資料元素,顯然順序表優於鍊錶;而在循序表中做插入、刪除操作時平均移動表中一半的元素,當資料元素的資訊量較大且表較長時,這一點是不應忽視的;在鍊錶中做插入、刪除,雖然也要找插入位置,但操作主要是比較操作,從這個角度考慮顯然鍊錶優於順序表。

3. 基於環境的考慮

順序表容易實現,任何高階語言中都有陣列型別,鍊錶的操作是基於指標的,相對來講前者簡單些。

總之,順序表和煉表沒有絕對的優劣之分,兩種儲存結構各有長短,關鍵看你看重什麼,也就是要依據實際問題中的主要因素而定。通常「較穩定」的線性表選擇順序儲存,而頻繁做插入刪除操作的,即動態性較強的線性表適合用鏈式儲存。

下面是對順序表、單鏈表的初始化、插入、尋找、刪除、銷毀、輸出等的比較。

c版:

#include 

#include

#define error 0

#define ok 1

#define overflow 2

#define underflow 3

#define notpresent 4

#define duplicate 5

typedef

int status;

typedef

int elemtype;

typedef

struct node node;

typedef

struct seqlist;

typedef

struct singlelist;

typedef

struct headerlist;

/*----------------init()----------------*/

status init(seqlist* l, int msize)

status init(singlelist* singlelist)

status init(headerlist* h)//因為要附加表頭結點,故需為其開闢空間

status init(node* node)

/*----------------find()----------------*/

status find(headerlist h, int i, elemtype* x)

*x = p->val;

return ok;

}status find(singlelist l, int i, elemtype* x)

status find(seqlist l, int i, elemtype* x)

/*----------------insert()----------------*/

status insert(headerlist* h, int i, elemtype x)

//pnext = (node*)malloc(sizeof(node));

pnext = new node;

pnext->val = x;

pnext->link = pcur->link;

pcur->link = pnext;

h->n++;

return ok;

}status insert(singlelist* l, int i, elemtype x)

//建立要插入的結點(申請記憶體空間)

pnext = (node*)malloc(sizeof(node));//複製x值到新node,需要先為其開闢空間。

pnext->val = x;

//插入鍊錶

if (i > -1)

else

l->n++;

return ok;

}status insert(seqlist* l, int i,elemtype x)

l->val[i + 1] = x;

l->n++;

return ok;

}/*----------------delete()----------------*/

status delete(headerlist* h, int i)

pcur = ppre->link;

ppre->link = pcur->link;

free(pcur);

h->n--;

return ok;

}status delete(singlelist* l, int i)

if (i == 0) l->first = l->first->link;

else

free(pcur);

l->n--;

return ok;

}status delete(seqlist* l, int i)

l->n--;

return ok;

}/*----------------output()----------------*/

status output(headerlist h)

//version 2 & 3

pcur = h.head->link;//保證了頭結點的val不列印(因為無意義)。注意此處加了link,需先列印元素,再後移pcur

while (pcur)//迴圈條件若為pcur->link,則迴圈結束後,最後乙個元素還需列印

//printf("%d ", pcur->val);//迴圈條件若為pcur->link,為列印出最後乙個元素,需要在迴圈體外加上此句。

printf("\n");

return ok;

}status output(singlelist l)

return ok;

}status output(seqlist l)

return ok;

}status output(node* node)

printf("\n");

return ok;

}status outputnode(node* node)

printf("\n");

return ok;

}/*----------------destory()----------------*/

void destroy(headerlist* h)

}void destroy(singlelist* l)

}void destroy(node* node)

}

資料結構 單鏈表結構與順序儲存的比較

1 順序儲存方式 相當於陣列,是利用一段連續的儲存空間依次來儲存線性表的資料元素。2 單鏈表 採用鏈式儲存結構,每次的儲存是向記憶體申請空間,用一組任意的儲存空間來儲存資料。1 查詢 順序儲存方式 相當於陣列 o 1 可直接取用。單鏈表 o n 每次得遍歷整個鍊錶。2 插入刪除 順序儲存 每次得將前...

資料結構 鍊錶 單鏈表

陣列作為資料儲存結構有一定缺陷。無序陣列搜尋低效,有序陣列插入低效 無論哪種陣列,刪除低效 大小固定,無法所以改變。但是陣列的優勢是通過下標隨機訪問各個資料。鍊錶可以取代陣列作為儲存資料的基礎,比如棧,佇列。鍊錶分類 單鏈表 雙端鍊錶 有序鍊錶 雙向鍊錶 有迭代器的鍊錶 迭代器是用來隨機訪問鍊錶元素...

資料結構 鍊錶(單鏈表)

頭指標與頭結點不同,頭結點即第乙個結點,頭指標是指向第乙個結點的指標。鍊錶中可以沒有頭結點,但不能沒有頭指標。include using namespace std struct node node int d class list void insert int d void print node...