#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; }