C語言用堆和雙向鍊錶實現可變長度陣列

2021-06-11 18:54:24 字數 729 閱讀 7182

最近,我在研究網路程式,突然發現c語言原生資料的乙個很要命的問題——必須提前宣告使用記憶體的長度。

當然,c語言的這種要求是符合情理的,畢竟只有定長的變數才能放在函式的棧中。

可是網路上的資料一般不具有預知性,有時很大上百m,有時很小,可能也就幾個位元組。

於是,我想怎麼樣才能像其他語言那樣實現對資料的不限長度的訪問呢?

首先應該使用malloc函式把資料放在堆中。但是問題又來了。

malloc也是需要可以大小的。

於是,我陷入的困惑。終於,想到了大學期間學到的一門無聊的課程——《資料結構》。

先給這個可變長度的陣列起個名字:unfix array,簡稱ufa。

ufa應該包含指向第乙個ufa_entity和最後乙個ufa_entity的指標,最好還有乙個指向當前ufa_entity的指標。

每個ufa_entity應該包含前向和後向的指標,還要有乙個指向資料的指標。

這樣就成了下面這張圖:

用c語言來寫就是:

struct ufa_entity

;struct ufa_unfixarray

;

然後就是一些常用的功能函式,用來實現諸如初始化、新增、定位、插入、輸出、刪除、完全釋放等具體的功能。

鑑於谷歌被wall了,現在放在國內。

用c 實現單向鍊錶和雙向鍊錶

鍊錶是一種非常基礎的資料結構,本身也比較靈活,突破了陣列在一開始就要確定長度的限制,能夠做到隨時使用隨時分配記憶體。同時還有新增,刪除,查詢等功能。總的來說,鍊錶是由幾個模組構成的。一,單向鍊錶 鍊錶基本元素 struct node 建立節點 node current nullptr node he...

雙向鍊錶C語言實現

ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...

C語言方式實現雙向鍊錶

太久不看資料結構都忘記了,所以現在複習下雙向鍊錶,如下 list.h 雙向鍊錶 ifndef list h define list h include include 節點 typedef struct listnode list node 鍊錶 typedef struct list list 初...