暑假来了,二月时光可不能荒废了啊。于是决定前一个月学好数据结构与算法。
上一次已经写了一个链表的练习了,这次就决定写一个二叉查找树的练习。
记得以前看过《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语言函数参数是值传递。

  1. //向二叉树添加元素
  2. ptree addNode(ptree root,char *address)
  3. {
  4. int result;
  5. if(NULL == root)//在此处添加节点,也是递归终止的条件
  6. root = createNode(address);
  7. else{
  8. //比较字符串
  9. result = strcmp(address,root->address);
  10. if(0 == result){//该单词又出现一次
  11. root->times++;
  12. }
  13. else
  14. if(result < 0){//比此处的单词小,往它的左子节点放
  15. root->leftChild = addNode(root->leftChild,address);
  16. }
  17. else{//比此处单词打,往右子节点放
  18. root->rightChild = addNode(root->rightChild,address);
  19. }
  20. }
  21. return root;
  22. }

复制代码

然 后整个程序写完后我运行了一下,调用了几次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语言二叉查找树练习:单词查找相关推荐

  1. 刷题,小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字

    题目描述 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度.小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪 ...

  2. 数据结构源码笔记(C语言):顺序查找

    //实现顺序查找的算法 #include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 10 ...

  3. 数据结构源码笔记(C语言):二分查找

    //实现二分查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 100 ...

  4. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

  5. Go语言中字符串的查找方法小结

    这篇文章主要介绍了Go语言中字符串的查找方法小结,示例的main函数都是导入strings包然后使用其中的方法,需要的朋友可以参考下 1.func Contains(s, substr string) ...

  6. C语言两个字符串查找最长的公共子串的算法(附完整源码)

    C语言两个字符串查找最长的公共子串的算法 C语言两个字符串查找最长的公共子串的算法完整源码(定义,实现,main函数测试) C语言两个字符串查找最长的公共子串的算法完整源码(定义,实现,main函数测 ...

  7. 1337:【例3-2】单词查找树

    时间限制: 1000 ms 内存限制: 65536 KB 提交数: 1732 通过数: 910 [题目描述] 在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里.为了提高查找和定位的速度 ...

  8. 数据结构:二叉查找树 BST 平均查找长度 ASL 的计算

    平均查找长度 ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数称为平均查找长度. 它的定义是这 ...

  9. 二分查找算法举例说明C语言,C语言快速排序与二分查找算法示例

    本文实例讲述了C语言二分排序与查找算法.分享给大家供大家参考,具体如下: 题目:首先产生随机数,再进行快速排序,再进行二分查找. 实现代码: #include #include #include vo ...

  10. 212. Word Search II:多个单词查找

    写在前面:这两周持续看花花酱整理的题目列表和视频讲解,也得益于自己持续多年刷题,今天刷这道题目的想法是:会trie树居然就能攻克hard题目!我也离独立攻破hard题目不远了嘛.前段时间看王争在极客时 ...

最新文章

  1. 百度超级链XChain(3)平台特点
  2. ArcGIS 10.2加载在线影像底图
  3. android studio 找不到reosurce,EF 6 Bridge Table Insert Not Working
  4. docker下安装wekan看板工具
  5. python3修改pip执行环境和安装软件源
  6. 海森堡量子力学与计算机,量子力学诞生后的120年,没有人真正懂他
  7. whois的原理及介绍
  8. 微信声音锁会上传到服务器吗,微信声音锁:你再也不用担心忘记密码了
  9. PV(访问量)、UV(独立访客)、IP(独立IP) (转)
  10. Linux从入门到精通二(Windows:你知道我的兄弟Linux吗?)
  11. ICASSP 2022 语音合成和语音识别简报
  12. 论文题目:Spatiotemporal Multi-Graph Convolution Network for Ride-Hailing Demand Forecasting
  13. 50条有趣的Python一行代码,建议收藏!
  14. Google(谷歌)拼音输入法发布
  15. IDEA中 NOTE Picked up JDK_JAVA_OPTIONS问题求解?
  16. Qt 5.12学习笔记--QML性能策略
  17. [FPGA系列] 扩展知识 --- QPSK调制解调器
  18. 交换机技术 路由器OSPF路由配置
  19. NET开源项目链接(转载)
  20. 最齐全的场景ue4模型素材,速来收藏

热门文章

  1. linux 查明文密码,win10系统查看明文密码的操作方法
  2. c语言fread读取错误,【求助】C语言fread读取二进制文件时,读取结果全都是零
  3. echarts 图标高度自适应_echarts图表盒子大小变化后,图表无法自适应
  4. 用C#二次封装虹软arcface
  5. 用Fiddler对Android应用进行抓包
  6. JavaScript快速入门-ECMAScript本地对象(RexExp)
  7. Windows Azure: Blob Container的访问权限与策略设置
  8. 关于在VS2010中学习c++的MFC
  9. [SQL Server] 重命名数据库
  10. 模式7--ThreadPerMessage