数据结构动态查找表实验报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
BiTree rc,ld;
rc=(*DT)->rchild;
switch(rc->bf)
{
case RH:
rc->bf=EH;
(*DT)->bf=EH;
L_Rotate(DT);
case LH:
ld=rc->lchild;
switch(ld->bf)
{
case LH:
(*DT)->bf=EH;
ld->bf=RH;
printf("请输入该学生的学号、姓名、性别、年龄:\n");
scanf("%d %s %s %d",&array[i].key,array[i].name,array[i].sex,&array[i].age);
}
}
//查找表中是否有关键字等于key的记录
Status SearchDSTable(BiTree DT,KeyType key,BiTree f,BiTree *p)
六
//文件dtczb.h
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)>(b))
#define TRUE 1
二
PC机每人1台
三
.实现所有的动态查找表。
该部分算法有一定的难度,尤其二叉排序树与平衡二叉树,涉及树的插入与删除等复杂操作。实现不易,尽管书中给出的代码较为详细,主要是能较好的掌握二叉树的插入、删除、与遍历,并能很好说明平衡二叉树的动态查找效率明显高于二叉排序树。
四
五
1、传参数时出现的问题、传递过去数值的话不能改变数据值,必须传递地址才行;
2、空指针异常,老问题了,指针在使用之前必须要初始化分配空间才能够使用;
3、调试过程中输入数据时出现的低级错误,忘加地址符,导致异常;
4、对文件的操作出现了问题,写入的数据,读出来不正确或是读不出来,解决方法是以相同的格式和方法读写文件,中途加些printf语句检查读出来是否正确,并多次采用单步调试法,一步一步的调试即可。
free(s);
}
}
return(TRUE);
}
//动态表结点的右旋函数
void R_Rotate(BiTree *p)
{
BiTree lc;
lc=(*p)->lchild;
(*p)->lchild=lc->rchild;
lc->rchild=*p;
*p=lc;
}
//动态表中节点的左旋
void L_Rotate(BiTree *p)
{
p->lchild=s;
}
else
{
p->rchild=s;
}
return(TRUE);
}
else
{
return(FALSE);
}
}
//动态表的删除函数
Status DeleteDSTable(BiTree *DT,KeyType key)
{
if(!(*DT))
{
printf("你要删除的学生不存在!\n");
break;
case RH:
(*DT)->bf=EH;
*taller=FALSE;
break;
}
}
}
else
{
if(!InsertAVL(&((*DT)->rchild),e,taller))
return(0);
if(*taller)
{
switch((*DT)->bf)
{
case LH:
(*DT)->bf=EH;
{
BiTree rc;
rc=(*p)->rchild;
(*p)->rchild=rc->lchild;
rc->lchild=*p;
*p=rc;
}
//二叉平衡树的插入
Status InsertAVL(BiTree *DT,ElemType e,Status *taller)
{Fra Baidu bibliotek
if(!(*DT))
{
*DT=(BiTree)malloc(sizeof(BiTNode));
{
if(!DT)
{
*p=f;
return(FALSE);
}
else if EQ(key,DT->data.key)
{
*p=DT;
return(TRUE);
}
else if LT(key,DT->data.key)
{
return(SearchDSTable(DT->lchild,key,DT,p));
{
BiTree lc,rd;
lc=(*DT)->lchild;
switch(lc->bf)
{
case LH:
(*DT)->bf=lc->bf=EH;
R_Rotate(DT);
break;
case RH:
rd=lc->rchild;
switch(rd->bf)
{
case LH:
(*DT)->bf=RH;
lc->bf=EH;
break;
case EH:
(*DT)->bf=lc->bf=EH;
break;
case RH:
(*DT)->bf=EH;
lc->bf=LH;
break;
}
rd->bf=EH;
L_Rotate(&((*DT)->lchild));
R_Rotate(DT);
}
}
//右平衡函数
void RightBalance(BiTree *DT)
return(FALSE);
}
else
{
if(EQ(key,(*DT)->data.key))
{
return(Delete(DT));
}
else if (LT(key,(*DT)->data.key))
{
return(DeleteDSTable(&((*DT)->lchild),key));
}
else
Status Delete(BiTree *p);
//动态表中节点的右旋
void R_Rotate(BiTree *p);
//动态表中节点的左旋
void L_Rotate(BiTree *p);
//二叉平衡树的插入
Status InsertAVL(BiTree *DT,ElemType e,Status *taller);
成都信息工程学院计算机系
课
程
实
验
报
告
实验课程:
经典算法导论
实验项目:
动态查找表
指导教师:
李莉丽
学生姓名:
周恒超
学生学号:
2010051148
班级:
10级计算机应用一班
实验地点:
5409教室
实验时间:
2011年12月13日
实验成绩:
评阅老师:
一
1、深入理解数据结构的算法思想,将算法理论与实际应用相结合,培养学生的编程能力与编程兴趣,让学生清楚从项目分析、编码、调试、程序维护的整个程序开发流程。
//结点数据域的定义
typedef struct
{
KeyType key;
Name name[20];
Sex sex[20];
Age age;
}ElemType;
//动态表的数据结构
typedef struct DSTable
{
ElemType data;
Status bf;
struct DSTable *lchild,*rchild;
#define FALSE 0
#define OVERFLOW -1
#define LH +1
#define EH 0
#define RH -1
typedef int Status;
typedef int KeyType;
typedef char Name;
typedef char Sex;
typedef int Age;
}*BiTree,BiTNode;
//构造一个只含根节点的动态表
Status InitDSTable(BiTree *DT);
//动态表中数据元素序列的输入
void InputData(ElemType array[],int n);
//销毁一个动态表
Status DestroyDSTable(BiTree *DT);
2、使学生清楚解决一个编程问题的基本流程,即首先确定逻辑结构,然后在逻辑结构的基础上确定相应的存储结构,最后在设计一套合理而简便实用的算法,整个过程都是在用到数据结构的事项解决问题,是学生能够对线性表、二叉树、图的基本操作较为熟悉,并轻松控制。
3、让学生明白在编程调试的过程中学习程序设计的思想、分析方法,培养并提高编程能力。
(*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))
printf("%d %s %s %d\n",DT->data.key,DT->data.name,DT->data.sex,DT->data.age);
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;
}
else if LT(e.key,p->data.key)
Status InitDSTable(BiTree *DT)
{
*DT=NULL;
return(TRUE);
}
//动态表中数据元素序列的输入
void InputData(ElemType array[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("******请输入第%d学生的信息******:\n",i+1);
*taller=FALSE;
break;
case EH:
(*DT)->bf=RH;
*taller=FALSE;
break;
case RH:
RightBalance(DT);
*taller=FALSE;
break;
}
}
}
}
return(1);
}
//左平衡函数
void LeftBalance(BiTree *DT)
{
if(!InsertAVL(&((*DT)->lchild),e,taller))
return(0);
if(*taller)
{
switch((*DT)->bf)
{
case LH:
LeftBalance(DT);
*taller=FALSE;
break;
case EH:
(*DT)->bf=LH;
*taller=FALSE;
{
return(DeleteDSTable(&((*DT)->rchild),key));
}
}
}
Status Delete(BiTree *p)
{
BiTree q,s;
if(!(*p)->rchild)
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if(!(*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;
break;
case EH:
(*DT)->bf=EH;
ld->bf=EH;
break;
case RH:
(*DT)->bf=RH;
ld->bf=EH;
break;
}
}
}
//中序遍历,打印出二叉树中的结点数据值
void Print(BiTree DT)
{
if(DT)
{
Print(DT->lchild);
//左平衡函数
void LeftBalance(BiTree *DT);
//右平衡函数
void RightBalance(BiTree *DT);
void Print(BiTree DT);
//小界面的函数
void menu();
//dtczb.c文件
#include "dtczb.h"
//构造一个只含根节点的动态表
}
else
{
return(SearchDSTable(DT->rchild,key,DT,p));
}
}
//动态表的插入函数
Status InsertDSTable(BiTree *DT,ElemType e)
{
BiTree s;
BiTree p;
p=(BiTree)malloc(sizeof(BiTNode));
//查找表中是否有关键字等于key的记录
Status SearchDSTable(BiTree DT,KeyType key,BiTree f,BiTree *p);
//动态表的插入函数
Status InsertDSTable(BiTree *DT,ElemType e);
//动态表的删除函数
Status DeleteDSTable(BiTree *DT,KeyType key);
BiTree rc,ld;
rc=(*DT)->rchild;
switch(rc->bf)
{
case RH:
rc->bf=EH;
(*DT)->bf=EH;
L_Rotate(DT);
case LH:
ld=rc->lchild;
switch(ld->bf)
{
case LH:
(*DT)->bf=EH;
ld->bf=RH;
printf("请输入该学生的学号、姓名、性别、年龄:\n");
scanf("%d %s %s %d",&array[i].key,array[i].name,array[i].sex,&array[i].age);
}
}
//查找表中是否有关键字等于key的记录
Status SearchDSTable(BiTree DT,KeyType key,BiTree f,BiTree *p)
六
//文件dtczb.h
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)>(b))
#define TRUE 1
二
PC机每人1台
三
.实现所有的动态查找表。
该部分算法有一定的难度,尤其二叉排序树与平衡二叉树,涉及树的插入与删除等复杂操作。实现不易,尽管书中给出的代码较为详细,主要是能较好的掌握二叉树的插入、删除、与遍历,并能很好说明平衡二叉树的动态查找效率明显高于二叉排序树。
四
五
1、传参数时出现的问题、传递过去数值的话不能改变数据值,必须传递地址才行;
2、空指针异常,老问题了,指针在使用之前必须要初始化分配空间才能够使用;
3、调试过程中输入数据时出现的低级错误,忘加地址符,导致异常;
4、对文件的操作出现了问题,写入的数据,读出来不正确或是读不出来,解决方法是以相同的格式和方法读写文件,中途加些printf语句检查读出来是否正确,并多次采用单步调试法,一步一步的调试即可。
free(s);
}
}
return(TRUE);
}
//动态表结点的右旋函数
void R_Rotate(BiTree *p)
{
BiTree lc;
lc=(*p)->lchild;
(*p)->lchild=lc->rchild;
lc->rchild=*p;
*p=lc;
}
//动态表中节点的左旋
void L_Rotate(BiTree *p)
{
p->lchild=s;
}
else
{
p->rchild=s;
}
return(TRUE);
}
else
{
return(FALSE);
}
}
//动态表的删除函数
Status DeleteDSTable(BiTree *DT,KeyType key)
{
if(!(*DT))
{
printf("你要删除的学生不存在!\n");
break;
case RH:
(*DT)->bf=EH;
*taller=FALSE;
break;
}
}
}
else
{
if(!InsertAVL(&((*DT)->rchild),e,taller))
return(0);
if(*taller)
{
switch((*DT)->bf)
{
case LH:
(*DT)->bf=EH;
{
BiTree rc;
rc=(*p)->rchild;
(*p)->rchild=rc->lchild;
rc->lchild=*p;
*p=rc;
}
//二叉平衡树的插入
Status InsertAVL(BiTree *DT,ElemType e,Status *taller)
{Fra Baidu bibliotek
if(!(*DT))
{
*DT=(BiTree)malloc(sizeof(BiTNode));
{
if(!DT)
{
*p=f;
return(FALSE);
}
else if EQ(key,DT->data.key)
{
*p=DT;
return(TRUE);
}
else if LT(key,DT->data.key)
{
return(SearchDSTable(DT->lchild,key,DT,p));
{
BiTree lc,rd;
lc=(*DT)->lchild;
switch(lc->bf)
{
case LH:
(*DT)->bf=lc->bf=EH;
R_Rotate(DT);
break;
case RH:
rd=lc->rchild;
switch(rd->bf)
{
case LH:
(*DT)->bf=RH;
lc->bf=EH;
break;
case EH:
(*DT)->bf=lc->bf=EH;
break;
case RH:
(*DT)->bf=EH;
lc->bf=LH;
break;
}
rd->bf=EH;
L_Rotate(&((*DT)->lchild));
R_Rotate(DT);
}
}
//右平衡函数
void RightBalance(BiTree *DT)
return(FALSE);
}
else
{
if(EQ(key,(*DT)->data.key))
{
return(Delete(DT));
}
else if (LT(key,(*DT)->data.key))
{
return(DeleteDSTable(&((*DT)->lchild),key));
}
else
Status Delete(BiTree *p);
//动态表中节点的右旋
void R_Rotate(BiTree *p);
//动态表中节点的左旋
void L_Rotate(BiTree *p);
//二叉平衡树的插入
Status InsertAVL(BiTree *DT,ElemType e,Status *taller);
成都信息工程学院计算机系
课
程
实
验
报
告
实验课程:
经典算法导论
实验项目:
动态查找表
指导教师:
李莉丽
学生姓名:
周恒超
学生学号:
2010051148
班级:
10级计算机应用一班
实验地点:
5409教室
实验时间:
2011年12月13日
实验成绩:
评阅老师:
一
1、深入理解数据结构的算法思想,将算法理论与实际应用相结合,培养学生的编程能力与编程兴趣,让学生清楚从项目分析、编码、调试、程序维护的整个程序开发流程。
//结点数据域的定义
typedef struct
{
KeyType key;
Name name[20];
Sex sex[20];
Age age;
}ElemType;
//动态表的数据结构
typedef struct DSTable
{
ElemType data;
Status bf;
struct DSTable *lchild,*rchild;
#define FALSE 0
#define OVERFLOW -1
#define LH +1
#define EH 0
#define RH -1
typedef int Status;
typedef int KeyType;
typedef char Name;
typedef char Sex;
typedef int Age;
}*BiTree,BiTNode;
//构造一个只含根节点的动态表
Status InitDSTable(BiTree *DT);
//动态表中数据元素序列的输入
void InputData(ElemType array[],int n);
//销毁一个动态表
Status DestroyDSTable(BiTree *DT);
2、使学生清楚解决一个编程问题的基本流程,即首先确定逻辑结构,然后在逻辑结构的基础上确定相应的存储结构,最后在设计一套合理而简便实用的算法,整个过程都是在用到数据结构的事项解决问题,是学生能够对线性表、二叉树、图的基本操作较为熟悉,并轻松控制。
3、让学生明白在编程调试的过程中学习程序设计的思想、分析方法,培养并提高编程能力。
(*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))
printf("%d %s %s %d\n",DT->data.key,DT->data.name,DT->data.sex,DT->data.age);
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;
}
else if LT(e.key,p->data.key)
Status InitDSTable(BiTree *DT)
{
*DT=NULL;
return(TRUE);
}
//动态表中数据元素序列的输入
void InputData(ElemType array[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("******请输入第%d学生的信息******:\n",i+1);
*taller=FALSE;
break;
case EH:
(*DT)->bf=RH;
*taller=FALSE;
break;
case RH:
RightBalance(DT);
*taller=FALSE;
break;
}
}
}
}
return(1);
}
//左平衡函数
void LeftBalance(BiTree *DT)
{
if(!InsertAVL(&((*DT)->lchild),e,taller))
return(0);
if(*taller)
{
switch((*DT)->bf)
{
case LH:
LeftBalance(DT);
*taller=FALSE;
break;
case EH:
(*DT)->bf=LH;
*taller=FALSE;
{
return(DeleteDSTable(&((*DT)->rchild),key));
}
}
}
Status Delete(BiTree *p)
{
BiTree q,s;
if(!(*p)->rchild)
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if(!(*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;
break;
case EH:
(*DT)->bf=EH;
ld->bf=EH;
break;
case RH:
(*DT)->bf=RH;
ld->bf=EH;
break;
}
}
}
//中序遍历,打印出二叉树中的结点数据值
void Print(BiTree DT)
{
if(DT)
{
Print(DT->lchild);
//左平衡函数
void LeftBalance(BiTree *DT);
//右平衡函数
void RightBalance(BiTree *DT);
void Print(BiTree DT);
//小界面的函数
void menu();
//dtczb.c文件
#include "dtczb.h"
//构造一个只含根节点的动态表
}
else
{
return(SearchDSTable(DT->rchild,key,DT,p));
}
}
//动态表的插入函数
Status InsertDSTable(BiTree *DT,ElemType e)
{
BiTree s;
BiTree p;
p=(BiTree)malloc(sizeof(BiTNode));
//查找表中是否有关键字等于key的记录
Status SearchDSTable(BiTree DT,KeyType key,BiTree f,BiTree *p);
//动态表的插入函数
Status InsertDSTable(BiTree *DT,ElemType e);
//动态表的删除函数
Status DeleteDSTable(BiTree *DT,KeyType key);