排序二叉树实现同学录

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

/************************************************************************/  
/*               排序二叉树实现同学录                                                */  
/************************************************************************/  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>
typedef int ElemType;  
typedef struct Student
{  
    int num;  
	char name[20];
	char birthday[20];
	char tel[20];
}Student;  
typedef struct BiTNode
{  
	struct Student stu;
    struct BiTNode *lchild,*rchild;  
}BiTNode,*BiTree;  
int SearchBST(BiTree T,int num,BiTree f,BiTree *p,char name[])
{
    if(!T)
    {
        *p = f;
		return 0;
    }
	else
	{
	    if(!strcmp(name,T->stu.name))
	    {
	        *p = T;
			return 1;
	    }
		else
		{
		    if(num < T->stu.num)
		    { 
		        return SearchBST(T->lchild,num,T,p,name);
		    }
			else
			{
			    return SearchBST(T->rchild,num,T,p,name);
			}
		}
	}
}
void ProOrderTraverse(BiTree T)
{
    if(T==NULL)
    {    
        return;
    }
	else
	{
	
	    printf("name:     ");
	    printf("num:      ");
	    printf("birthday  ");
	    printf("tel       ");
	    printf("\n");
	    printf("%-10s",T->stu.name);
	    printf("%-10d",T->stu.num);
	    printf("%-10s",T->stu.birthday);
	    printf("%-10s",T->stu.tel);
	    printf("\n");
		ProOrderTraverse(T->lchild);
		ProOrderTraverse(T->rchild);
	}
}

int InsertBST(BiTree *T,int num,char name[],char birthday[],char tel[])
{
    BiTree p,s;
	if(!SearchBST(*T,num,NULL,&p,name))
	{
	    s = (BiTree)malloc(sizeof(BiTNode));
		s->stu.num= num;
		strcpy(s->stu.name,name);
		strcpy(s->stu.birthday,birthday);
		strcpy(s->stu.tel,tel);
		s->lchild = s->rchild =NULL;
		if(!p)
		{
		    *T = s;
		}
		else
		{
		    if(num<(p->stu.num))
		    {
		        p->lchild = s;
		    }
			else
			{
			    p->rchild = s;
			}
		}
		return 1;
	}
	else
	{
	    return 0;
	}
    
}

void InsertStudent(BiTree *T)
{
	int num;
    char name[20];
	char birthday[20];
	char tel[20];
	
	printf("Insert name:\n");
	scanf(" %s",&name);
	printf("Insert num:\n");
	scanf(" %d",&num);
	printf("Insert birthday:\n");
	scanf(" %s",&birthday);
	printf("Insert tel:\n");
	scanf(" %s",&tel);
	InsertBST(T,num,name,birthday,tel);
	//printf("\n");
}


int DeleteBST(BiTree *T,char name[])
{
    if(!*T)
    {
		return 0;
    }
	else
	{
	    if(!strcmp(name,(*T)->stu.name))
	    {
			return Delete(T);
	    }
		else
		{
		    return DeleteBST(&(*T)->lchild,name);
		    return DeleteBST(&(*T)->rchild,name);
		}
	}
}
int Delete(BiTree *p)
{
    BiTree q,s;
	if((*p)->rchild == NULL)
	{
	    q = *p;
		*p = (*p)->lchild;
		free(q);
	}
	else
	{
	    if((*p)->lchild == NULL)
	    {
			q = *p;
			*p = (*p)->rchild;
			free(q);
	    }
		else
		{
			q = *p;
			s = (*p)->lchild;
			while(s->rchild)
			{
			    q = s;
				s = s->rchild;
			}
			(*p)->stu.num=s->stu.num;
			strcpy((*p)->stu.name,s->stu.name);
			strcpy((*p)->stu.birthday,s->stu.birthday);
			strcpy((*p)->stu.tel,s->stu.tel);
			if(q != *p)
			{
			    q->rchild = s->lchild;
			}
			else
			{
			    q->lchild = s->lchild;
			}
			free(s);
		}
	}
	return 1;
}
void DeleteStudent(BiTree *T)
{
    char name[20];
	printf("Delete the name:\n");
	scanf(" %s",&name);
	DeleteBST(T,name);
}



int AlterBST(BiTree *T,char name[])
{
    if(!*T)
    {
		return 0;
    }
	else
	{
	    if(!strcmp(name,(*T)->stu.name))
	    {
			return Alter(T);
	    }
		else
		{
		    return AlterBST(&(*T)->lchild,name);
		    return AlterBST(&(*T)->rchild,name);
		}
	}
}
int Alter(BiTree *p)
{
	int num;
    char name[20];
	char birthday[20];
	char tel[20];
	printf("name:	  ");
	printf("num:	  ");
	printf("birthday  ");
	printf("tel 	  ");
	printf("\n");
	printf("%-10s",(*p)->stu.name);
	printf("%-10d",(*p)->stu.num);
	printf("%-10s",(*p)->stu.birthday);
	printf("%-10s",(*p)->stu.tel);
	printf("\n");

	printf("Alter the name to:\n");
	scanf(" %s",&name);
	printf("Alter the num to:\n");
	scanf(" %d",&num);
	printf("Alter the birthday to:\n");
	scanf(" %s",&birthday);
	printf("Alter the tel to:\n");
	scanf(" %s",&tel);
	(*p)->stu.num=num;
	strcpy((*p)->stu.name,name);
	strcpy((*p)->stu.birthday,birthday);
	strcpy((*p)->stu.tel,tel);
	return 1;
}

void AlterStudent(BiTree *T)
{
	char name[20];
	printf("Alter the name:\n");
	scanf(" %s",&name);
	AlterBST(T,name);
}

int main()  
{  
    int i;
	//int num=101010;
    //char name[20]="chen";
	//char birthday[20]="1990-1-1";
	//char tel[20]="1234567890";
	BiTree T=NULL;

	while(1)
	{
		printf("1.Show student\n");
		printf("2.Insert student\n");
		printf("3.Delete student\n");
		printf("4.Alter student\n");

        do
        {
			scanf(" %d",&i);
        }while(i!=1&&i!=2&&i!=3&&i!=4);
		
		system("clear");
		switch(i)
		{
		    case 1:
				{
					ProOrderTraverse(T);
					break;
				}
		    case 2:
				{
					
					ProOrderTraverse(T);
					InsertStudent(&T);
					break;
				}
			case 3:
				{
					ProOrderTraverse(T);
					DeleteStudent(&T);
					ProOrderTraverse(T);
					break;
				}
			case 4:
				{
					
					ProOrderTraverse(T);
					AlterStudent(&T);
					break;
				}
			default:
				{
					break;
				}
		}

		
	}

    return 0;  
} 

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值