用C语言实现查找算法.docx
《用C语言实现查找算法.docx》由会员分享,可在线阅读,更多相关《用C语言实现查找算法.docx(15页珍藏版)》请在冰豆网上搜索。
![用C语言实现查找算法.docx](https://file1.bdocx.com/fileroot1/2022-11/28/17bc15a3-3996-404f-8701-f43f7d7517f8/17bc15a3-3996-404f-8701-f43f7d7517f81.gif)
用C语言实现查找算法
用C语言实现查找算法
学生姓名:
***指导老师:
***
摘要查找同人们每天的生活和工作息息相关,例如从电话号码本中查找某个电话号码,从成绩表中查找某个同学的成绩,从图书目录中查找某本书,从工资表中查找工资,从铁路时刻表中查找铁路时刻等。
对于小规模的查找可以使用人力,对于大规模的查找活动使用计算机会更快、更准确【1】。
因此,理解并会应用各种查找算法非常重要,本程序融合顺序查找,二分查找,二叉排序树,哈希算法等多种查找方法,我们可以从中比较并依据不同数据的特点使用不同的查找方法,具有较高的实用价值。
C语言是一种结构化语言。
它层次清晰,便于按模块化方式组织程序,易于调试和维护。
C语言的表现能力和处理能力极强。
既可用于系统软件的开发,也适合于应用软件的开发。
此外,C语言还具有效率高,可移植性强等特点。
因此,用C语言实现查找算法具有很高的实用性。
本程序主要包括四大块包括:
(1)顺序查找;
(2)二分查找;(3)二叉排序树;(4)哈希查找。
本程序根据实际生活的需要,满足各方的要求,因此,运用空间还可进一步提高。
在课程设计中,程序的开发平台是WindowsXP,程序设计语言采用C语言,程序应用平台为Windows2000/XP。
采用自定义函数、数组和结构体来解决管理系统中的各种问题。
程序经过调试和修改,基本实现了设计目标。
关键词程序设计;自定义函数;数组;结构体;查找算法
1引言
1.1课题背景
在现代计算机应用中,程序设计占据重要地位,如学生成绩管理、万年历、网上问卷调查等等。
用C语言实现查找算法要求实现顺序查找、二分查找、二叉排序树、哈希查找等多种查找方法。
如何解决这些问题成为我研究的课题之一。
作为一名学计算机的学生,光有理论知识是远远不够的,更重要的是我们的实际动手能力。
学习计算机,理论能够指导我们的实践,能让我们在实践的应用过程中得心应手;反过来说,实践也能使我们对理论知识有更深刻的理解和体会,会促使我们更好的发现问题和解决问题,同时也使我在专业知识上的视野得到了很好的扩展。
因此,综上所述,学计算机,最好的方法就是需要理论结合实际。
而我们最缺乏的就是实践,因此,本次的课程设计给我们提供了一个很好的实践的机会。
程序设计实践课程设计是非常重要的综合性实践教学环节。
通过该课程设计,进一步熟悉了软件开发的基本理论知识,了解了软件设计的一般步骤,掌握了软件开发的常用技巧,并且学会了更多的解决软件开发过程常见问题的方法。
运用所学的数据结构的基本原理、基本知识和基本技巧,解决某一具体的实际问题,培养我们综合分析和解决问题的能力,为今后分析、设计、开发和调试程序打下坚实的基础【3】。
程序设计目的
1、巩固面数据结构的基本理论知识
2、进一步熟悉VisualC++的编程环境,掌握相关控件的使用方法
3、更深层次的理解自定义函数、数组和各种查找算法
4、增强实践操作能力
程序设计内容
用C语言实现各种查找算法的想法来源于生活和工作中的需要。
如今,随着社会的飞速发展,信息时代改变着人们的各种生活方式。
人们的联系信息、联系方式变得复杂而多样化,人们的日常生活中也要求各类查找,由于传统的查找不方便、功能单一等缺陷已经无法胜任它的“时代使命”,因而,用计算机编程来实现各种查找方法已成为时代的迫切需要。
此程序只是一个初步构想,可以将其应用到人们日常生活中的各种查找,很有现实意义。
用C语言实现各类查找,它的内容对于电子产品来说是至关重要的,它能够为电子产品的使用者提供充足的信息和快捷的查询手段。
用VisualC++构建的各种查找方法,包括顺序查找、二分查找、二叉排序树、哈希查找等。
本程序设计合理、操作方便、运行稳定、功能完备,具有较高的实用价值。
2设计思路与方案
查找算法整体结构
系统需要实现顺序查找、二分查找、二叉排序树、哈希查找四个模块,其中这四个模块又由其子程序实现,如图所示:
图功能模块图
设计方案
编写一个程序,模拟查找算法管理系统。
该系统主要有以下几个功能:
(1)顺序查找子模块的实现:
顺序查找包括建立顺序表、输入表中数据、打印查找表、用哨兵查找法查找等几个内容,通过自定义函数,最终实现顺序查找的目的。
(2)二分查找法的实现:
二分查找法又叫折半查找法,它需要把无序表变为有序表(用Sort(SSTable*table)函数实现)之后再进行查找,设定3个变量——low、mid和high,以实现二分查找法的功能。
折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时为止【2】。
(3)二叉排序树的实现:
从主菜单进入二叉排序树功能,用户可根据提示输入相应信息,包括二叉排序树的建立、输出、插入、删除、查找等,可以充分利用二叉排序树的特点,实现查找的功能,可以提高查找效率。
(4)哈希查找的实现:
从主菜单进入哈希查找功能,根据除留余数法构建哈希表,用二次探测法解决冲,用SearHash(HashTableH,intkey,int*p)函数进行查找。
3详细设计
主菜单模块
通过四个自定义函数——printSeq()、printBin()、printTree()、printHash()——简化了主菜单,使其更加简洁明了,同时采用模块化的结果,是程序更加清晰,增强了它的易读性。
顺序查找子模块
首先输入元素个数,然后输入这几个元素的值,用户再输入需要查询的数字即可得出查找结果,如果查找成功则显示出关键字所在的位置,否则显示“查找失败,表中无此数据”,如图所示:
图
二分查找子模块的实现:
通过主菜单按键选择2进入二分查找功能,根据提示输入元素个数,再输入这几个值,然后输入要查找的关键字,系统排序后会显示该关键字在顺序表中的位置,否则显示“查找失败,表中无此数据”,如图所示:
图
二叉排序树子模块的实现:
通过主菜单按键选择3进入二叉排序树功能,根据提示建立二叉排序树,然后进入二叉排序树的菜单,通过数字选择想要实现的功能——中序输出、插入一个节点、删除一个结点、查找一个结点等。
哈希查找子模块的实现:
通过主菜单按键选择3进入哈希查找功能,根据提示输入元素个数,再输入这几个值,然后输入要查找的关键字,如果查找成功则显示存在此元素,否则显示“不存在此元素!
”,如图所示:
图
4运行环境与结果
运行环境
在本课程设计中,系统开发平台为WindowsXP,程序设计语言为VisualC++,程序的运行环境为VisualC++。
VisualC++一般分为三个版本:
学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种,在本课程设计中,以VisualC++为编程环境。
MicrosoftVisualC++是Microsoft公司的MicrosoftVisualStudio开发工具箱中的一个C++程序开发包。
VisualC++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
自1993年Microsoft公司推出VisualC++后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
VisualC++从最早期的版本,发展到最新的版本,VisualC++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。
最新的版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
虽然微软公司推出了VisualC++.NET(VisualC++,但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和Windows。
所以实际中,更多的是以VisualC++为平台。
VisualC++是Microsoft公司推出的目前使用最广泛的基于Windows平台的可视化编程环境。
VisualC++是在以往版本不断更新的基础上形成的,由于其功能强大,灵活性好,完全课扩展以及具有强大的Internet支持,因而在各种C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
VisualC++秉承VisualC++以前版本的优异特性,为用户提供了一套良好的可视化开发环境:
主要包括文本编辑器、资源编辑器、工程创建工具、Debugger调试器等等。
用户可以在集成开发环境中创建工程、打开工程、建立、打开和编辑文件、编译、链接、运行、调试应用程序。
4.2运行结果
(1)首主菜单:
首先出现主菜单,通过选择相应数字进行相应功能的实现,如图所示:
图4.2.1主菜单
(2)通过主菜单按键选择1进入顺序查找功能,输入元素个数,然后输入这几个元素的值,用户再输入需要查询的数字即可得出查找结果,如果查找成功则显示出关键字所在的位置,否则显示“查找失败,表中无此数据”,图4.2.2示:
图4.2.2顺序查找
(3)通过主菜单按键选择2进入二分查找功能,根据提示输入元素个数,再输入这几个值,然后输入要查找的关键字,系统排序后会显示该关键字在顺序表中的位置,否则显示“查找失败,表中无此数据”,如图4.2.3所示:
图4.2.3查询功能
(4)a.通过主菜单按键选择3进入二叉排序树功能,首先输入结点个数及结点的值建立二叉排序树,然后便进入一个菜单提示选择二叉排序树的某个功能如图4.2.4a所示:
图4.2.4a二叉排序树功能菜单
b.中序遍历二叉排序树,如图所示:
图4.2.4b中序遍历二叉排序树
c.插入一个结点,如图所示:
图4.2.4c二叉排序树插入一个结点
d.删除一个结点,如图所示:
图4.2.4d二叉排序树删除一个结点
e.查找一个结点,如图所示:
图4.2.4e二叉排序树查找一个结点
(5)通过主菜单按键选择4进入哈希查找功能,根据提示输入元素个数,再输入这几个值,然后输入要查找的关键字,找到则显示“查找成功!
”,否则显示“不存在此元素”,如图4.2.5所示:
图4.2.5哈希查找法
5结束语
这是一个简单的通过c语言实现各种查找算法的系统,该系统实用性强可以根据我们的需要实现它的更多功能,具有很大的优越性。
然而,这个程序还有一定的瑕疵,不同的查找算法的平均时间复杂度不同,他们的准确程度也不同,还有待进一步的提高。
由于水平有限,有一些算法的实现不够简洁,不能达到理想水平。
同时通过本次课程设计,我有很多感悟,主要几点如下:
(1)通过本次对C语言的深入学习,让我对C语言有了更多的了解并学习到
更多的知识,成功地运用各类函数、循环变量、结构化的程序设计,及结构体、数组、链表的使用加深了对查找算法的理解;
(2)但在学习中发现,编程确实不是很好做的,并非是你想要就能完成的,它需要的是认真、仔细地对待每一个程序块;
(3)要多多动手,只看不动手永远不能达到自己想要的要求,并且容易出错,对能力提高不大;
(4)今后要多多编程,增强对语言的熟悉程度,对自己严格要求,提高自己的综合水平;
(6)总而言之,课程设计的过程就是一个汲取知识的过程,从中获益匪浅,通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,
参考文献
[1]刘怀亮编着.数据结构(C程序).北京:
冶金工业出版社,2004
[2]严蔚敏,吴伟民编着.数据结构:
C语言版.北京:
清华大学出版社,1997
[3]杨路明等编着.C语言程序设计教程.北京:
北京邮电大学出版社,2005
附录:
程序相关源代码
2011-3-3um=0;um!
=key&&[*p].num!
=0)
*p=*p+1;
if[*p].num==key)
return1;
else
return0;
}
voidInsertHash(HashTable*H,Elemtypee)
{//如果查找不到就插入元素
intp;
SearHash(*H,,&p);//查找
H->elem[p]=e;
++H->count;
}
voidprintHash()//调用哈希表
{
HashTableH;
intp,key,i,n;
Elemtypee;
InitHash(&H);
printf("输入数据个数(<11):
");
scanf("%d",&n);
printf("请输入各个值:
");
for(i=0;i{//输入n个元素
scanf("%d",&;//输入数字
if(!
SearHash(H,,&p))
{
InsertHash(&H,e);//插入元素
}
else
printf("已经存在\n");//否则就表示元素的数字已经存在
}
printf("输入查找的数字:
");
scanf("%d",&key);//输入要查找的数字
if(SearHash(H,key,&p))//能查找成功
{
printf("查找成功!
");//输出位置
}
else
printf("不存在此元素!
");
}
voidprint()
{
printf("\t**********************\n");
printf("\t1,顺序查找\n");
printf("\t2,二分查找\n");
printf("\t3,二叉排序树\n");
printf("\t4,哈希查找\n");
printf("\t5,退出程序\n");
printf("\t**********************\n");
}
//主函数
intmain(intargc,char*argv[])
{
inti;//定义变量
print();
scanf("%d",&i);//输入要数字选择要使用的查找方法
while(i!
=5)//i不等于5时
{
switch(i)
{
case1:
//i=1时
printf("顺序查找法:
\n");
printSeq();//顺序查找法
break;//跳出循环}
case2:
printf("二分查找法:
\n");
printBin();//二分查找法
break;//跳出循环
case3:
printf("二叉排序树:
\n");
printTree();//二叉排序树
break;//跳出循环
case4:
printf("哈希查找法:
\n");
printHash();//哈希查找法
break;//跳出循环
default:
printf("按键错误!
");
}
printf("\n");
print();//调用函数print()
scanf("%d",&i);
}
return0;//返回0
}