(優缺點文字部分**:
順序表和煉表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...