跳表結構如下:
那麼我們來寫它需要的結構體以及所需函式:先是資料型別的結構體:
struct datatype
;
這裡跟陣列雜湊是一樣的,乙個是需要取餘的鍵值,乙個是存放的資料
既然是鍊錶結構,那麼該有的鍊錶節點我們得寫一下,這個看我的資料結構專欄的帥哥都很熟悉,或者經常寫鍊錶的靚仔都很熟悉,所以直接上了:
struct node
;struct node*
createnode
(struct datatype* data)
那麼我們剛才看了跳表的基本結構,我們抽象出來跳表的基本單元也就是第一列節點的情況:
然後我們把基礎單元封裝成結構體,並寫出它的建立的函式:
struct skiplistnode
;struct skiplistnode*
createskiplistnode
(struct datatype* data)
接下來是抽象一下跳表結構,也就是若干個跳表節點和自己的大小:
struct skiplist
;//建立乙個跳表:
struct skiplist*
createskiplist
(int div)
//這個函式也就是找到合適的位置插入
void
insertnodebysort
(struct skiplist* list,
struct datatype* data)
else
else}if
(pmove !=
null
&&(pmove->data->first % list->div)
== datahashpos)
else
else}if
(ppmove ==
null
)else}}
}else}}
}
好了,插入元素,我們完成了,那麼這個資料結構其實已經完成了,接下來是驗證我們做的對不對:
乙個列印函式:
豎向列印,橫向有衝突的在後面插入的,要做判斷,如果有橫向走到null結束,列印
void
printlist
(struct skiplist* list)
printf
("\n");
//每次橫向列印完畢轉行一下,方便我們看結果
pmove = pmove->next;
//記得移動指標
}printf
("\n");
}
主函式:
int
main()
;for
(int i =
0; i <
7; i++
)printlist
(list)
;struct datatype a =
;//檢驗直接表頭的情況
insertnodebysort
(list,
&a);
printlist
(list)
;return0;
}
好了到這,我們的跳表結構已經寫完了。
但在這最後這裡,我想補充的是其實每一列豎向都是可以連通的,如圖:
這樣的結構的的確確存在著,有興趣的小夥伴其實可以實現一下這樣的結構。
再看一下,如果我們以頭節點作為中心,順時針旋轉45度,有沒有發現啥?
對,這是個極不平衡的二叉樹!
看***的圖
好了,這樣就是我在這裡總結的全部了。
資料結構之跳表
字典有一些形如 字典的節點 鍊錶節點定義 template struct pairnode pairnode const pair element element element pairnode const pair element,pairnode next element element 字典...
資料結構之雜湊表(雜湊表)
今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...
資料結構之雜湊表
雜湊表和雜湊化有乙個重要的概念是如何把關鍵字轉換成陣列下標,在雜湊表中這個轉換是通過雜湊函式來完成的。比如規定乙個單詞含有4個字元,對於單詞cats,我們採用 冪的連乘 的方式將乙個單詞對映成數字。因為有27個可能的字元,包括空格,所以冪採用27,則cats的數字下標是3 27 3 1 27 2 2...