C 語言有哪些復用資料結構的方法?

時間 2021-05-30 07:14:59

1樓:myd7349

我找到的一些資料:

還有一些庫實現:

/甚至語言(ooc language,提供了乙個叫做 rock 的編譯器):

2.就是前面回答的知友提到的用 void * 型別的指標來實現泛型。這也有一些例子:

nanomsg 實現的 list,queue 等資料結構:

nanomsg/src/utils at master · nanomsg/nanomsg · GitHub

12 年的時候,在 C語言吧看到乙個帖子,用的也是這種方法:

【 C 語言吧 · 編寫xx管理系統必看,內有指導教程】_c語言吧

3. 效仿 CPython 的做法

看看 CPython 是如何用 C 這樣不那麼物件導向的語言來構建 Python 這樣一門物件導向程式設計語言的。

比如,PyObject 是這樣定義的:

cpython/object.h at master · python/cpython · GitHub

然後,PyDictObject 是這樣定義的:

cpython/dictobject.h at master · python/cpython · GitHub

由於 PyDictObject 和 PyObject 具有相同的結構體頭部,看起來就像是 PyDictObject 繼承自 PyObject 一樣。此外,PyDictObject * 轉換為 PyObject * 也變得合理了。

具體可以讀一下《Python 原始碼剖析》

4. Glib

GLib

C Analog To STL

根據 wikipedia,glib 中實現了這些資料結構:鍊錶、雜湊表、字串、二叉樹、動態陣列等等。

2樓:luikore

__typeof__ 是很好用, 給乙個泛型動態陣列的例子:

#pragma once

#include

#include

#define DA_(ElemType) struct

#define DA_INIT(da) do while(0)

#define DA_CLEANUP(da) do while(0)

#define DA_PUSH(da, e) do \

_da_DA_PUSH->data[_da_DA_PUSH->size++] = *e;\

} while(0)

#define DA_SIZE(da) ((da)->size)

#define DA_AT(da) ()

使用例:

DA_(

int)da;

DA_INIT(&

da);

// 初始化堆記憶體

DA_PUSH(&

da,3);

DA_PUSH(&

da,"foo"

);// 出錯, 編譯器會檢查型別

DA_CLEANUP(&

da);

// 釋放堆記憶體

#include

#include

#define DA_(DAType, ElemType)\

struct DAType ;\

\static void DAType##_DA_init(struct DAType* da) \

\static void DAType##_DA_cleanup(struct DAType* da) \

\static void DAType##_DA_push(struct DAType* da, ElemType e) \

da->data[da->size++] = e;\}\\

static size_t DAType##_DA_size(struct DAType* da) \

\static ElemType* DAType##_DA_at(struct DAType* da, size_t i) \

\static struct const DAType = ;\

用起來就像這樣

DA_(

IntArray

,int

);...

struct

IntArrayd;

IntArray

.init(&

d);IntArray

.push(&

d,4);

IntArray

.size(&

d);IntArray.at

(&d,

0);IntArray

.cleanup(&

d);為什麼不把所有東西都 cast void* 呢? 因為那樣寫錯了型別的話編譯器是沒法給你發現的, 而且編譯器缺少型別資訊也做不了某些優化, 所以不建議.

求教C語言資料結構題

0x76 比如int removeDuplicates int array int array size else current array i return array size 函式返回新的陣列長度,可見複雜度並不是 如果陣列元素資料範圍較小,可以使用計數陣列。比如,假設 0 array i ...

有哪些用 Python 語言講演算法和資料結構的書?

黃哥 黃哥 黃哥推薦的八本資料結構和演算法 Python描述 書。Data Structures and Algorithms in Python Data Structures and Algorithms Using Python and C Data Structures and Algori...

《資料結構與演算法分析C語言描述》真的適合初學者嗎

看前言 本書適合作為高階資料結構 CS7 課程或是研究生第一年演算法分析課程的教材。學生應該具有中等程度的程式設計知識,包括像指標和遞迴這樣一些內容,還要具有離散數學的某些知識。 法布 初學者看這個會覺得很吃力,注意看一下這本書前言中的介紹 本書適合作為高階資料結構 CS7 課程或者研究生第一年演算...