数据结构动态查找表实验报告Word文档格式.docx
《数据结构动态查找表实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构动态查找表实验报告Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
2、空指针异常,老问题了,指针在使用之前必须要初始化分配空间才能够使用;
3、调试过程中输入数据时出现的低级错误,忘加地址符,导致异常;
4、对文件的操作出现了问题,写入的数据,读出来不正确或是读不出来,解决方法是以相同的格式和方法读写文件,中途加些printf语句检查读出来是否正确,并多次采用单步调试法,一步一步的调试即可。
六【上机调试后的源程序及还存在的问题】
//文件dtczb.h
#include<
stdio.h>
stdlib.h>
string.h>
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<
(b))
#defineLQ(a,b)((a)>
#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<
n;
i++)
{
printf("
******请输入第%d学生的信息******:
\n"
i+1);
请输入该学生的学号、姓名、性别、年龄:
);
scanf("
%d%s%s%d"
&
array[i].key,array[i].name,array[i].sex,&
array[i].age);
}
StatusSearchDSTable(BiTreeDT,KeyTypekey,BiTreef,BiTree*p)
if(!
DT)
*p=f;
return(FALSE);
elseifEQ(key,DT->
data.key)
*p=DT;
return(TRUE);
elseifLT(key,DT->
return(SearchDSTable(DT->
lchild,key,DT,p));
else
rchild,key,DT,p));
StatusInsertDSTable(BiTree*DT,ElemTypee)
BiTrees;
BiTreep;
p=(BiTree)malloc(sizeof(BiTNode));
SearchDSTable(*DT,e.key,NULL,&
p))
s=(BiTree)malloc(sizeof(BiTNode));
s->
data=e;
lchild=NULL;
rchild=NULL;
if(!
p)
{
*DT=s;
}
elseifLT(e.key,p->
p->
lchild=s;
else
rchild=s;
StatusDeleteDSTable(BiTree*DT,KeyTypekey)
(*DT))
你要删除的学生不存在!
else
if(EQ(key,(*DT)->
data.key))
return(Delete(DT));
elseif(LT(key,(*DT)->
return(DeleteDSTable(&
((*DT)->
lchild),key));
rchild),key));
StatusDelete(BiTree*p)
BiTreeq,s;
(*p)->
rchild)
q=*p;
*p=(*p)->
lchild;
free(q);
elseif(!
lchild)
rchild;
s=(*p)->
while(s->
q=s;
s=s->
(*p)->
data=s->
data;
if(q!
=*p)
q->
rchild=s->
lchild=s->
free(s);
//动态表结点的右旋函数
voidR_Rotate(BiTree*p)
BiTreelc;
lc=(*p)->
(*p)->
lchild=lc->
lc->
rchild=*p;
*p=lc;
voidL_Rotate(BiTree*p)
BiTreerc;
rc=(*p)->
rchild=rc->
rc->
lchild=*p;
*p=rc;
StatusInsertAVL(BiTree*DT,ElemTypee,Status*taller)
*DT=(BiTree)malloc(sizeof(BiTNode));
(*DT)->
lchild=(*DT)->
bf=EH;
*taller=TRUE;
if(EQ(e.key,(*DT)->
*taller=FALSE;
return(0);
if(LT(e.key,(*DT)->
if(!
InsertAVL(&
lchild),e,taller))
return(0);
if(*taller)
{
switch((*DT)->
bf)
{
caseLH:
LeftBalance(DT);
*taller=FALSE;
break;
caseEH:
(*DT)->
bf=LH;
caseRH:
}
}
rchild),e,taller))
bf=RH;
RightBalance(DT);
return
(1);
voidLeftBalance(BiTree*DT)
BiTreelc,rd;
lc=(*DT)->
switch(lc->
caseLH:
(*DT)->
bf=lc->
R_Rotate(DT);
break;
caseRH:
rd=lc->
switch(rd->
caseLH:
(*DT)->
lc->
break;
caseEH:
caseRH:
rd->
L_Rotate(&
lchild));
voidRightBalance(BiTree*DT)
BiTreerc,ld;
rc=(*DT)->
switch(rc->
rc->
L_Rotate(DT);
ld=rc->
switch(ld->
ld->
//中序遍历,打印出二叉树中的结点数据值
voidPrint(BiTreeDT)
if(DT)
Print(DT->
lchild);
%d%s%s%d\n"
DT->
data.key,DT->
data.name,DT->
data.sex,DT->
data.age);
rchild);
voidmenu()
printf("
**********欢迎进入二叉排序树系统**********\n"
##########0、文件信息的读取************\n"
&
1、文件A的动态查找表<
A、平衡,B、排序,C、删除>
**********2、文件B的动态查找表<
************\n"
##########3、文件C的动态查找表<
############\n"
^^^^^^^^^^4、文件的生成%%%%%%%%%%%%\n"
@@@@@@@@@@5、退出系统@@@@@@@@@@@@@\n"
//zhuhanshu.c文件
//主函数的实现
windows.h>
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)
\n请输入数字选择你要进行的操作:
"
%d"
k);
getchar();
switch(k)
case0:
fr=fopen("
fname"
"
rb"
if(fr==NULL)
puts("
文件尚未写入,请写入文件!
exit(0);
for(i=0;
3;
fread(gilename[i],sizeof(gilename[i]),1,fr);
fclose(fr);
printf("
文件读取成功!
break;
case1:
InitDSTable(&
T[0]);
\n欢迎进入文件A的动态查找表\n"
fq=fopen(gilename[0],"
if(fq==NULL)
printf("
\n打开文件失败,程序自动退出!
\n"
fread(&
m,sizeof(int),1,fq);
m;
fread(&
group[i],sizeof(ElemType),1,fq);
fclose(fq);
请输入AorBorC选择:
scanf("
%c"
c);
switch(c)
case'
A'
:
{
if(!
QueryPerformanceFrequency(&
frequency))
{
return-1;
}
QueryPerformanceCounter(&
start);
//开始计时
for(i=0;
InsertDSTable(&
T[0],group[i]);
end);
//结束计时
printf("
\n此次查找耗时:
%lf(us)微秒"
(double)(end.QuadPart-start.QuadPart)/(double)frequency.QuadPart);
\n学生的学号姓名性别年龄为:
Print(T[0]);
}
B'
InsertAVL(&
T[0],group[i],&
tall);
C'
\n请输入你要删除的学生学号:
scanf("
number);
if(DeleteDSTable(&
T[0],number))
Print(T[0]);
printf("
\n删除成功\n"
case2:
T[1]);
\n欢迎进入文件B的动态查找表\n"
fq=fopen(gilename[1],"
if(!
fq)
\n"
group[i],sizeof(group[i]),1,fq);
T[1],group[i]);
Query