问题遇到的现象和发生背景
想在构建完二叉树后调用deleall()函数将二叉树的所有结点删除包括根节点,再调用output()函数提示用户“名单为空,请先输入教师信息”,但是程序进入了if(T)语句并且无法继续运行,不是应该进入else语句吗?
问题相关代码,请勿粘贴截图
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define N 100
//教师信息的结构体定义
typedef struct s
{
int key;
char name[20];
char sex[3];
int age;
char address[50];
}ElemType;
//二叉树定义
typedef struct Node
{ ElemType data;
struct Node *lchild;
struct Node *rchild;
}BiTNode,*BiTree;
int n=0;//将要处理的教师人数
ElemType teacher[N];//存放教师信息
//保存二叉树函数
void save(BiTree T, FILE *fp,int i) {
if(T){
save(T->lchild,fp,i);
strcpy(teacher[i].address ,T->data .address );
teacher[i].age =T->data .age ;
teacher[i].key =T->data .key ;
strcpy(teacher[i].name ,T->data .name) ;
strcpy(teacher[i].sex,T->data .sex );
i++;
save(T->rchild,fp,i);
}
return ;
}
//保存函数
void Save(BiTree T){
int i=0;
FILE *fp=fopen("tea.dat","wb");
fprintf(fp,"%d\n",n);
save(T,fp,i);
for (i=0;i<n;i++)
fwrite(&teacher[i],sizeof(ElemType),1,fp);
fclose(fp);
printf("保存成功!\n");
}
//插入结点函数
void insert(BiTree &bst,ElemType teacher)
{
BiTree p;
if (bst==NULL)
{
p=(BiTree)malloc(sizeof(BiTNode));
p->data =teacher;
p->lchild=NULL;
p->rchild=NULL;
bst=p;
}
else
if (teacher.key <bst->data.key )
insert(bst->lchild,teacher);
else
if (teacher.key>bst->data.key )
insert(bst->rchild,teacher);
}
//信息录入函数
void creat(BiTree &bst)
{
char chs;
int i;
FILE *fp;
bst=NULL;
printf("请选择A:键盘录入/B:文件录入:");
getchar();
scanf("%c",&chs);
if(chs=='A'){
fp=fopen("tea.dat","wb");
printf("请输入将要处理的教师人数:");
scanf("%d",&n);
printf("请输入%d个教师信息:\n",n);
for (i=0;i<n;i++)
{
printf("请输入第%d个教师工号:",i+1);
scanf("%d",&teacher[i].key);
getchar();
printf("请输入第%d个教师的姓名:\n",i+1);
gets(teacher[i].name);
printf("请输入第%d个教师的性别(男或女):\n",i+1);
gets(teacher[i].sex);
printf("请输入第%d个教师的年龄:\n",i+1);
scanf("%d",&teacher[i].age);
getchar();
printf("请输入第%d个教师的职称:\n",i+1);
gets(teacher[i].address);
}
for (i=0;i<n;i++)
{
insert(bst,teacher[i]);
}
fprintf(fp,"%d\n",n);
for (i=0;i<n;i++)
fwrite(&teacher[i],sizeof(ElemType),1,fp);
fclose(fp);
}
else if(chs=='B'){
int count;
fp=fopen("tea.dat","rb");
fscanf(fp,"%d\n",&count);
n=count;
for (i=0;i<count;i++)
{
fread(&teacher[i],sizeof(ElemType),1,fp);
insert(bst,teacher[i]);
}
fclose(fp);
}
}
//中序遍历函数
void Output(BiTree T) {
if(T){
Output(T->lchild);
printf("%-8d%-8s%-8s%-8d%-8s\n",T->data .key ,T->data .name ,T->data .sex ,T->data .age ,T->data .address );
Output(T->rchild);
}
return ;
}
//信息输出函数
void output(BiTree T){
if(n==0){ //如果没有录入信息
printf("请先录入教师信息!");
}
else{
if(T){
printf("工号 姓名 性别 年龄 职称\n");
Output(T);
}
else printf("名单为空,请先输入教师信息!"); //如果二叉树为空
}
}
//查找二叉树结点函数
BiTree search(BiTree bst,int key)
{
if (bst==NULL)
return NULL;
else
if (bst->data.key ==key)
return bst;
else
if (key<bst->data.key )
return search(bst->lchild,key);
else
return search(bst->rchild,key);
}
//修改二叉树结点信息函数
void revise(BiTree bst,int num){
BiTree pd;
pd=search(bst,num);
if(!pd){
printf("该教师不在名单中!");
}
else{
char str1;
do
{
printf("请选择要修改的教师信息:\n1.名字\n2.性别\n3.年龄\n4.职称\n5.保存修改\n6.退出修改\n");
printf("根据选择输入1-6中的任一个数字:");
scanf("%d",&str1);
while (str1!=1&&str1!=2&&str1!=3&&str1!=4&&str1!=5&&str1!=6)
{
printf("输入错误,请重新输入1-6中的任一个字符:");
scanf("%d",&str1);
}
switch (str1)
{
case 1:
{
char name[20];
getchar();
printf("请输入要修改的教师名字:");
gets(name);
strcpy(pd->data .name ,name);
break;
}
case 2:
{
char sex[3];
getchar();
printf("请输入要修改的教师性别:");
gets(sex);
strcpy(pd->data .sex ,sex);
break;
}
case 3:
{
int age=0;
printf("请输入要修改的教师年龄:");
scanf("%d",age);
pd->data.age=age;
break;
}
case 4:
{
char address[50];
getchar();
printf("请输入要修改的教师职称:");
gets(address);
strcpy(pd->data .address ,address);
break;
}
case 5:
{
Save(bst);
break;
}
}
} while(str1!=6);
}
}
//查询信息函数
void searchall(BiTree bst)
{
if(n==0){
printf("名单为空,请先录入名单!");
}
else{
BiTree pd;
int num;
char chh;
printf("\n请输入要查找的教师工号:");
scanf("%d",&num);
pd=search(bst,num);
if(!pd)
{
printf("该教师不在名单中!");
}
else
{
printf("查找成功!\n是否打印该教师信息?Y:是/N:否:");
getchar();
scanf("%c",&chh);
if(chh=='Y')
{
printf("工号 姓名 性别 年龄 职称\n");
printf("%-8d%-8s%-8s%-8d%-8s\n",pd->data .key ,pd->data .name ,pd->data .sex ,pd->data .age ,pd->data .address );
}
else if(chh=='N')
{
printf("是否修改该教师除了工号之外的字段信息?Y:是/N:否:");
getchar();
scanf("%c",&chh);
if(chh=='Y') {
revise(bst,num); }
}
}
}
}
//信息修改函数
void modify(BiTree bst){
if(n==0){
printf("名单为空,请先录入名单!");
}
else{
int num=0;
printf("请输入要修改的教师工号:");
scanf("%d",&num);
revise(bst,num);
}
}
//插入信息函数
void insertall(BiTree bst){
if(n==0){
printf("名单为空,请先录入名单!");
}
else{
int num;
char sh3;
BiTree pd;
printf("请输入要插入的教师工号:");
scanf("%d",&num);
pd=search(bst,num);
if(!pd){
ElemType tea;
tea.key=num;
getchar();
printf("请输入教师的名字:");
gets(tea.name);
printf("请输入教师的性别:");
gets(tea.sex);
printf("请输入教师的年龄:");
scanf("%d",&tea.age);
getchar();
printf("请输入教师的职称:");
gets(tea.address);
insert(bst,tea);
printf("是否保存?Y:是/N:否:");
scanf("%c",&sh3);
if(sh3=='Y'){
n++;
Save(bst);
}
}
else printf("该教师已在名单中!");
}
}
//查找删除结点右子树中的最小结点函数
BiTree FindMin(BiTree t){
if(t!=NULL){
while(t->lchild !=NULL){
t=t->lchild ;
}
}
return t;
}
//删除最小结点函数
void DeleteMin(BiTree &t){
if(t==NULL){
printf("EMPTY TREE!");
return ;
}
else if(t->lchild !=NULL){
DeleteMin(t->lchild );
}
else if(t->lchild ==NULL){
BiTNode *tmp=t;
t=t->rchild ;
delete tmp;
}
}
//删除结点函数
void Delete(BiTree &t,int key){
if(t==NULL){
printf("教师信息不存在,无法删除!");
return ;
}
if(key<t->data.key ) Delete(t->lchild,key);
else if(key>t->data.key ) Delete(t->rchild,key);
else if(t->lchild !=NULL&&t->rchild !=NULL ){ //删除左右子树不为空的(根)结点
t->data =FindMin(t->rchild )->data ;
DeleteMin(t->rchild );
printf("删除成功!\n");
char sh1;
printf("是否保存?Y:是/N:否:");
getchar();
scanf("%c",&sh1);
if(sh1=='Y'){
n--;
Save(t);
}
}
else {
if(t->lchild ==NULL&&t->rchild ==NULL ){ //删除左右子树为空的(根)结点
BiTNode *tmp=t;
t=NULL;
delete tmp;
printf("删除成功!\n");
char sh4;
printf("是否保存?Y:是/N:否:");
getchar();
scanf("%c",&sh4);
if(sh4=='Y'){
n--;
Save(t);
}
}
else{
BiTNode *tmp=t; //删除左子树或右子树不为空的(根)结点
t=(t->lchild !=NULL)?t->lchild :t->rchild ;
printf("删除成功!\n");
char sh2;
printf("是否保存?Y:是/N:否:");
getchar();
scanf("%c",&sh2);
if(sh2=='Y'){
n--;
Save(t);
}
delete tmp;
}
}
}
//删除教师信息函数
void deleall(BiTree bst){
if(n==0){
printf("名单为空,请先录入名单!");
}
else{
int num;
printf("请输入要删除的教师工号:");
scanf("%d",&num);
Delete(bst,num);
}
}
int main()
{
int str;
BiTree bst;
do
{
printf("\n");
printf("**************************\n");
printf("1:录入信息\n");
printf("2:打印信息\n");
printf("3:查找信息\n");
printf("4:修改信息\n");
printf("5:插入信息\n");
printf("6:删除信息\n");
printf("7:退出\n");
printf("**************************\n");
printf("根据菜单选择输入1-7中的任一个数字:");
scanf("%d",&str);
while (str!=1&&str!=2&&str!=3&&str!=4&&str!=5&&str!=6&&str!=7)
{
printf("输入错误,请重新输入1-7中的任一个字符:");
scanf("%d",&str);
}
switch (str)
{
case 1:
{
creat(bst);
break;
}
case 2:
{
output(bst);
break;
}
case 3:
{
searchall(bst);
break;
}
case 4:
{
modify(bst);
break;
}
case 5:
{
insertall(bst);
break;
}
case 6:
{
deleall(bst);
break;
}
}
}while(str!=7);
return 0;
}