C语言二叉查找树练习:单词查找
暑假來了,二月時光可不能荒廢了啊。于是決定前一個月學好數據結構與算法。
上一次已經寫了一個鏈表的練習了,這次就決定寫一個二叉查找樹的練習。
記得以前看過《The C Programming Language》里面有那么一個例程,就是操作二叉查找樹的,使用了遞歸。當時大笨兔為了理解那個程序花了不少的時間,雖然現在忘得差不多了。不過歷經種種困難,我還是寫出了那個程序 findwords。
findwords×××
findwords采用的是命令行模式執行,也就是使用的話你要輸入參數。可以使用看查找在文件中是否存在一個單詞,類似notepad的查找功能。這樣使用,findwords filename word1 word2...
比如我在C盤保存了一個文本文檔名為 test.txt 。文檔的內容是 This is a test file。我執行的是 findwords c:\\test.txt my is。那么程序的輸出就是:
C:\Users\acer>findwords c:\\test.txt my is
Don't find 'my'
Word : is??Times 1
程序的邏輯很簡單,先讀取用戶給定的文件,然后從文件中取詞(用到的函數是getWord()),以此建立一棵二叉查找樹,每個單詞都是其的一個節點。查找的話很方便,這就是二叉樹的強項。
源碼中的playtree.h保存了對樹的操作
readfile.h保存了從文件中讀取單詞的函數
playstring.h是對字符串的操作
頭文件header.h包含了幾個庫文件.
這就是整個程序,我來說下載寫程序遇到的一些問題吧。因為在樹的操作中用到了大量的指針,而這也是最容易出錯的地方。我就在這里載了跟斗。同時我也強調一點,c語言函數參數是值傳遞。
然 后整個程序寫完后我運行了一下,調用了幾次addNode(),然后調用了printTrr().可結果什么都沒有打印,我意識到程序出錯了,就開始調 試。后來發現root的值傳進去的時候是NULL,addNode執行之后還是NULL。這時才想起C語言函數參數是值傳遞的。才把代碼寫對了。
?
你仔細看的話你會發現整個程序除了main.c是C文件,其他的都是定義成頭文件類型的。其實剛開始我是定義成C文件的,但是編譯的時候出錯了,下面是報錯信息:
?
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
?
后來在網上查了好久找到了上面的解決方法。不過之后我再實驗的時候發現可以定義成C文件,你把它添加進工程之后就不在使用的時候包含文件了,直接用就OK。但這里我還是沒有改,這是
大笨兔
的成長歷程! :)
?
(全文完)
轉載于:https://blog.51cto.com/dabentu/917135
總結
以上是生活随笔為你收集整理的C语言二叉查找树练习:单词查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery将不再支持IE6/7/8
- 下一篇: 如何对自己做好正确的人生规划