#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stu
{
char name[20];
char date[20];
char phone[20];
char id[20];
}stu;
typedef struct node
{
stu data;
struct node *left,*right;
}BTNode,*PBTNode,*BiTree;
PBTNode insertleft(PBTNode T,stu x) //插入左孩子
{
PBTNode p;
if(!T)
{
return NULL;
}
if(T->left == NULL)
{
p=( PBTNode)malloc(sizeof(BTNode));
p->data = x;
p->left = NULL;
p->right = NULL;
T->left =p;
return p;
}
return NULL;
}
PBTNode insertright(PBTNode T,stu x) //插入右孩子
{
PBTNode p;
if(!T)
{
return NULL;
}
if(T->right == NULL)
{
p = (PBTNode)malloc(sizeof(BTNode));
p->data = x;
p->left = NULL;
p->right = NULL;
T->right = p;
return p;
}
return NULL;
}
PBTNode insertchild(PBTNode T,stu x) //插入结点
{
if(T->left==NULL && T->right==NULL&&!strcmp(T->data.name," "))
{
T->data = x;
}
else if(insertleft(T,x)) ;
else
{
if(insertright(T,x));
else if(insertchild(T->left,x));
}
return NULL;
}
void creat(stu *items,PBTNode *T) //建立二叉树,初始化
{
int i;
printf("建立二叉数\n");
(*T) = (PBTNode )malloc(sizeof(BTNode));
(*T)->left=NULL;
(*T)->right=NULL;
(*T)->data=items[0];
for(i=1;i<4;i++)
{
insertchild(*T,items[i]);
}
}
void inorder(PBTNode T) //中序遍历
{
if(T)
{
printf("\n\t姓名\t\t学号\t\t生日\t\t电话\n");
printf("\n\t%s\t\t%s\t%s\t%s\n\n",T->data.name,T->data.id
,T->data.date,T->data.phone);
inorder(T->left);
inorder(T->right);
}
}
void PreOrder(PBTNode T) //前序遍历
{
if(T!=NULL)
{
printf("\n\t姓名\t\t学号\t\t生日\t\t电话\n");
printf("\n\t%s\t\t%s\t%s\t%s\n\n",T->data.name,T->data.id
,T->data.date,T->data.phone);
PreOrder(T->left);
PreOrder(T->right);
}
}
void PostOrder(PBTNode T) //后序遍历
{
if(T!=NULL)
{
PostOrder(T->left);
PostOrder(T->right);
printf("\n\t姓名\t\t学号\t\t生日\t\t电话\n");
printf("\n\t%s\t\t%s\t%s\t%s\n\n",T->data.name,T->data.id
,T->data.date,T->data.phone);
}
}
PBTNode search(PBTNode T,char *ch) //查找name的结点
{
PBTNode p = NULL;
if(T)
{
if(!strcmp(T->data.name,ch))
{
printf("\n\t姓名\t\t学号\t\t生日\t\t电话\n");
printf("\n\t%s\t\t%s\t%s\t%s\n\n",T->data.name,T->data.id
,T->data.date,T->data.phone);
p = T;
return p;
}
else
{
p = search(T->left,ch);
}
if(p)
{
return p;
}
else
{
p = search(T->right,ch);
}
}
return p;
}
PBTNode searchfather(PBTNode T,PBTNode r,int *flag) //查找双亲
{
PBTNode p = NULL;
if(T)
{
if(T->left == r)
{
(*flag)=0; //flag=0,表示是左孩子
p = T;
return p;
}
else if(T->right == r)
{
(*flag)=1; //flag=0,表示是右孩子
p = T;
return p;
}
else
{
p=searchfather( T->left, r,flag);
if(p)
{
return p;
}
else
{
p=searchfather( T->right, r,flag);
}
}
}
return p;
}
int delete(PBTNode T,char *ch)
{
PBTNode p,q,n,r;
int flag; //找到要删除的结点,将他的叶子数据
r = search(T,ch); //赋值给他,将叶子的双亲的孩子为NULL
if(r==NULL) //释放叶子空间
{ //如果要删的是根结点,直接将里面的数据
printf("没有找到!\n"); //赋空
return 0;
}
else
{
p = searchfather(T,r,&flag);
if((r->left)!=NULL)
{
q = r->left;
while((q->left)!=NULL)
{
q = q->left;
}
r->data = q->data;
p = searchfather(T,q,&flag);
free(q);
if(flag==0)
{
p->left = NULL;
}
else if(flag==1)
{
p->right = NULL;
}
}
else
{
if((r->right)!=NULL)
{
q = r->right;
while((q->right)!=NULL)
{
q = q->right;
}
r->data = q->data;
p = searchfather(T,q,&flag);
free(q);
q = NULL;
q = NULL;
if(flag==0)
{
p->left = NULL;
}
else if(flag==1)
{
p->right = NULL;
}
}
else
{
if(p == NULL)
{
stu h={" "," "," "," "};
T->data = h;
}
else
{
free(r);
r = NULL;
if(flag==0)
{
p->left = NULL;
}
else if(flag==1)
{
p->right = NULL;
}
}
}
}
}
return 0;
}
void change(PBTNode T,char *ch) //修改信息
{
PBTNode p;
char temp[20];
int i;
p = search(T,ch);
printf("\n1,修改姓名\n");
printf("2,修改学号\n");
printf("3,修改生日\n");
printf("4,修改号码\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入修改后的名字:");
scanf("%s",temp);
strcpy(p->data.name,temp);
break;
case 2:
printf("请输入修改后的学号:");
scanf("%s",temp);
strcpy(p->data.id,temp);
break;
case 3:
printf("请输入修改后的生日:");
scanf("%s",temp);
strcpy(p->data.date,temp);
break;
case 4:
printf("请输入修改后的号码:");
scanf("%s",temp);
strcpy(p->data.phone,temp);
break;
}
}
int main()
{
BiTree T;
int caseflag;
char ch[20];
stu items[4]={
{"zhaoyi","1979-01-01","15811111111","0807011001"},
{"qianer","1980-02-02","15822222222","0807011002"},
{"sunsan","1981-02-02","15833333333","0807011003"},
{"lisi" ,"1982-04-04","15844444444","0807011004"}};
creat(items,&T);
printf("中序遍历:\n");
inorder(T);
while(1)
{
printf("默认是中序遍历\n");
printf("\n1,按姓名查找\n");
printf("2,新增同学信息\n");
printf("3,修改同学信息\n");
printf("4,删除同学信息\n");
printf("5,前序遍历\n");
printf("6,后序遍历\n");
printf("7,退出\n");
scanf("%d",&caseflag);
if(caseflag == 7)
{
printf("退出\n");
break;
}
switch(caseflag)
{
case 1:
{
printf("请输入要查找的姓名:");
scanf("%s",ch);
if(search(T,ch)==NULL)
{
printf("无法找到\n");
}
break;
}
case 2:
{
stu x;
printf("请输入新增同学姓名:");
scanf("%s",x.name);
printf("请输入新增同学学号:");
scanf("%s",x.id);
printf("请输入新增同学生日:");
scanf("%s",x.date);
printf("请输入新增同学电话:");
scanf("%s",x.phone);
insertchild(T,x);
printf("新增:\n");
inorder(T);
break;
}
case 3:
{
memset(ch,0,sizeof(ch));
printf("请输入修改信息的姓名:");
scanf("%s",ch);
change(T,ch);
printf("修改后:\n");
inorder(T);
break;
}
case 4:
{
memset(ch,0,sizeof(ch));
printf("请输入要删除信息的姓名:");
scanf("%s",ch);
delete(T,ch);
printf("删除指定姓名后的同学录:\n");
inorder(T);
break;
}
case 5:
{
PreOrder(T);
break;
}
case 6:
{
PostOrder(T);
break;
}
}
}
return 0;
}
同学录--利用二叉树存储结构实现建立、查找、新增、修改、删除等功能
最新推荐文章于 2024-09-12 12:30:29 发布