數據結構中的線性表用於表示及處理相同類型的數據,比如整數、小數、金錢、體重...,方便對同類型數據進行處理。其代碼實現可以通過數組實現,也可以通過鏈表實現。現分別從數組、鏈表實現視角分析優勢,便於在實際編程時選擇合適的方式實現線性表。
目錄
- 視角1:應選擇數組存儲線性表類型數據
- 視角2:應選擇鏈表存儲線性表類型數據
- 本文代碼下載鏈接
- 參考資料
視角1:應選擇數組存儲線性表類型數據
- 使用數組更安全
- 使用數組的存儲密度更高
- 使用數組訪問數據元素更快
分析過程如下
1.使用數組更安全
數組定義後可能存放於程序的BSS段(未分配內存)、靜態數據區(全局變量程序整體結束後系統釋放)、或棧空間(作用域結束後編譯器釋放)中,均不需要編程人員考慮內存的分配和釋放,不會出現申請忘記釋放導致內存泄漏問題。
數組實現:不用考慮內存申請/釋放
//數組方式實現線性表
typedef struct
{
int stuNum;
int stuWeight;
} Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];//數據區域(數組)
int last;// 最後一個元素的位置
}LNODE;
鏈表實現:需使用malloc/free申請釋放內存
//鏈表方式實現線性表
typedef struct
{
int stuNum;
int stuWeight;
} ElemType;
/*鏈表的結點的數據結構 */
typedef struct Lnode
{
ElemType student; //爲求簡便數據域僅置一項
struct Lnode *next;
}LNode,*LinkList; // *LinkList L 定義鏈表頭指針
/*鏈表的初始構建函數*/
void InitList()
{
L = (LN)malloc(LEN);
if (L == NULL)
{
printf("[InitList]malloc error!\n");
exit(0);
}
L->student.stuNum = 0;
L->student.stuWeight = 0;
L->next=NULL;
}
/*鏈表的清空涵數*/
void ClearList()
{
LinkList p;
while (L->next)
{
p = L->next;
L->next = p->next;
free(p);
}
}
所以使用數組實現線性表不存在編程時忘記釋放內存,導致內存泄漏的風險。
2.使用數組的存儲密度更高
使用數組的存儲密度更高。數組通過數組下標即可訪問數據內容,而鏈表需要額外的指針索引指向下一個元素所在的位置,拉低了數據結構的存儲密度。
截圖1:數組實現的線性表大小
圖2:鏈表實現的線性表大小
存儲密度=(存放數據所佔空間/總空間)
數組實現的線性表存儲密度:8000/8004=99.9%;
鏈表實現的線性表存儲密度:8000/12000=66.6%。
(Tips:本次實現的線性表數據長度爲1000)
所以數組用於存儲數據的部分佔比更大,沒有額外的存儲空間消耗,內存實際數據的利用率更高。
3.使用數組訪問數據元素更快
截圖3:程序效果_遍歷訪問
1000個元素,遍歷訪問10000次,結果發現數組線性表耗時137ms,鏈表線性表耗時15209ms。
所以在需要大量讀取數據元素的場景,數組實現的線性表更快,效率更高。
綜上所述:想要更安全、存儲密度更高、讀取更快地使用線性表類型的數據,請使用數組。
視角2:應選擇鏈表存儲線性表類型數據
- 使用鏈表更省空間
- 使用鏈表更容易擴展
- 使用鏈表增加/刪除數據元素更快
分析過程如下
1.使用鏈表更省空間
鏈表不需要預先指定申請空間的大小,可以根據需要申請,不存在浪費的情況。
截圖4:數組實現的線性表大小
舉例來說,數組初始化1000個數據的空間,佔用8004字節,但實際可能只用到了前500個數據,也就是4000字節,那麼後面的4000字節就閒置浪費了;鏈表是需要n個元素就申請n*單個數據所需空間,不存在這種情況。
所以鏈表不會出現內存浪費的情況。
2.使用鏈表更容易擴展
鏈表長度不固定,可以隨時增大或減小,而數據定義之後長度即固定下來無法變化。
截圖5:可擴展性數組
截圖6:可拓展性鏈表
如果數組長度爲1000,那麼當需要存放第1001個數據時,沒有辦法存放,鏈表沒有這個問題。
所以鏈表更具可擴展性。
3.使用鏈表增加/刪除數據元素更快
截圖7:程序效果_遍歷訪問
1000個元素,在第2、3兩個數據中間添加/刪除數據10000次,結果發現數組線性表耗時57ms,鏈表線性表耗時5ms。
所以在需要大量插入/刪除數據元素的場景,鏈表實現的線性表更快,效率更高。
綜上所述:想要更節約、更靈活可擴展、增刪更快地使用線性表類型的數據,請使用鏈表。
代碼鏈接
1.下載鏈接:https://download.csdn.net/download/u013025955/11213983
參考資料
1.數據結構--線性表的順序存儲結構(c語言實現)
https://download.csdn.net/download/qq38960479/10483209
2.數據結構---線性表之單鏈表(C語言)
https://download.csdn.net/download/lulllr/10313658