鏈表和數組的比較

image

前沿

咱們如何把現實中大量複雜的數據保存到主存儲器(內存)中呢?爲了解決這個問題,咱們出了數據結構的學科,專門研究----個體的存儲+個體關係的存儲。因此當咱們要解決問題時,首先要先解決的是如何把這些問題轉換成數據,先保存到咱們的主存中。java

線性結構

什麼是線性結構呢? 就是把全部的結點用一根直線穿起來算法

線性結構主要分爲2種數組

  • 連續存儲【數組】數據結構

    1. 什麼叫數組?

      元素類型相同,大小相等(數組傳參,只有傳進去首地址和長度就行)spa

    2. 數組的優缺點操作系統

      • 優勢

        存取速度快指針

      • 缺點

        事先必須知道數組的長度code

        插入刪除元素很慢blog

        空間一般是有限制的排序

        須要大塊連續的存儲塊

        插入刪除元素的效率很低

  • 離散存儲【鏈表】

    1. 定義:

      • n個節點離散分配
      • 彼此經過指針相連
      • 每一個節點只有一個前驅節點,每一個節點只有一個後續節點
      • 首節點沒有前驅節點,尾節點沒有後續節點

數組和鏈表的排序

咱們來看個數組和鏈表排序的僞代碼

//數組排序
void sort_arr(struct Arr * pArr)
{
    int i, j, t;
    int len = length_list(pArr);

    for (i=0; i<len-1; ++i)
    {
        for (j=i+1; j<len; ++j)
        {
            if (pArr->pBase[i] > pArr->pBase[j])
            {
                t = pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[j];
                pArr->pBase[j] = t;
            }
        }
    }
}
//鏈表排序
void sort_list(struct Arr * pHead)
{
    int i, j, t;
    int len = length_list(pHead);
    struct Arr * p, q;
    
    for (i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext)
    {
        for (j=i+1,q=p->pNext; j<len; ++j,q=q->pNext)
        {
            if (p->data > q->data)  //等價於  a[i] > a[j]
            {
                t = p->data;//等價於:  t = a[i];
                p->data = q->data; //等價於:  a[i] = a[j];
                q->data = t; //等價於:  a[j] = t;
            }
        }
    }

    return;
}

在咱們看來數組和鏈表的存儲方式是不一樣的

數組能夠有a[++i] 來指向下個元素

鏈表則是 p = p->next 來指向下個元素

但從廣義上來講 算法說與數據的存儲方式無關的,咱們能夠對鏈表進行一個封裝也能夠實現a[++i]指向下個元素的操做。不一樣的存儲方式,達到操做方式是相同的。

動態分配內存

當咱們要建立一個節點的時候,就須要動態來分配內存

int main(void) 
{

    int p;
    int *m = (int*)malloc(100);
}

在代碼中靜態變量p是在棧中分配,有操做系統自動分配和釋放,而 (int*)malloc(100)執行以後將在堆中分配100字節的內存。這個操做系統並不會釋放,必需要手動使用 free() 來釋放內存。java 中變成垃圾內存則會自動釋放,可是C和C++則不會,因此要手動釋放,不然會引發內存泄露。

致謝

感謝你看完這篇文章,有什麼不對的地方歡迎指出,謝謝🙏

相關文章
相關標籤/搜索