c-求助C语言(请务必使用C)帮忙改一下。谢谢!

问题描述

求助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));
这样的话,错误很大

时间: 2024-10-01 06:45:06

c-求助C语言(请务必使用C)帮忙改一下。谢谢!的相关文章

请各位高手帮帮忙!!谢谢

问题描述 https://www.myspace.com/signup上面这个链接是一个注册页面,一开始选择那个单选框,默认是personal,只要选择其他选项注册的内容就会变化,请问这是怎么实现的??请高手帮忙解答!谢谢,看了源代码也看不出是怎么实现的! 解决方案 解决方案二:低级的可以试试用js写.解决方案三:有没有具体的代码可以学习呢?

请朋友们帮帮忙啊!谢谢大家,急啊!!!!!

问题描述 求一份基于c#.net的企业人事管理系统!我做了一个老师说我的太简单,但是我不会复杂的,现在又实习别的工作,顾不上做毕业设计,希望好心人帮帮忙吧!谢谢大家了,我的qq365862997邮箱jipinglove521.com@163.com谢谢谢谢!~ 解决方案 解决方案二:帮顶!解决方案三:这样也行网上找啊http://www.google.cn/search?hl=zh-CN&q=C%23+%E4%BC%81%E4%B8%9A%E4%BA%BA%E4%BA%8B%E7%AE%A1%E

c语言-新人小白求助C语言 各位大大快来啊

问题描述 新人小白求助C语言 各位大大快来啊 #include int main(void) { int a; int b; int c; int n; printf("请输入三个整数值 分别代表 日 月 年:"); scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); n=a%10( n==1?printf("%dst ",a):( n%1

求助c语言回文数问题~~~

问题描述 求助c语言回文数问题~~~ #include<stdio.h> int main() { int i,t=0,s=0; for(i=1000;i<10000;i++,s=0,t=0){ t=i; while(t){ s=s*10+t%10; t/=10; } if(s==i) printf("%d",i); } return 0; } 结果是0分...... 请问哪里错了 解决方案 每个输出是不是需要一个换行呢? #include<stdio.h>

javascript-淘宝图片上传预览 删除 和恢复删除 js或jq代码 急用请务必帮忙 万分感谢

问题描述 淘宝图片上传预览 删除 和恢复删除 js或jq代码 急用请务必帮忙 万分感谢 本地上传图片的预览 会有删除 恢复删除 来回切换的功能 只要本地上传功能 就可以了 请大神帮帮忙 非常感谢 这是demo http://jsbin.com/yedutofafe/edit?html,output 解决方案 http://blog.sina.com.cn/s/blog_9c6c8ea90101crgo.html

表单-淘宝发布宝贝宝贝规格js单击颜色分类自动生成table 项目今天要上线了,请务必帮忙解决谢谢

问题描述 淘宝发布宝贝宝贝规格js单击颜色分类自动生成table 项目今天要上线了,请务必帮忙解决谢谢 需求:点击一个单选框出现表单 每增加一个下边就添加一个 以此类推 动态添加表单 http://jsbin.com/nejoqulipe/edit?html,output这是在线demo 这是我的邮箱529865274@qq.com,请及时联系我 解决方案 类似下面这样 <!DOCTYPE html> <html> <head> <script src="

求助c语言老司机望搭救

问题描述 求助c语言老司机望搭救 刚安装了VC6.0,新建工程,写了个打印"hello"的代码,运行时,显示没有exe文件,求解?如何才能运行起来 解决方案 你要先编译,链接,然后运行... 解决方案二: 在调试下边有一个开始执行的按钮,就可以运行,或者直接F5运行. 解决方案三: 必须要把第一次运行的窗口关了才能运行第二次... 解决方案四: 编译出错了,初学者经常这样,不注意一个标点一个字符,都可能出错.新建项目,选择win32控制台,下一步选择hello world项目,然后点完

代码-求解答谢谢,有关C语言的问题,请哪位大神解答。谢谢

问题描述 求解答谢谢,有关C语言的问题,请哪位大神解答.谢谢 假设有4个有序表A,B,C和D,它们分别含有的元素个数为17,28,36,67,各个表的元素已按照升序排列,如何用Huffman树,通过两两合并并合成有序表,要求在最坏的情况下比较次数达到最小,说明你的合并过程!!! 请问这个怎么合并啊,方便的话给个代码可以吗,谢谢 解决方案 求大神帮解答javaEE这个问题,谢谢了liunx 串口通信问题,跪求各位大神解答 解决方案二: 霍夫曼树构造思想就是依次选择当前最短的两个表进行合并,每次合并

编程c语言-c中的null到底怎么理解?直接理解为0,可以吗,请各位大神帮忙解释

问题描述 c中的null到底怎么理解?直接理解为0,可以吗,请各位大神帮忙解释 小弟自学c语言以来,遇到各类问题,这个事比较难搞得,请各位帮忙 解决方案 首先请注意,需要大写NULL 其次,在绝大多数的系统上都可以理解为0(这货本来就是个宏定义嘛#define NULL ((void*)0)) 在绝大多数系统上,不存在变量的地址为0,因而0可以被安全地认为是一个不存在变量的地方,指向0的指针一定是个空指针 解决方案二: 不一定哦,你看 String str=null; 代表的是空值, Syste