C语言二叉查找树练习:单词查找
暑假來(lái)了,二月時(shí)光可不能荒廢了啊。于是決定前一個(gè)月學(xué)好數(shù)據(jù)結(jié)構(gòu)與算法。
上一次已經(jīng)寫了一個(gè)鏈表的練習(xí)了,這次就決定寫一個(gè)二叉查找樹的練習(xí)。
記得以前看過(guò)《The C Programming Language》里面有那么一個(gè)例程,就是操作二叉查找樹的,使用了遞歸。當(dāng)時(shí)大笨兔為了理解那個(gè)程序花了不少的時(shí)間,雖然現(xiàn)在忘得差不多了。不過(guò)歷經(jīng)種種困難,我還是寫出了那個(gè)程序 findwords。
findwords×××
findwords采用的是命令行模式執(zhí)行,也就是使用的話你要輸入?yún)?shù)。可以使用看查找在文件中是否存在一個(gè)單詞,類似notepad的查找功能。這樣使用,findwords filename word1 word2...
比如我在C盤保存了一個(gè)文本文檔名為 test.txt 。文檔的內(nèi)容是 This is a test file。我執(zhí)行的是 findwords c:\\test.txt my is。那么程序的輸出就是:
C:\Users\acer>findwords c:\\test.txt my is
Don't find 'my'
Word : is??Times 1
程序的邏輯很簡(jiǎn)單,先讀取用戶給定的文件,然后從文件中取詞(用到的函數(shù)是getWord()),以此建立一棵二叉查找樹,每個(gè)單詞都是其的一個(gè)節(jié)點(diǎn)。查找的話很方便,這就是二叉樹的強(qiáng)項(xiàng)。
源碼中的playtree.h保存了對(duì)樹的操作
readfile.h保存了從文件中讀取單詞的函數(shù)
playstring.h是對(duì)字符串的操作
頭文件header.h包含了幾個(gè)庫(kù)文件.
這就是整個(gè)程序,我來(lái)說(shuō)下載寫程序遇到的一些問(wèn)題吧。因?yàn)樵跇涞牟僮髦杏玫搅舜罅康闹羔?#xff0c;而這也是最容易出錯(cuò)的地方。我就在這里載了跟斗。同時(shí)我也強(qiáng)調(diào)一點(diǎn),c語(yǔ)言函數(shù)參數(shù)是值傳遞。
然 后整個(gè)程序?qū)懲旰笪疫\(yùn)行了一下,調(diào)用了幾次addNode(),然后調(diào)用了printTrr().可結(jié)果什么都沒(méi)有打印,我意識(shí)到程序出錯(cuò)了,就開始調(diào) 試。后來(lái)發(fā)現(xiàn)root的值傳進(jìn)去的時(shí)候是NULL,addNode執(zhí)行之后還是NULL。這時(shí)才想起C語(yǔ)言函數(shù)參數(shù)是值傳遞的。才把代碼寫對(duì)了。
?
你仔細(xì)看的話你會(huì)發(fā)現(xiàn)整個(gè)程序除了main.c是C文件,其他的都是定義成頭文件類型的。其實(shí)剛開始我是定義成C文件的,但是編譯的時(shí)候出錯(cuò)了,下面是報(bào)錯(cuò)信息:
?
error LNK2005: "int __cdecl getWord(struct _iobuf *,char *)" (?getWord@@YAHPAU_iobuf@@PAD@Z) already defined in main.objplayTree.obj : error LNK2005: "char * __cdecl accessWord(char *,int)" (?accessWord@@YAPADPADH@Z) already defined in main.objplayTree.obj : error LNK2005: "void __cdecl printfTree(struct TREE *)" (?printfTree@@YAXPAUTREE@@@Z) already defined in main.objplayTree.obj : error LNK2005: "struct TREE * __cdecl createNode(char *)" (?createNode@@YAPAUTREE@@PAD@Z) already defined in main.objplayTree.obj : error LNK2005: "struct TREE * __cdecl addNode(struct TREE *,char *)" (?addNode@@YAPAUTREE@@PAU1@PAD@Z) already defined in main.objplayTree.obj : error LNK2005: "struct TREE * __cdecl findWord(struct TREE *,char *)"
?
(?findWord@@YAPAUTREE@@PAU1@PAD@Z) already defined in main.objDebug/findWord.exe : fatal error LNK1169: one or more multiply defined symbols found
?
后來(lái)在網(wǎng)上查了好久找到了上面的解決方法。不過(guò)之后我再實(shí)驗(yàn)的時(shí)候發(fā)現(xiàn)可以定義成C文件,你把它添加進(jìn)工程之后就不在使用的時(shí)候包含文件了,直接用就OK。但這里我還是沒(méi)有改,這是
大笨兔
的成長(zhǎng)歷程! :)
?
(全文完)
轉(zhuǎn)載于:https://blog.51cto.com/dabentu/917135
總結(jié)
以上是生活随笔為你收集整理的C语言二叉查找树练习:单词查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery将不再支持IE6/7/8
- 下一篇: 如何对自己做好正确的人生规划