数据结构查找实验报告.docx
《数据结构查找实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构查找实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构查找实验报告
实验报告
课程
数据结构及算法
实验项目
8.查找
成绩
专业班级
***
指导教师
***
姓名
***
学号
***
实验日期
***
实验八查找
一、实验目的
1、掌握顺序表查找中不同查找方法的查找思想,并能用C/C++语言实现。
2、掌握树表查找中二叉排序树查找、平衡二叉树查找的查找思想,并能用C/C++语言实现。
3、掌握Hash表查找中的查找思想,并能用C/C++语言实现。
4、能够针对具体实际,灵活选用适宜的查找方法。
二、实验环境
PC微机,Windows,DOS,TurboC或VisualC++
三、实验内容
1、二叉排序树查找
(1)问题描述
查找是计算机操作中的一种重要应用技术,查找的方法有许多,不同的查找方法有不同的查找效率,而二叉排序树查找就是效率较高的查找方法之一。
所谓二叉排序树,就是指将原来已有数据根据大小构成一棵二叉树,二叉树中的所有结点数据满足一定的大小关系,所有左子树中的结点均比根结点小,所有右子树中的结点均比根结点大。
二叉排序树查找是指按照二叉排序树中结点的关系进行查找,查找关键字首先同树根结点进行比较,如果相等则查找成功;如果比根结点小,则在左子树中查找;如果比根结点大,则在右子树中进行查找。
这种查找方法可以快速缩小查找范围,大大减少了查找关键字的比较次数,从而提高了查找效率。
(2)基本要求
编程实现时,体现查找的全过程,即二叉排序树的创建、查找关键字的输入、查找关键字的查找、查找结果的输出等。
(3)算法实现
#include
#include
voidGetemptylist();//建立空树
voidGetlist();//建立二叉排序树
voidSortL();//排序
voidConnectlist();//结点连接处理
voidLookup();//查找
typedefstructlist
{
intdata;
structlist*left;
structlist*right;
}JD;
JD*head;
intL[20];
intsize;
intnum;
intmain()
{
Getemptylist();
Getlist();
Lookup();
return0;
}//+*
voidGetemptylist()
{
printf("建立空树:
\n");
head=(JD*)malloc(sizeof(JD));
head->left=NULL;
head->right=NULL;
if(!
head)
{
printf("建立失败!
\n");
exit(-1);
}
else
{
printf("建立成功!
\n");
}
}
voidGetlist()
{
inti;
printf("建立二叉排序树:
\n");
printf("请输入元素个数:
");
scanf("%d",&size);
printf("请输入元素:
");
for(i=0;i{
scanf("%d",&(L[i]));
}
SortL();
printf("二叉排序树建立中。
。
。
。
\n");
Connectlist();
}
voidSortL()
{
inti,j;
intmin;
for(i=0;i{
min=L[i];
for(j=i+1;j{
if(L[j]{
min=L[j];
L[j]=L[i];
L[i]=min;
}
}
}
printf("排序后:
");
for(i=0;i{
printf("%d",L[i]);
}
printf("\n");
}
voidConnectlist()
{
intlow,high,mid;
inti;
JD*p,*q;
p=(JD*)malloc(sizeof(JD));
p->left=NULL;
p->right=NULL;
low=0;
high=size;
mid=(low+high)/2;
head->data=L[mid];
q=head;
for(i=0;i{
q=head;
A1:
if(L[i]data)
{
if(q->left==NULL)
{
p->data=L[i];
q->left=p;
p=(JD*)malloc(sizeof(JD));
p->left=NULL;
p->right=NULL;
}
else
{
q=q->left;
gotoA1;
}
}
else
{
if(q->right==NULL)
{
p->data=L[i];
q->right=p;
p=(JD*)malloc(sizeof(JD));
p->left=NULL;
p->right=NULL;
}
else
{
q=q->right;
gotoA1;
}
}
}
if(head->left==NULL&&head->right==NULL)
{
printf("二叉排序树建立失败!
\n");
}
else
{
printf("二叉排序树建立成功!
\n");
}
}
voidLookup()
{
inti;
JD*q;
printf("请输入查找元素:
");
scanf("%d",&num);
q=head;
for(;;)
{
if(num==q->data)
{
printf("查找成功,此元素为:
%d,地址为:
%d\n",q->data,q);
break;
}
else
{
if(numdata)
{
if(q->left==NULL)
{
printf("查找失败,无此元素\n");
break;
}
else
{
q=q->left;
}
}
else
{
if(q->right==NULL)
{
printf("查找失败,无此元素\n");
break;
}
else
{
q=q->right;
}
}
}
}
}
(4)运行截图
2、通讯录的管理
(1)问题描述
试编程完成通讯录的一般性管理工作,如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含姓名、电话号码、住址等个人基本信息。
(2)基本要求
将建立的通讯录以磁盘文件的形式存储,所有的通讯录管理均以文件操作的方式进行。
在查找通讯录中的记录时,以记录的“姓名”为查找关键字进行查找。
由于“姓名”是字符串类型的数据,其查找过程比整形关键字的查找过程要复杂,关键字比较过程可调用字符串函数,也可以自己实现其比较过程。
(3)算法实现
#include
#include
#include
#definesize50
voidGetemptylist();//建立空表
voidIncrease();//增加
voidModify();//修改
voidLookup();//查找
voidDelete();//删除
voidSee();//查看
voidformat();//格式化
typedefstructlist
{
charname[size];//姓名
chartelenum[size];//电话
charaddress[size];//地址
}JD;
JDUser[size];
intmain()
{
inta;
Getemptylist();
A1:
printf("请选择操作:
\n1.增加2.修改\n3.查找4.删除\n5.查看6.退出\n7.格式化\n");
scanf("%d",&a);
switch(a)
{
case1:
Increase();break;//增加
case2:
Modify();break;//修改
case3:
Lookup();break;//查找
case4:
Delete();break;//删除
case5:
See();break;//查看
case6:
exit
(1);break;//退出
case7:
format();break;
default:
printf("inputerror!
\n");
}
gotoA1;
return0;
}//+*
voidGetemptylist()
{
printf("建立空表:
\n");
if(!
User)
{
printf("建立失败!
\n");
exit(-1);
}
else
{
printf("建立成功!
\n");
}
}
voidIncrease()
{
FILE*fp;
inti=0;
printf("请输入姓名:
");
scanf("%s",User[i].name);
printf("请输入电话:
");
scanf("%s",User[i].telenum);
printf("请输入地址:
");
scanf("%s",User[i].address);
fp=fopen("D:
\\通讯录.txt","a");
fprintf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
fclose(fp);
printf("添加成功!
\n");
}
voidModify()
{
FILE*fp;
chara[size];
inti,j;
intx=1;
fp=fopen("D:
\\通讯录.txt","r");
for(i=0;i<5;i++)
{
fscanf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
}
fclose(fp);
printf("请输入需要修改的联系人的姓名:
");
scanf("%s",a);
for(i=0;i<5;i++)
{
x=1;
for(j=0;j{
if(a[j]!
=User[i].name[j])
{
x=0;
break;
}
}
if(x==1)
{
printf("请输入修改后的姓名:
");
scanf("%s",User[i].name);
printf("请输入修改后的电话:
");
scanf("%s",User[i].telenum);
printf("请输入修改后的地址:
");
scanf("%s",User[i].address);
printf("修改成功!
修改后:
\n");
printf("姓名电话地址\n");
printf("%6s%11s%6s\n",User[i].name,User[i].telenum,User[i].address);
break;
}
}
if(x==1)
{
fp=fopen("D:
\\通讯录.txt","w");
for(i=0;i<5;i++)
{
fprintf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
}
fclose(fp);
}
if(x==0)
{
printf("无此联系人!
\n");
}
}
voidLookup()
{
FILE*fp;
chara[size];
inti,j;
intx=1;
fp=fopen("D:
\\通讯录.txt","r");
for(i=0;i<5;i++)
{
fscanf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
}
fclose(fp);
printf("请输入想要查找的联系人的姓名:
");
scanf("%s",a);
for(i=0;i<5;i++)
{
x=1;
for(j=0;j{
if(a[j]!
=User[i].name[j])
{
x=0;
break;
}
}
if(x==1)
{
printf("查找成功!
\n");
printf("姓名电话地址\n");
printf("%6s%11s%6s\n\n",User[i].name,User[i].telenum,User[i].address);
break;
}
}
if(x==0)
{
printf("无此联系人!
\n");
}
}
voidDelete()
{
FILE*fp;
JDmax[size];
chara[size];
inti,j,k;
intx=1;
fp=fopen("D:
\\通讯录.txt","r");
for(i=0;i<5;i++)
{
fscanf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
}
fclose(fp);
printf("请输入想要删除的联系人的姓名:
");
scanf("%s",a);
for(i=0;i<5;i++)
{
x=1;
for(j=0;j{
if(a[j]!
=User[i].name[j])
{
x=0;
break;
}
}
if(x==1)
{
k=0;
for(j=0;j{
if(j==i)
{
j++;
}
strcpy(max[k].name,User[j].name);
strcpy(max[k].address,User[j].address);
strcpy(max[k].telenum,User[j].telenum);
k++;
}
for(j=0;j{
strcpy(User[j].name,max[j].name);
strcpy(User[j].address,max[j].address);
strcpy(User[j].telenum,max[j].telenum);
}
printf("删除成功!
\n");
break;
}
}
if(x==1)
{
fp=fopen("D:
\\通讯录.txt","w");
for(i=0;i<5;i++)
{
fprintf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
}
fclose(fp);
}
if(x==0)
{
printf("无此联系人!
\n");
}
}
voidSee()
{
FILE*fp;
inti;
fp=fopen("D:
\\通讯录.txt","r");
for(i=0;i<5;i++)
{
fscanf(fp,"%6s%11s%6s",User[i].name,User[i].telenum,User[i].address);
}
fclose(fp);
printf("姓名电话地址\n");
for(i=0;i<5;i++)
{
printf("%6s%11s%6s\n",User[i].name,User[i].telenum,User[i].address);
}
}
voidformat()
{
FILE*fp;
inta;
printf("确定格式化?
(1.确定2.取消)\n");
scanf("%d",&a);
if(a==1)
{
fp=fopen("D:
\\通讯录.txt","w");
fclose(fp);
printf("格式化成功!
\n");
}
elseif(a==2)
{
main();
}
else
{
printf("inputerror!
\n");
}
}
(4)运行截图
4、实验总结
千变万化,实用性强。