Frost_Jiang 2015-06-28 13:51 采纳率: 50%
浏览 1736
已结题

求助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(" *************\n\n");
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;
}
图片说明
图片说明
图片说明
图片说明

删除和从文件中读取数据作为初始值这两个无法实现,将数据输入文档中,但出现顺序乱序。希望大神前辈们能帮忙改下~

  • 写回答

1条回答 默认 最新

  • 码码更快乐 2015-06-28 15:22
    关注

    你这个程序存在很大的问题,尤其是在栈的实现上,即不是链栈,也不是静态栈,帮你改着改着实在改不下去了,
    下去好好看一下栈,还有在初始化的时候,栈的问题最大,s = (Stack *)malloc(sizeof(Stack));是这么用的,而不是s = (Stack )malloc(sizeof(Stack));
    这样的话,错误很大

    评论

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题