{急}谁帮我调试一下这个程序,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;