Atom原子C語言實現

2021-06-02 05:52:03 字數 1836 閱讀 1277

atom原子c語言實現

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

按照該書的要求,實現了四個介面:

int atominit(void);

char *atomnew(const char *str,size_t len);

char *atomstring(const char *str);

size_t atomlength(const char *str);

atominit是定義了乙個全域性變數g_ath,它指向了乙個雜湊表,當然該雜湊為鏈式雜湊,解決的衝突方法為拉鍊法。atomnew函式是根據雜湊值在雜湊表中找到對應的桶,然後在該桶上新增原子項。atomstring只是呼叫了atomnew函式而已,而atomlength函式返回的是變數str的長度。

基本的資料結構如下:

#define max_atom_table 1

struct atom

;struct atomtablehead

g_ath;

總體設計圖如下:

1 初始化

int atominit()

2 雜湊函式

unsigned long hash(const char *name,size_t len)

3 新增原子

char *atomnew(const char *str,size_t len)

temp= temp->next;

}slot->len= len;

slot->str= (char *)(slot - offsetof(struct atom,str));

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

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

returnslot->str;

}if(temp->len== len)

}size_t flen=len+sizeof(struct atom)+1;

struct atom *newslot = (struct atom *)malloc(flen);

memset(newslot,0,sizeof(structatom)+len+1);

newslot->len= len;

size_t sz = offsetof(struct atom,str);

newslot->str= (char *)(newslot - sz ); //大端小端問題

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

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

structatom *tmp = head->next;

head->next= newslot;

newslot->next= tmp;

returnnewslot->str;

}

考慮到鏈式管理,插入原子時是選擇查在第乙個原子的後面,如下圖所示:

4 得到原子的長度

size_t atomlength(const char *str)

}return 0;

}

在開發中,原子是非常有用的,通常情況下,如果使用任意位元組的序列作為索引(而不使用整數),那麼可以將原子用作鍵。

C語言介面與實現 Atom

原子 atom 這一資料結構的工作原理基本類似於拉鍊式雜湊表,每個原子對應唯一的字串,不同的原子對應的字串內容不同 用數學語言講就是在原子和字串之間建立了雙射 原子的特點有三個 其一,每個原子對應的字串是不可變的 其二,相同內容的字串只會儲存一次,節省了儲存空間 其三,比較兩個字串是否相同時不必知道...

C語言實現memcpy

memcpy和memmove都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊 的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。程式設計師面試寶典中有例題 對應的原型如下 v...

C語言實現多型

c 中的多型是指 通過基類物件的指標或者基類物件的引用呼叫虛函式 表現更多派生類的特性,但根據c 多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。在考慮移植性上,c 的光芒要蓋過 c 但 c 的多...