日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

C语言二叉查找树练习:单词查找

發(fā)布時(shí)間:2025/4/16 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言二叉查找树练习:单词查找 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

暑假來(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ù)是值傳遞。

  • //向二叉樹添加元素
  • ptree addNode(ptree root,char *address)
  • {
  • ? ? int result;
  • ? ? if(NULL == root)//在此處添加節(jié)點(diǎn),也是遞歸終止的條件
  • ? ?? ???root = createNode(address);
  • ? ? else{
  • ? ?? ???//比較字符串
  • ? ?? ???result = strcmp(address,root->address);
  • ? ?? ???if(0 == result){//該單詞又出現(xiàn)一次
  • ? ?? ?? ?? ?root->times++;
  • ? ?? ???}
  • ? ?? ???else
  • ? ?? ???if(result < 0){//比此處的單詞小,往它的左子節(jié)點(diǎn)放
  • ? ?? ?? ?? ?root->leftChild = addNode(root->leftChild,address);
  • ? ?? ???}
  • ? ?? ???else{//比此處單詞打,往右子節(jié)點(diǎn)放
  • ? ?? ?? ?? ?root->rightChild = addNode(root->rightChild,address);
  • ? ?? ???}
  • ? ? }
  • ? ? return root;
  • }
  • 復(fù)制代碼

    然 后整個(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。