原子(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...