同学录--利用二叉树存储结构实现建立、查找、新增、修改、删除等功能

来源:互联网 发布:机械编程学习 编辑:程序博客网 时间:2024/06/04 18:56
#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;     }

原创粉丝点击