数据结构试验报告 二叉排序树的操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告
班级:信息与计算科学专业1102班学号: 1108060214
姓名:朱晓东
设计日期:2013.6.6
西安科技大学计算机学院
1.实验报告
编写一个演示运用二叉排序树进行数据的的排序、插入、删除、查找等操作的程序。

2.需求分析
本演示程序用vc6.0编写,完成数据的排序功能,同时能够进行数据的创建、插入、删除、查找。

(1)输入的形式和输入值的范围:创建二叉排序树时输入较多的值;插入元素时需要输入插入的元素的值;删除元素时输入元素的值;查找操作时需要输入元素的值。

所有输入中,元素的值都是整数。

(2)输出的形式:在创建、插入、删除的操作后,均显示操作后的元素的排序状况,有小到大排序。

(3)程序所能达到的功能:完成二叉排序树的生成、插入、删除、查找操作。

(4)测试数据:
①插入操作中依次输入10 9 11 8 12 0(本程序是以0元素为为结束标志);
②查找操作中输入13;
③插入操作中输入13;
3概要设计
本程序包含8个函数:
(1)主函数main()
(2)创建二叉排序树函数BSTCreate(BiTree* bt)
(3)显示操作菜单函数menu()
(4)显示二叉排序树的内容函数BSTShow(BiTree bt)
(5)插入元素函数BSTInsert(BiTree* bt,DataType key)
(6)删除元素函数BSTDelete(BiTree* bt,DataType key)
(7)查找元素函数BSTSearch(BiTree bt,DataType key)
(8)查找要删除的元素的函数DeleteNode(BiTree* bt)
各函数之间的关系如下:
BSTCreate(BiTree* bt)
menu()
BSTShow(BiTree bt)
main
BSTInsert(BiTree* bt,DataType key)
BSTDelete(BiTree* bt,DataType key) DeleteNode(BiTree* bt)
BSTSearch(BiTree bt,DataType key)
4.详细设计
实现概要设计中定义的所有数据类型,对每个操作给出伪码算法。

对主程序和其他模块也需要写出伪码算法。

(1)节点类型和指针类型
typedef struct Node
{
DataType data;
struct Node *lchild,*rchild;
}BiTreeNode,*BiTree;
(2)二叉排序树的基本操作
void BSTCreate(BiTree* bt)
{
DataType key;
(*bt) = NULL;
printf("请输入二叉排序树的关键字(以0结束):\n");
scanf("%d,",&key);
while(key!=0)
{
BSTInsert(bt,key);
scanf("%d",&key);
}
}
void BSTShow(BiTree bt)
{
if (bt)
{
BSTShow(bt->lchild);
printf("%d ",bt->data);
BSTShow(bt->rchild);
}
}
void BSTInsert(BiTree* bt,DataType key)
{
BiTreeNode *p,*cur,*parent = NULL;
cur = *bt;
while (cur)
{
if (cur->data == key)
return;
parent = cur;
if(cur->data<key)
cur = cur->rchild;
else
cur = cur->lchild;
}
p = (BiTreeNode*)malloc(sizeof(BiTreeNode));
if(!p)
{
printf("error!");
exit(0);
}
p->data = key;
p->lchild = NULL;
p->rchild = NULL;
if (!parent)
*bt = p;
else if (parent->data<key)
parent->rchild = p;
else
parent->lchild = p;
}
void BSTDelete(BiTree* bt,DataType key)
{
if(!(*bt))
{
printf("没有要删除的关键字!\n");
return;
}
else
{
if ((*bt)->data == key)
DeleteNode(bt);
else if ((*bt)->data < key)
BSTDelete(&(*bt)->rchild,key);
else
BSTDelete(&(*bt)->lchild,key);
}
}
BiTree BSTSearch(BiTree bt,DataType key)
{
BiTreeNode* p;
if (bt)
{
p = bt;
while(p)
{
if (p->data == key)
return p;
else if (p->data < key)
p = p->rchild;
else
p = p->lchild;
}
}
return NULL;
}
void DeleteNode(BiTree* bt)
{
BiTree q,x,y;
if (!(*bt)->rchild)
{
q = *bt;
*bt = (*bt)->lchild;
free(q);
}
else if (!(*bt)->rchild)
{
q = *bt;
*bt = (*bt)->rchild;
free(q);
}
else
{
x = (*bt);
y = (*bt)->lchild;
while (y->rchild)
{
x = y;
y = y->rchild;
}
(*bt)->data = y->data;
if (x!=(*bt))
{
x->rchild = y->lchild;
}
else
x->lchild = y->lchild;
free(y);
}
}
int menu()
{
int select;
do
{
system("cls");
printf("\t\t\t\t二叉排序树");
printf("\n-------------------------------------------------------------------------------\n");
printf("\t\t\t\t0----退出\n");
printf("\t\t\t\t1----创建(只能创建一次)\n");
printf("\t\t\t\t2----插入\n");
printf("\t\t\t\t3----删除\n");
printf("\t\t\t\t4----显示所有关键字\n");
printf("\n-------------------------------------------------------------------------------\n");
printf("请输入操作序号:");
scanf("%d",&select);
}while (select>4||select<0);
return select;
}
5.调试分析
本程序的调试主要是在DeleteNode(BiTree* bt)这个函数中,因为传到这个函数的参数是指针变量,这样会使得当bt发生改变时,会导致整个二叉排序树的变化。

这个函数中的q = *bt;*bt = (*bt)->lchild;free(q);这三条语句会使得整个二叉排序树的变化。

在debug环境下进行调试时会发现,free(q)后不会使得二叉排序树断裂,因为参数bt发生改变可以使整个二叉排序树发生改变。

6.使用说明
程序名为二叉排序树,运行环境为DOS。

程序执行后显示:
在输入操作序号后输入数字选择执行不同的功能。

要求首先输入足够多的插入元素,才能进行其他的操作(先输入1,而且只能创建一次)。

每执行一次功能,就会显示执行后的二叉排序树数的内容,将元素按照从小到大排序。

选择0:退出程序。

选择1:创建一个二叉排序树,要求最后输入的数字为0,因为以0为结束标志。

选择2:插入一个元素,输入一个数字。

选择3:删除二叉排序树的一个元素。

选择4:显示所有的关键字,从小到大排序好输出。

7.测试结果
(1)创建一个二叉排序树
依次输入10 9 11 8 12 0
运行程序结果如下:
(2)插入一个元素:输入13
运行结果如下:
(3)删除元素:输入13
运行结果如下:
附录:
源程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *lchild,*rchild;
}BiTreeNode,*BiTree;
int menu()
{
int select;
do
{
system("cls");
printf("\t\t\t\t二叉排序树");
printf("\n-------------------------------------------------------------------------------\n");
printf("\t\t\t\t0----退出\n");
printf("\t\t\t\t1----创建(只能创建一次)\n");
printf("\t\t\t\t2----插入\n");
printf("\t\t\t\t3----删除\n");
printf("\t\t\t\t4----显示所有关键字\n");
printf("\n-------------------------------------------------------------------------------\n");
printf("请输入操作序号:");
scanf("%d",&select);
}while (select>4||select<0);
return select;
}
void BSTInsert(BiTree* bt,DataType key)
{
BiTreeNode *p,*cur,*parent = NULL;
cur = *bt;
while (cur)
{
if (cur->data == key)
return;
parent = cur;
if(cur->data<key)
cur = cur->rchild;
else
cur = cur->lchild;
}
p = (BiTreeNode*)malloc(sizeof(BiTreeNode));
if(!p)
{
printf("error!");
exit(0);
}
p->data = key;
p->lchild = NULL;
p->rchild = NULL;
if (!parent)
*bt = p;
else if (parent->data<key)
parent->rchild = p;
else
parent->lchild = p;
}
void BSTCreate(BiTree* bt)
{
DataType key;
(*bt) = NULL;
printf("请输入二叉排序树的关键字(以0结束):\n");
scanf("%d,",&key);
while(key!=0)
{
BSTInsert(bt,key);
scanf("%d",&key);
}
}
BiTree BSTSearch(BiTree bt,DataType key)
{
BiTreeNode* p;
if (bt)
{
p = bt;
while(p)
{
if (p->data == key)
return p;
else if (p->data < key)
p = p->rchild;
else
p = p->lchild;
}
}
return NULL;
}
void BSTShow(BiTree bt)
{
if (bt)
{
BSTShow(bt->lchild);
printf("%d ",bt->data);
BSTShow(bt->rchild);
}
}
void DeleteNode(BiTree* bt)
{
BiTree q,x,y;
if (!(*bt)->rchild)
{
q = *bt;
*bt = (*bt)->lchild;
free(q);
}
else if (!(*bt)->rchild)
{
q = *bt;
*bt = (*bt)->rchild;
free(q);
}
else
{
x = (*bt);
y = (*bt)->lchild;
while (y->rchild)
{
x = y;
y = y->rchild;
}
(*bt)->data = y->data;
if (x!=(*bt))
{
x->rchild = y->lchild;
}
else
x->lchild = y->lchild;
free(y);
}
}
void BSTDelete(BiTree* bt,DataType key)
{
if(!(*bt))
{
printf("没有要删除的关键字!\n");
return;
}
else
{
if ((*bt)->data == key)
DeleteNode(bt);
else if ((*bt)->data < key)
BSTDelete(&(*bt)->rchild,key);
else
BSTDelete(&(*bt)->lchild,key);
}
}
int main()
{
BiTree bt = NULL;
DataType key;
for(;;)
{
switch(menu())
{
case 0:
printf("退出了\n");
exit(0);
case 1:
BSTCreate(&bt);
system("pause");
break;
case 2:
printf("请输入插入的关键字:");
scanf("%d",&key);
BSTInsert(&bt,key);
printf("二叉排序树为:");
BSTShow(bt);
system("pause");
break;
case 3:
printf("请输入删除的关键字:");
scanf("%d",&key);
BSTDelete(&bt,key);
if (!bt)
printf("现在的二叉排序树为空!\n");
else
{
printf("二叉排序树为:");
BSTShow(bt);
printf("\n");
}
system("pause");
break;
case 4:
if (!bt)
printf("二叉排序树为空!\n");
else
BSTShow(bt);
system("pause");
break;
}
}
return 0;
}。

相关文档
最新文档