数据结构动态查找表实验报告.docx
- 文档编号:7582823
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:25
- 大小:32.33KB
数据结构动态查找表实验报告.docx
《数据结构动态查找表实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构动态查找表实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构动态查找表实验报告
成都信息工程学院计算机系
课
程
实
验
报
告
实验课程:
经典算法导论
实验项目:
动态查找表
指导教师:
李莉丽
学生姓名:
周恒超
学生学号:
2010051148
班级:
10级计算机应用一班
实验地点:
5409教室
实验时间:
2011年12月13日
实验成绩:
评阅老师:
一【上机实验目的】
1、深入理解数据结构的算法思想,将算法理论与实际应用相结合,培养学生的编程能力与编程兴趣,让学生清楚从项目分析、编码、调试、程序维护的整个程序开发流程。
2、使学生清楚解决一个编程问题的基本流程,即首先确定逻辑结构,然后在逻辑结构的基础上确定相应的存储结构,最后在设计一套合理而简便实用的算法,整个过程都是在用到数据结构的事项解决问题,是学生能够对线性表、二叉树、图的基本操作较为熟悉,并轻松控制。
3、让学生明白在编程调试的过程中学习程序设计的思想、分析方法,培养并提高编程能力。
二【实验环境】
PC机每人1台
三【上机实验内容】
.实现所有的动态查找表。
该部分算法有一定的难度,尤其二叉排序树与平衡二叉树,涉及树的插入与删除等复杂操作。
实现不易,尽管书中给出的代码较为详细,主要是能较好的掌握二叉树的插入、删除、与遍历,并能很好说明平衡二叉树的动态查找效率明显高于二叉排序树。
四【上机调试程序流程图】
五【上机调试中出现的错误信息、错误原因及解决办法】
1、传参数时出现的问题、传递过去数值的话不能改变数据值,必须传递地址才行;
2、空指针异常,老问题了,指针在使用之前必须要初始化分配空间才能够使用;
3、调试过程中输入数据时出现的低级错误,忘加地址符,导致异常;
4、对文件的操作出现了问题,写入的数据,读出来不正确或是读不出来,解决方法是以相同的格式和方法读写文件,中途加些printf语句检查读出来是否正确,并多次采用单步调试法,一步一步的调试即可。
六【上机调试后的源程序及还存在的问题】
//文件dtczb.h
#include
#include
#include
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<(b))
#defineLQ(a,b)((a)>(b))
#defineTRUE1
#defineFALSE0
#defineOVERFLOW-1
#defineLH+1
#defineEH0
#defineRH-1
typedefintStatus;
typedefintKeyType;
typedefcharName;
typedefcharSex;
typedefintAge;
//结点数据域的定义
typedefstruct
{
KeyTypekey;
Namename[20];
Sexsex[20];
Ageage;
}ElemType;
//动态表的数据结构
typedefstructDSTable
{
ElemTypedata;
Statusbf;
structDSTable*lchild,*rchild;
}*BiTree,BiTNode;
//构造一个只含根节点的动态表
StatusInitDSTable(BiTree*DT);
//动态表中数据元素序列的输入
voidInputData(ElemTypearray[],intn);
//销毁一个动态表
StatusDestroyDSTable(BiTree*DT);
//查找表中是否有关键字等于key的记录
StatusSearchDSTable(BiTreeDT,KeyTypekey,BiTreef,BiTree*p);
//动态表的插入函数
StatusInsertDSTable(BiTree*DT,ElemTypee);
//动态表的删除函数
StatusDeleteDSTable(BiTree*DT,KeyTypekey);
StatusDelete(BiTree*p);
//动态表中节点的右旋
voidR_Rotate(BiTree*p);
//动态表中节点的左旋
voidL_Rotate(BiTree*p);
//二叉平衡树的插入
StatusInsertAVL(BiTree*DT,ElemTypee,Status*taller);
//左平衡函数
voidLeftBalance(BiTree*DT);
//右平衡函数
voidRightBalance(BiTree*DT);
voidPrint(BiTreeDT);
//小界面的函数
voidmenu();
//dtczb.c文件
#include"dtczb.h"
//构造一个只含根节点的动态表
StatusInitDSTable(BiTree*DT)
{
*DT=NULL;
return(TRUE);
}
//动态表中数据元素序列的输入
voidInputData(ElemTypearray[],intn)
{
inti;
for(i=0;i { printf("******请输入第%d学生的信息******: \n",i+1); printf("请输入该学生的学号、姓名、性别、年龄: \n"); scanf("%d%s%s%d",&array[i].key,array[i].name,array[i].sex,&array[i].age); } } //查找表中是否有关键字等于key的记录 StatusSearchDSTable(BiTreeDT,KeyTypekey,BiTreef,BiTree*p) { if(! DT) { *p=f; return(FALSE); } elseifEQ(key,DT->data.key) { *p=DT; return(TRUE); } elseifLT(key,DT->data.key) { return(SearchDSTable(DT->lchild,key,DT,p)); } else { return(SearchDSTable(DT->rchild,key,DT,p)); } } //动态表的插入函数 StatusInsertDSTable(BiTree*DT,ElemTypee) { BiTrees; BiTreep; p=(BiTree)malloc(sizeof(BiTNode)); if(! SearchDSTable(*DT,e.key,NULL,&p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e; s->lchild=NULL; s->rchild=NULL; if(! p) { *DT=s; } elseifLT(e.key,p->data.key) { p->lchild=s; } else { p->rchild=s; } return(TRUE); } else { return(FALSE); } } //动态表的删除函数 StatusDeleteDSTable(BiTree*DT,KeyTypekey) { if(! (*DT)) { printf("你要删除的学生不存在! \n"); return(FALSE); } else { if(EQ(key,(*DT)->data.key)) { return(Delete(DT)); } elseif(LT(key,(*DT)->data.key)) { return(DeleteDSTable(&((*DT)->lchild),key)); } else { return(DeleteDSTable(&((*DT)->rchild),key)); } } } StatusDelete(BiTree*p) { BiTreeq,s; if(! (*p)->rchild) { q=*p; *p=(*p)->lchild; free(q); } elseif(! (*p)->lchild) { q=*p; *p=(*p)->rchild; free(q); } else { q=*p; s=(*p)->lchild; while(s->rchild) { q=s; s=s->rchild; } (*p)->data=s->data; if(q! =*p) { q->rchild=s->lchild; } else { q->lchild=s->rchild; free(s); } } return(TRUE); } //动态表结点的右旋函数 voidR_Rotate(BiTree*p) { BiTreelc; lc=(*p)->lchild; (*p)->lchild=lc->rchild; lc->rchild=*p; *p=lc; } //动态表中节点的左旋 voidL_Rotate(BiTree*p) { BiTreerc; rc=(*p)->rchild; (*p)->rchild=rc->lchild; rc->lchild=*p; *p=rc; } //二叉平衡树的插入 StatusInsertAVL(BiTree*DT,ElemTypee,Status*taller) { if(! (*DT)) { *DT=(BiTree)malloc(sizeof(BiTNode)); (*DT)->data=e; (*DT)->lchild=(*DT)->rchild=NULL; (*DT)->bf=EH; *taller=TRUE; } else { if(EQ(e.key,(*DT)->data.key)) { *taller=FALSE; return(0); } if(LT(e.key,(*DT)->data.key)) { if(! InsertAVL(&((*DT)->lchild),e,taller)) return(0); if(*taller) { switch((*DT)->bf) { caseLH: LeftBalance(DT); *taller=FALSE; break; caseEH: (*DT)->bf=LH; *taller=FALSE; break; caseRH: (*DT)->bf=EH; *taller=FALSE; break; } } } else { if(! InsertAVL(&((*DT)->rchild),e,taller)) return(0); if(*taller) { switch((*DT)->bf) { caseLH: (*DT)->bf=EH; *taller=FALSE; break; caseEH: (*DT)->bf=RH; *taller=FALSE; break; caseRH: RightBalance(DT); *taller=FALSE; break; } } } } return (1); } //左平衡函数 voidLeftBalance(BiTree*DT) { BiTreelc,rd; lc=(*DT)->lchild; switch(lc->bf) { caseLH: (*DT)->bf=lc->bf=EH; R_Rotate(DT); break; caseRH: rd=lc->rchild; switch(rd->bf) { caseLH: (*DT)->bf=RH; lc->bf=EH; break; caseEH: (*DT)->bf=lc->bf=EH; break; caseRH: (*DT)->bf=EH; lc->bf=LH; break; } rd->bf=EH; L_Rotate(&((*DT)->lchild)); R_Rotate(DT); } } //右平衡函数 voidRightBalance(BiTree*DT) { BiTreerc,ld; rc=(*DT)->rchild; switch(rc->bf) { caseRH: rc->bf=EH; (*DT)->bf=EH; L_Rotate(DT); caseLH: ld=rc->lchild; switch(ld->bf) { caseLH: (*DT)->bf=EH; ld->bf=RH; break; caseEH: (*DT)->bf=EH; ld->bf=EH; break; caseRH: (*DT)->bf=RH; ld->bf=EH; break; } } } //中序遍历,打印出二叉树中的结点数据值 voidPrint(BiTreeDT) { if(DT) { Print(DT->lchild); printf("%d%s%s%d\n",DT->data.key,DT->data.name,DT->data.sex,DT->data.age); Print(DT->rchild); } } //小界面的函数 voidmenu() { printf("**********欢迎进入二叉排序树系统**********\n"); printf("##########0、文件信息的读取************\n"); printf("&&&&&&&&&&1、文件A的动态查找表&&&&&&&&&&&&\n"); printf("**********2、文件B的动态查找表************\n"); printf("##########3、文件C的动态查找表############\n"); printf("^^^^^^^^^^4、文件的生成%%%%%%%%%%%%\n"); printf("@@@@@@@@@@5、退出系统@@@@@@@@@@@@@\n"); } //zhuhanshu.c文件 //主函数的实现 #include"dtczb.h" #include LARGE_INTEGERstart; LARGE_INTEGERend; LARGE_INTEGERfrequency; intmain(void) { ElemTypeblock[120],group[120]; intn,i,j,k,m; inttall; BiTreeT[3]; intnumber; charfilename[3][20],gilename[3][20]; chardecided[20],c; FILE*fp,*fq,*fr; menu(); while (1) { printf("\n请输入数字选择你要进行的操作: "); scanf("%d",&k);getchar(); switch(k) { case0: { fr=fopen("fname","rb"); if(fr==NULL) { puts("文件尚未写入,请写入文件! "); exit(0); } for(i=0;i<3;i++) { fread(gilename[i],sizeof(gilename[i]),1,fr); } fclose(fr); printf("文件读取成功! \n"); break; } case1: { InitDSTable(&T[0]); printf("\n欢迎进入文件A的动态查找表\n"); fq=fopen(gilename[0],"rb"); if(fq==NULL) { printf("\n打开文件失败,程序自动退出! \n"); exit(0); } fread(&m,sizeof(int),1,fq); for(i=0;i { fread(&group[i],sizeof(ElemType),1,fq); } fclose(fq); printf("请输入AorBorC选择: "); scanf("%c",&c);getchar(); switch(c) { case'A': { if(! QueryPerformanceFrequency(&frequency)) { return-1; } QueryPerformanceCounter(&start);//开始计时 for(i=0;i { InsertDSTable(&T[0],group[i]); } QueryPerformanceCounter(&end);//结束计时 printf("\n此次查找耗时: %lf(us)微秒",(double)(end.QuadPart-start.QuadPart)/(double)frequency.QuadPart); printf("\n学生的学号姓名性别年龄为: \n"); Print(T[0]); } break; case'B': { if(! QueryPerformanceFrequency(&frequency)) { return-1; } QueryPerformanceCounter(&start);//开始计时 for(i=0;i { InsertAVL(&T[0],group[i],&tall); } QueryPerformanceCounter(&end);//结束计时 printf("\n此次查找耗时: %lf(us)微秒",(double)(end.QuadPart-start.QuadPart)/(double)frequency.QuadPart); printf("\n学生的学号姓名性别年龄为: \n"); Print(T[0]); } break; case'C': { for(i=0;i { InsertDSTable(&T[0],group[i]); } printf("\n请输入你要删除的学生学号: "); scanf("%d",&number); if(DeleteDSTable(&T[0],number)) { Print(T[0]); printf("\n删除成功\n"); } } break; } } break; case2: { InitDSTable(&T[1]); printf("\n欢迎进入文件B的动态查找表\n"); fq=fopen(gilename[1],"rb"); if(! fq) { printf("\n打开文件失败,程序自动退出! \n"); exit(0); } fread(&m,sizeof(int),1,fq); for(i=0;i { fread(&group[i],sizeof(group[i]),1,fq); } fclose(fq); printf("请输入AorBorC选择: "); scanf("%c",&c);getchar(); switch(c) { case'A': { if(! QueryPerformanceFrequency(&frequency)) { return-1; } QueryPerformanceCounter(&start);//开始计时 for(i=0;i { InsertDSTable(&T[1],group[i]); } Query
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 动态 查找 实验 报告