| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 509 人关注过本帖
标题:{急}谁帮我调试一下这个程序,win7下,vc调试器老死机
只看楼主 加入收藏
c语言很虐心
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-12-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
{急}谁帮我调试一下这个程序,win7下,vc调试器老死机
二叉排序树结构
图书借还,存在就借出(删除),不存在入库(插入),用文件操作,BtoF是把改动后的二叉树写入文件

程序代码:
typedef struct BiTNode
{
char data[30];
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define EQ(a,b) (!strcmp((a),(b)))
#define LT(a,b) (strcmp((a),(b))<0)
#define LQ(a,b) (strcmp((a),(b))<=0)

int Filempty(char *ch)//文件判空,不空返回1,空0
{
FILE *fp;
char b;
fp=fopen(ch,"r");
if(fp==NULL)
{
printf("文件不存在!\n");
return 0;
}
b=fgetc(fp);
if(b==EOF) //文件存在但为空
{
printf("当前文件没有记录!\n");
fclose(fp);
return 0;
}
else
{
printf("文件不为空\n");
fclose(fp);
return 1;
}
}





int SearchBST(BiTree &T,char *e,BiTree f,BiTree &p) // 算法9.5(b)
{ // 在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找
// 成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上
// 访问的最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL
if(!T) // 查找不成功
{
p=f;
return 0;
}
else if EQ(e,T->data) //  查找成功
{
p=T;
return 1;
}
else if LT(e,T->data)
return SearchBST(T->lchild,e,T,p); // 在左子树中继续查找
else
return SearchBST(T->rchild,e,T,p); //  在右子树中继续查找
}

int InsDelBST(BiTree &T, char *e)
{ // 当二叉排序树T中不存在关键字等于e.key的元素时,插入e并返回TRUE,否则返回FALSE。算法9.6
BiTree p,s,q,d;

if(!SearchBST(T,e,NULL,p)) // 查找不成功
{
s=(BiTree)malloc(sizeof(BiTNode));
strcpy(s->data,e);
s->lchild=s->rchild=NULL;
if(!p)
T=s; // 被插结点*s为新的根结点
else if LT(e,p->data)
p->lchild=s; // 被插结点*s为左孩子
else
p->rchild=s; // 被插结点*s为右孩子
return 0;
}
else//    删除二叉树中节点
{    

if(!p->rchild) /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */
{
q=p;
p=p->lchild;
free(q);
}
else if(!p->lchild) /* 只需重接它的右子树 */
{
q=p;
p=p->rchild;
free(q);
}
else /* 左右子树均不空 */
{
q=p;
d=p->lchild;
while(d->rchild) /* 转左,然后向右到尽头(找待删结点的前驱) */
{
q=d;
d=d->rchild;
}
strcpy(p->data,d->data); /* s指向被删结点的"前驱"(将被删结点前驱的值取代被删结点的值) */
if(q!=p)
q->rchild=d->lchild; /* 重接*q的右子树 */
else
q->lchild=d->lchild; /* 重接*q的左子树 */
free(d);
}
return 1;//返回给Find
}
}










void  FindFore(BiTree &T,char *ch)//传参时为空树
{
FILE *fp;
char str[20];//文件行读取写入str
fp=fopen(ch,"r");//只读打开
if(fp==NULL)//不存在文件,新建
{
printf("文件不存在将新建!\n");
fp=fopen(ch,"w");
fclose(fp);
}
if(Filempty(ch)!=0)//文件不空,读取文件内容到二叉树
{
while(fgets(str,20,fp))
{
//fgets(str,20,fp);//行读取,如遇换行符,结束读取
if(str[strlen(str) - 1] == '\n')
str[strlen(str) - 1] = 0;
puts(str);
InsDelBST(T,str);
}
fclose(fp);
}
}







void InitBiTree(BiTree &T)
{
T=NULL;
}

/*1.被FindFore调用,从文件读字符串插入二叉树,
2.Find调用,存在删除,不存在插入
*/



void Find(BiTree &T)
{
char d[40];
int flag;
printf("请输入您要查询的图书:\n");
gets(d);
flag=InsDelBST(T,d);
if(flag==0)
printf("书库里没有您要的书,该书将稍后入库!\n");
else
printf("《%s》查阅到,您将借出!\n",d);
}

void BtoF(BiTree &T,char *ch)/*中序遍历二叉树,写入文件用BtoF( 即Binary to File),将文件清空后把改动后的二叉树再写入文件。*/
{
FILE *fp;
BiTree cur=T, prev=NULL;
fp=fopen(ch,"w");
    while (cur != NULL)
    {
        if (cur->lchild == NULL)          // 1.
        {
fputs(cur->data,fp);
fputc('\n',fp);
            cur = cur->rchild;
        }
        else
        {
            prev = cur->lchild;
            while (prev->lchild!= NULL && prev->rchild != cur)
                prev = prev->rchild;
            if (prev->rchild == NULL)   // 2.a)
            {
                prev->rchild = cur;
                cur = cur->lchild;
            }
            else                       // 2.b)
            {
                prev->rchild = NULL;
                fputs(cur->data,fp);
fputc('\n',fp);
                cur = cur->rchild;
            }
        }
    }
fclose(fp);
}






int main()
{
BiTree T;
char ch[40];
InitBiTree(T);
int a;
printf("输入要打开的文件名:\n");
gets(ch);
printf("查阅借还书!(1 ok,0 exit)\n");

for(;;)
{

scanf("%d%*c",&a);
switch(a)
{
case 1:FindFore(T,ch);
Find(T);
BtoF(T,ch);
break;
case 0:return  0;
}
}
}
&#8203;




图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 二叉树 color 
2013-12-22 16:40
情.难言ゝ
Rank: 3Rank: 3
来 自:安徽安庆
等 级:论坛游侠
威 望:1
帖 子:74
专家分:137
注 册:2013-9-8
收藏
得分:0 
在我电脑上可以运行的哦亲,最后一行不要啊  

树叶的离去,是风的追求、还是树的不挽留???
2013-12-22 17:02
c语言很虐心
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-12-22
收藏
得分:0 
回复 2楼 情.难言ゝ
可以添加,但是删除时(借书),会自动停止程序,这段代码有问题,就是看不出来哪里错了
2013-12-22 17:16
wangdayong99
Rank: 2
等 级:论坛游民
帖 子:9
专家分:97
注 册:2013-12-24
收藏
得分:20 
回复 楼主 c语言很虐心
//在这个函数的最末行return 1前面加了T=p;//新加这一行vc就不死机了。见附件调试过程。

int InsDelBST(BiTree &T, char *e)
{ // 当二叉排序树T中不存在关键字等于e.key的元素时,插入e并返回TRUE,否则返回FALSE。算法9.6
BiTree p,s,q,d;

if(!SearchBST(T,e,NULL,p)) // 查找不成功
{
s=(BiTree)malloc(sizeof(BiTNode));
strcpy(s->data,e);
s->lchild=s->rchild=NULL;
if(!p)
T=s; // 被插结点*s为新的根结点
else if (LT(e,p->data))
p->lchild=s; // 被插结点*s为左孩子
else
p->rchild=s; // 被插结点*s为右孩子
return 0;
}
else//    删除二叉树中节点
{   

if(!p->rchild) /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */
{
q=p;
p=p->lchild;
free(q);
}
else if(!p->lchild) /* 只需重接它的右子树 */
{
q=p;
p=p->rchild;
free(q);
}
else /* 左右子树均不空 */
{
q=p;
d=p->lchild;
while(d->rchild) /* 转左,然后向右到尽头(找待删结点的前驱) */
{
q=d;
d=d->rchild;
}
strcpy(p->data,d->data); /* s指向被删结点的"前驱"(将被删结点前驱的值取代被删结点的值) */
if(q!=p)
q->rchild=d->lchild; /* 重接*q的右子树 */
else
q->lchild=d->lchild; /* 重接*q的左子树 */
free(d);
}
T=p;//新加
return 1;//返回给Find
}
}
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-12-24 19:46
快速回复:{急}谁帮我调试一下这个程序,win7下,vc调试器老死机
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029518 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved