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

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

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值