问题描述
- 求助C语言(请务必使用C)帮忙改一下。谢谢!
-
#include
#include
#include
#define SIZE 50 //初始容量
#define T 10 //容量增量//二叉树数据结构
typedef struct Bitree
{
char data;
struct Bitree *lchild,*rchild;//左右孩子指针
struct Bitree *father;//父结点指针
} tree;//栈结构
typedef struct Stack
{
char *base;//存储基址
char *top;//栈顶指针
int stacksize;//存储容量
} Stack;//构造一个空栈s
void InitStack(Stack s)
{
s->base=(char)malloc(SIZE*sizeof(char));
if(s->base==NULL)
printf("!n");
s->top=s->base;
s->stacksize=SIZE;
}//关键字key入栈s
void Push(Stack *s,char key)
{
if((s->top-s->base)>=s->stacksize)
{
realloc(s,(s->stacksize+T)*sizeof(Stack));
if(!s)
exit(-1);
s->top=s->base+s->stacksize;
s->stacksize+=T;
}
*s->top=key;
s->top++;
}//遍历栈并显示栈中元素
void visit(Stack *s)
{
FILE *fp;
fp=fopen("Binary-Sort-Tree.txt","a");
fputc('n',fp);
fprintf(fp,"降序排序序列:");
char *p;
p=s->top;
while(p!=s->base)
{
p--;
printf("%c ",*p);
fprintf(fp,"%c",*p);
fputc(' ',fp);
}
fputc('n',fp);
printf("n");
fclose(fp);
}//插入法构建二叉排序树(插入)
tree *CreateBST(tree *root,char key)
{
if(root==NULL)//二叉排序树为空时
{
root=(tree *)malloc(sizeof(tree));
root->lchild=NULL;
root->rchild=NULL;
root->father=NULL;
root->data=key;
}
else
{
if(root->data>key)//左子树的构造
{
root->lchild=CreateBST(root->lchild,key);
root->father = root->lchild;
}
else
{
root->rchild=CreateBST(root->rchild,key);//右子树的构造
root->father = root->rchild;
}
}
return root;
}//中序遍历
void PreOrderTraverse(tree *root,Stack *s)
{
FILE *fp;
fp=fopen("Binary-Sort-Tree.txt","a");
if(root!=NULL)
{
PreOrderTraverse(root->lchild,s);
printf("%c ", root->data);
Push(s,root->data);
fprintf(fp,"%c",root->data);
fputc(' ',fp);
PreOrderTraverse(root->rchild,s);
}
fclose(fp);
}//在二叉排序树中查找元素
int SearchBST(tree *root,char key,tree *father,tree *p)
{
FILE *fp;
fp=fopen("Binary-Sort-Tree.txt","a");
if(!root)
{
printf("查找结果:没有该关键字n");
fprintf(fp,"查找结果:没有该关键字");
fputc('n',fp);
p=father;
return 1;
}
else if(keydata)
return SearchBST(root->lchild,key,root,p);
else if(key>root->data)
return SearchBST(root->rchild,key,root,p);
else
{
printf("查找结果:有该关键字n");
fprintf(fp,"查找结果:有该关键字");
fputc('n',fp);
p=root;
return 2;
}
fclose(fp);
}//在二叉排序树中删除元素
void DeleteBST(tree *root,char key)
{
tree *p,*q,*f;
p=(tree *)malloc(sizeof(tree));
if(SearchBST(root,key,NULL,p)==2)//如果所需删除的关键字存在
{
if(p->rchild==NULL)//如果关键字的右子树为空
{
q=p;
p=p->lchild;
free(q);
}
else if(p->lchild==NULL)//如果关键字的左子树为空
{
q=p;
p=p->rchild;
free(q);
}
else if(p->rchild==NULL&&p->lchild==NULL)//如果关键字的左、右子树都为空
{
q=p;
p=NULL;
free(q);
}
else//左右子树不空
{
q=p;
f=p->rchild;
while(f->lchild!=NULL)
{
q=f;
f=f->lchild;
}
p->data=f->data; //将直接前驱放置在要删除的节点上,然后删除直接前驱
if(q==p)
{
p->lchild=f->lchild; //如果直接前驱恰好是被删除节点的左孩子,而且直接前驱的右子树为空,
//这样就把直接前驱的左子树连到被删节点的左孩子上。
}
else
q->rchild=f->lchild;//如果不是上面的情况,那么此时的直接前驱一定是没有右孩子的,
//将其左孩子连接到它的双亲的右子树上
}
}
else printf("无该结点!n");
free(p);
}int main()
{
FILE fp;
fp=fopen("Binary-Sort-Tree.txt","a");
Stack *s=NULL;
s=(Stack)malloc(sizeof(Stack));
tree root=NULL;
char p,q;
int i;
printf("n");
printf(" ************n");
printf(" ^ 欢迎使用!^n");
printf(" *************nn");
printf("构造二叉排序树n");
printf("请输入初始关键字序列,停止则输入回车n");
printf("初始关键字序列:");
InitStack(s);
fprintf(fp,"初始化关键序列:");
while(p=getchar())
{
fprintf(fp,"%c",p);
if (p==' ') continue;
if(p=='n') break;
root=CreateBST(root,p);
}
printf("升序排序序列:");
fprintf(fp,"升序排序序列:");
PreOrderTraverse(root,s); // 中序
printf("n");
printf("降序排序序列:");
visit(s);
printf("n");
fflush(stdin);
printf("请选择需要的操作:1.插入 2.删除 3.查找 4.退出n");
scanf("%d",&i);
switch(i)
{
case 1:
fflush(stdin);
printf("插入关键字:");
scanf("%c",&q);
CreateBST(root,q);
fprintf(fp,"插入关键字:");
fprintf(fp,"%c",q);
fputc('n',fp);
printf("升序排序序列:");
fprintf(fp,"升序排序序列:");
PreOrderTraverse(root,s); // 中序
printf("n");
break;
case 2:
{
fflush(stdin);
printf("删除关键字:");
scanf("%c",&q);
DeleteBST(root,q);
printf("升序排序序列:");
PreOrderTraverse(root,s); // 中序
printf("n");
break;
}
case 3:
fflush(stdin);
printf("查找关键字:");
fputc('n',fp);
fprintf(fp,"查找关键字:");
scanf("%c",&q);
fprintf(fp,"%c",q);
fputc('n',fp);
SearchBST(root,q,NULL,NULL);
break;
case 4:
break;
}
fclose(fp);
return 0;
}删除和从文件中读取数据作为初始值这两个无法实现,将数据输入文档中,但出现顺序乱序。希望大神前辈们能帮忙改下~
解决方案
你这个程序存在很大的问题,尤其是在栈的实现上,即不是链栈,也不是静态栈,帮你改着改着实在改不下去了,
下去好好看一下栈,还有在初始化的时候,栈的问题最大,s = (Stack *)malloc(sizeof(Stack));是这么用的,而不是s = (Stack )malloc(sizeof(Stack));
这样的话,错误很大