【價值比較】應選擇數組or鏈表實現線性表數據結構_C語言編程實現

        數據結構中的線性表用於表示及處理相同類型的數據,比如整數、小數、金錢、體重...,方便對同類型數據進行處理。其代碼實現可以通過數組實現,也可以通過鏈表實現。現分別從數組、鏈表實現視角分析優勢,便於在實際編程時選擇合適的方式實現線性表。

目錄

  • 視角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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章