数据结构查找实验报告.docx
- 文档编号:9848247
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:22
- 大小:181.58KB
数据结构查找实验报告.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] { 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(num { 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、实验总结 千变万化,实用性强。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 查找 实验 报告