咱們如何把現實中大量複雜的數據保存到主存儲器(內存)中呢?爲了解決這個問題,咱們出了數據結構的學科,專門研究----個體的存儲+個體關係的存儲。因此當咱們要解決問題時,首先要先解決的是如何把這些問題轉換成數據,先保存到咱們的主存中。java
什麼是線性結構呢? 就是把全部的結點用一根直線穿起來算法
線性結構主要分爲2種數組
連續存儲【數組】數據結構
元素類型相同,大小相等(數組傳參,只有傳進去首地址和長度就行)spa
數組的優缺點操作系統
存取速度快指針
事先必須知道數組的長度code
插入刪除元素很慢blog
空間一般是有限制的排序
須要大塊連續的存儲塊
插入刪除元素的效率很低
離散存儲【鏈表】
定義:
咱們來看個數組和鏈表排序的僞代碼
//數組排序 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++則不會,因此要手動釋放,不然會引發內存泄露。
感謝你看完這篇文章,有什麼不對的地方歡迎指出,謝謝🙏