我真夠鬱悶,這麼久沒有更新部落格.罪過,罪過...
寫這個可擴散列,我寫出來的這個完全是個模型,限制較多,局限性也很強,大概32:1.呵呵.不過,儘管如此,拿來練手或者之前沒有寫過這個東西的朋友看到的話,還是很有協助的.
大概介紹下吧,不詳談了.本來想吹一頓的,無奈寫到現在,感覺很垃圾.於是不好意思大吹特吹了.
資料類型,無符號8位整數.對255以上的資料無效,想弄成負數要做的改動並不多.無奈不想再多耽擱了.
支援,初始化,插入,尋找,刪除,遍曆,清空.還算齊全的功能.
介紹到這裡吧,主要是啊,完全就是在書上看到的兩頁而已,自己寫出來,很了不起了啊.沒人指導我,網上也沒這個東西,哎,我還真是個天才.
雖然,工作很難落實,很難照著我的想法前進,無奈,該做的還是要做下去.辦法也還是要繼續想,加油吧.不然怎麼辦呢.
現在心情反而平靜了,代碼沒做太多的最佳化.貼出來.
/*extendible_hashing.h-- 可擴散列標頭檔*/<br />#define NO 0<br />#define YES 1<br />#define M 4<br />#define LENTH 8</p><p>/*資料類型定義*/</p><p>typedef unsigned char Item ;/*資料*/<br />typedef struct unit<br />{<br />Item * array ;/*資料數組*/<br />char sub ;/*使用中表元的數量*/<br />} Unit ;/*資料單元*/<br />typedef struct subdirectories<br />{<br />Unit * point ;/*指向資料單元的指標*/<br />char point_to_itself ;/*標記是否指向的其本身的資料空間*/<br />char byte_index ;/*位索引值*/<br />} Subdirectories ;/*子目錄*/<br />typedef struct table<br />{<br />Subdirectories * directory ;/*目錄(子目錄數組)*/<br />char directory_size ;/*目錄大小*/<br />char index_digit ;/*索引位元*/<br />char item_digit ;/*資料位元數*/<br />char array_size ;/*資料數組大小*/<br />} * Table ;</p><p>/*說明:由於手裡沒有這種資料類型的模型, 算是自己根據要求創造*/<br />/*將資料類型限制為char類型.有符號8位二進位,這樣利於操作*/</p><p>/*介面函式宣告*/</p><p>/*操作:根據二個輸入資料產生一個數值並返回*/<br />/*操作前:pitem 指向指定資料, constant 是被移位的數值*/<br />/*操作後:產生一個數值並返回*/<br />int Hash (const Item * const pitem, const char constant) ;</p><p>/*操作:建立並初始化一個可擴散列表*/<br />/*操作前:ptable 指向一個可擴散列表*/<br />/*操作後:如果記憶體配置成功, 建立該可擴散列表, 目錄大小初始化為4, 索引位元初始化為2, 資料數組大小初始化為4, 返回1; 否則返回0*/<br />int InitializeTable (Table * const ptable) ;</p><p>/*操作:向可擴散列表中添加一個元素*/<br />/*操作前:ptable 指向一個已初始化的可擴散列表, pitem 指向指定的資料*/<br />/*操作後:如果未重複添加, 如果記憶體配置成功, 將指定的資料添加到可擴散列表中, 返回1; 否則返回0*/<br />int Insert (const Table * const ptable, const Item * const pitem) ;</p><p>/*操作:尋找並返回可擴散列表中的一個指定資料*/<br />/*操作前:ptable 指向一個已初始化的可擴散列表, pitem 指向指定的資料*/<br />/*操作後:如果找到, 返回1; 否則返回0*/<br />int Find (const Table * const ptable, const Item * const pitem) ;</p><p>/*操作:從可擴散列表目錄的低索引向高索引依次將一個函數作用於point指標指向其自身資料空間的的子目錄*/<br />/*操作前:ptable 指向一個已初始化的可擴散列表, pfun 指向一個沒有傳回值, 接受一個Subdirectories型別參數的函數*/<br />/*操作後:從可擴散列表目錄的低索引向高索引依次將一個函數作用於point指標指向其自身資料空間的的子目錄*/<br />void Traversal (const Table * const ptable, void (* pfun) (const Subdirectories subdirectories)) ;</p><p>/*操作:從可擴散列表中刪除一個指定資料*/<br />/*操作前:ptable 指向一個已初始化的可擴散列表, pitem 是準備刪除的資料*/<br />/*操作後:如果找到該資料, 將該資料從可擴散列表中刪除, 返回1; 否則返回0*/<br />int Delete (const Table * const ptable, const Item * const pitem) ;</p><p>/*操作:清空可擴散列表佔用的記憶體空間*/<br />/*操作前:pteble 指向一個已初始化的可擴散列表*/<br />/*操作後:該可擴散列表佔用的記憶體空間被釋放*/<br />void Release (const Table * const ptable) ;