日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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語言函數參數是值傳遞。

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

    然 后整個程序寫完后我運行了一下,調用了幾次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语言二叉查找树练习:单词查找的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。