C語言介面與實現 Atom

2021-06-28 08:48:24 字數 2363 閱讀 5169

原子(atom)這一資料結構的工作原理基本類似於拉鍊式雜湊表,每個原子對應唯一的字串,不同的原子對應的字串內容不同(用數學語言講就是在原子和字串之間建立了雙射)。原子的特點有三個:

其一,每個原子對應的字串是不可變的;

其二,相同內容的字串只會儲存一次,節省了儲存空間;

其三,比較兩個字串是否相同時不必知道字串的內容,而只需比較它們對應的指標。

而原子為什麼有這三個特點,之後在**中會詳細解釋。

首先看atom的定義:

static struct atom  *buckets[2048];

因為使用者並不需要知道原子的定義,所以這部分是放在實現檔案裡的,但是為了便於理解提到了前面。每個原子對應唯一的字串——str指向這個字串,len記錄這個字串的長度,link是為了實現鍊錶,然後做了乙個陣列buckets[2048],則是為了實現hash(相當於有2048個桶,每個桶存放乙個原子鍊錶)。當要查詢乙個特定字串是否已經儲存時,就是先用hash演算法找到它對應的桶,然後順著這個桶為首 的原子鍊錶查詢。

然後看標頭檔案定義:

// *** atom.h ***

#ifndef atom_included

#define atom_included

extern const char *atom_new(const char *str, int len);

extern const char *atom_string(const char *str);

extern const char *atom_int(long n);

extern int atom_length(const char *str);

#endif

特別注意因為原子對應的字串是不可變的,所以返回的是常指標。

1)atom_new 的功能是確定與str指向的長度為len的字串內容相同的字串已經有原子對應,如果有就找到這個原子返回字串指標,沒有則新建原子返回字串指標;

2)atom_string的功能是查詢str是否有對應原子,有則找到原子並返回其指標,否則新建原子並返回指標;

3)atom_int的功能是在做atom_string之前多一步把長整數轉成字串的工作;

4)atom_length的功能是如果str有對應原子,就返回長度,否則報錯。

所以四個函式的關係是:

atom_new是核心,atom_string和atom_int呼叫atom_new,即在atom_new基礎上提供了一層封裝,atom_length相當於副產物。

接著看實現檔案:

// *** atom.c ***

#include #include #include #include "atom.h"

// 計算陣列的長度

#define nelems(x) ((sizeof (x))/(sizeof ((x)[0])))

// 原子的定義

static struct atom *buckets[2048];

// 隨機數陣列,用於實現hash

static unsigned long scatter[256] = ;

const char *atom_new(const char *str, int len)

} // 新建原子,儲存字串

p = (struct atom*)malloc(sizeof(struct atom));

p->len = len;

p->str = (char*)malloc(sizeof(char) * (len + 1));

if (len > 0)

memcpy(p->str, str, len);

p->str[len] = '\0';

// 把新原子插入所在桶對應鍊錶的頭部,並返回指標

p->link = buckets[h];

buckets[h] = p;

return p->str;

}const char *atom_string(const char *str)

const char *atom_int(long n)

if (n < 0)

*(--s) = '-';

// 呼叫atom_new

return atom_new(s, (str + sizeof str) - s);

}int atom_length(const char *str)

最後進行測試:

#include #include #include #include #include "atom.h"

int main()

Atom原子C語言實現

atom原子c語言實現 在 c語言介面與實現 中,原子 atom 是這樣定義的 它是乙個指標,指向了乙個唯一的 不可變得序列,序列中包含零或多個位元組 位元組值任意 任一原子都只會出現一次。如果兩個原子指向相同的位置,那麼二者是相同的。優點是節省空間,因為任一串行都只會出現一次。按照該書的要求,實現...

c語言介面與實現

分類 程式設計 2006 04 13 21 57 7392人閱讀收藏 舉報 語言c 資料結構 c lua exception 書中對atom,list,stack,hashtable,set,ring,exception等都作了 相信看過這邊書後,你使用c程式設計的功力會大為提高。也許使用c 的朋友...

C 介面與實現

公有繼承 inte ce and implementation 三種繼承的方式 pure virtual function 只繼承基類的介面,要在派生類中重寫該函式的實現。至於是在子類中實現還是子類的子類中實現都無所謂,關鍵是需要例項化的類就需要實現,不然物件是無法建立的。virtual funct...