我的数据结构课设
操作方法
01
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[10][10],b[10],c[10],d[10];
typedef struct BSTNode//结构体(包括节点信息 左右儿子)
{
int key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
int InsertBST(BSTree &t,int k)
{//若二叉排序树t中没有关键字k,则插入,否则直接返回
BSTree p,f;
p=t;
while(p) //查找插入位置
{
if(p->key==k){
printf("树中已有该数
");
return 0;} //已有k,无需插入
f=p; //f保存当前查找的结点
p=(k<p->key)?p->lchild:p->rchild; //若k<p->key,在左子树上查找,否则在右子树上查找
}
p=(BSTree)malloc(sizeof(BSTNode));
p->key=k;
p->lchild=p->rchild=NULL;
if(t==NULL)
t=p; //如果是空树,则把输入的数给树根
else if (k<f->key)
f->lchild=p;
else f->rchild=p;
return 1;
}//InsertBST
int Delete(BSTree bst, int X)
//在二叉排序树bst上,删除其关键字为X的结点。
{
BSTree f,p=bst;
while (p && p->key!=X) {//查找值为X的结点
if (p->key>X) {f=p; p=p->lchild;}
else{f=p; p=p->rchild;}
}
if (p==NULL)
{
printf("无关键字为%d的结点
",X);
return 0;
}
if (p->lchild==NULL)
{ //被删结点无左子树
if (f->lchild==p) f->lchild=p->rchild;//将被删结点的右子树接到其双亲上
else f->rchild=p->rchild;
}
else //被删结点有左子树
{
BSTree q,s;
q=p;
s=p->lchild; //s指向被删结点左子树的根
while (s->rchild !=NULL) //查左子树中最右下的结点(中序最后结点)
{
q=s;
s=s->rchild;
}
p->key=s->key; //结点值用其左子树最右下的结点的值代替
if (q==p)
p->lchild=s->lchild;//被删结点左子树的根结点无右子女
else
q->rchild=s->lchild; //s是被删结点左子树中序最后一个结点
free(s);
return 1;
}
}
void found(BSTree &p,int k)
{
while(p) //查找插入位置
{
if (p->key==k)
{
printf(" %s--------------------------%d
",a[p->key],p->key);
break;
}
p=(k<p->key)?p->lchild:p->rchild; //若k<p->key,在左子树上查找,否则在右子树上查找
}
if(p->key!=k)
printf(" 没有这样的章节
");
}
void change(BSTree &p,int k)
{
int j;int t=0;
while(p)
{
if(p->key==k)
{
printf("输入更改后的章节名称
");
scanf("%s",c);
t=1;
strcpy(a[k],c);
break;
}
p=(k<p->key)?p->lchild:p->rchild;
}
if(t==0) printf(" 没有这样的章节
");
}
void zhongxu(BSTree T){
if(T){
zhongxu(T->lchild);
printf(" %s--------------------------%d
",a[T->key],T->key);
zhongxu(T->rchild);
}
}//中序
int main()
{
int id,k;
BSTree t=NULL;
while(1){
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o
");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o
");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 请输入所需的功能 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 1.插入 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 2.删除 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 3.输出目录 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 4.查询 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 5.更改目录 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^o 6.退出 o^o o*o o-o o^o
");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o
");
printf("o^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^oo^o o*o o-o o^o
");
scanf("%d",&id);
switch(id)
{
case 1:{
printf("-----------------请输入要插入的目录页数:------------------
");
scanf("%d",&k);
printf("-----------------请输入要插入的目录名称:------------------
");
scanf("%s",a[k]);
InsertBST(t,k);
break;
}
case 2:{
printf("-----------------请输入需要删除的数:------------------------
");
scanf("%d",&k);
Delete(t,k);
break;
}
case 3:{
printf(" 目录
");
zhongxu(t);
break;
}
case 4:
{
int i;int g=0;
printf("--------------输入章节名称
");
scanf("%s",b);
for(i=0;i<10;i++)
{
if(strcmp(a[i],b)==0)
{
found(t,i);
g=1;break;
}
}
if(g==0)printf("--------没有这样的章节-
");
break;
}
case 5:
{int i;int g=0;
printf("---------------输入更改章节名称
");
scanf("%s",d);
for(i=0;i<10;i++)
{
if(strcmp(a[i],d)==0)
{
change(t,i);g=1;
break;
}
}
if(g==0)printf("--------没有这样的章节-
");
break;
}
case 6:
exit(0);
break;
default:
printf("输入错误!");
break;
}
}
return 0;
}
好了,以上就是大致内容了,(END)
评论列表(条(包括审核中))