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 的多...