因為是線性表,不能只講鍊錶,所以今天提一下靜態鍊錶以及陣列、鍊錶、靜態鍊錶之間的對比。
陣列基本結構沒得說,插入和刪除的操作也是有的(雖然看著不比較詭異)
一般是動態分配乙個足夠長的,記錄有多少個元素後對這個個數進行加減,而不是每插入乙個就動態分配
(其實這樣也行,要是不怕麻煩的話)
另外在插入刪除操作之後要把這個點之後的元素都進行移動,還是相當麻煩的;
不過陣列有乙個好處就是方便找到第幾個元素。
插入刪除的時間複雜度問題和平均移動次數:預設了每乙個結點的查詢概率相同
所以插入乙個結點的概率是1/(n+1) 刪除則是1/n,
而每次插入要移動的個數是n-i+1,刪除移動的個數是n-i,
將概率乘移動次數,i從1到n的求和(插入應該是到n+1),就是時間複雜度了;
同理平均移動次數就是次數的平均數。
對於鍊錶,沒有長度限制的問題,可以放飛自我了
插入刪除很簡單了,修改一下指標就有了,理論上的時間複雜度就是o(1),但是如果是要遍歷查詢某乙個點然後再進行,那就比較煩了,因為鍊錶並不適合進行遍歷操作。
綜上,陣列和鍊錶各有優劣,所以用什麼還是要看自己想幹什麼,是插入刪除多還是查詢遍歷多。
補一點,因為鍊錶是指標連線的方式,所以實體地址不一定是連續的,而陣列在定義的時候一定是連續的物理空間。
至於靜態鍊錶,個人感覺屬於萬金油,可能跟他是兩者之間的過度有關係吧。
(感覺這個東西和後面的樹、圖的鄰接表還是有關係的)
在很久很久以前,有一群傳說中的sh大牛,每當陣列不夠用的時候,他們總能想到辦法代替(霧)
用乙個結構體陣列,只使用一部分區域,剩下的留著呼叫。
每乙個結構體,有乙個資料域,有乙個int型變數,這個就相當於鍊錶的指標,指向 陣列中的位址,也就是陣列元素的下標,如圖,第乙個a[0]作為頭節點,指向a[1] (最後一列的1)a[1]->a[2]->a[3]->null(其實應該是0,就代表了尾節點)
此時的插入刪除操作就不需要malloc和free函式,而是從沒有儲存資料的多餘結點裡面選乙個,賦值&插入;而刪除就是將乙個結點放回沒被利用的空間內部。
(剩下的結點在正常的操作裡面是構成了乙個鍊錶)
陣列模擬鍊錶(靜態鍊錶)
為了模擬鍊錶的操作,設定了乙個date 資料 以及cur 相當於指標域 typedef struct list list s size size為陣列大小 我們用s size 1 cur來起頭指標的作用,指向鍊錶的第乙個元素的下標。因為不能直接malloc出來乙個空間,需要s 0 來儲存乙個空的陣列...
鍊錶學習 靜態鍊錶
struct linknode 鍊錶在指定位置插入與刪除元素不需要移動元素,只需要修改指標即可,而陣列刪除與加入元素則需要移動後面的元素,鍊錶相對於陣列來講,則多了指標域空間開銷,拿到鍊錶第乙個節點就相當於拿到整個鍊錶 鍊錶的分類 靜態鍊錶,動態鍊錶 單向鍊錶,雙向鍊錶,迴圈鍊錶,單向迴圈鍊錶,雙向...
靜態鍊錶和迴圈鍊錶
所謂靜態鍊錶,與指標型描述的鍊錶 動態鍊錶 的區別在於靜態鍊錶借用一維陣列來描述鍊錶.這種儲存型別需要預先分配乙個較大的空間.其結構如下圖 與動態鍊錶操作時最大的區別在於 靜態鍊錶需由使用者自己實現malloc和free函式.為了辨明陣列中哪些分量未被使用,解決的辦法是 將所有未被使用過的以及被刪除...