简单的二叉树实现同学录,二叉树的建立,插入,查找,前序遍历。有个清除输入缓冲区的函数。

简单的二叉树实现同学录,二叉树的建立,插入,查找,前序遍历。还有一个功能是删除,不过为了简便,就写了一个伪删除,看起来像删除了一样,其实没有,只是在找到要删除的点后给其付值‘#’,然后打印的时候遇到‘#’不打印,投机取巧,不过后面再插入的时候如果遇到了‘#’,我会在插进去,也就不会有很大的浪费,也算是满足删除的功能吧。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
struct node                            //树的结点。
{
    int lvl;
    char *name;
    char *number;
    char *birthday;
    char *tel_num;
    struct node *left;
    struct node *right;
};

struct node *bin_tree = NULL;
int judge = 0;

void clear()                           //清空输入缓冲区。
{
    char c;
    while((c = getchar()) != '\n'&&c != EOF)
    {
        ;
    }
}
struct node * cre_tree()               //建立树,给树赋值。
{
    struct node *new;
    char *c = (char *)malloc(20);
    char *name = (char *)malloc(20);
    char *number = (char *)malloc(20);
    char *birthday = (char *)malloc(20);
    char *tel_num = (char *)malloc(20);
    printf("输入姓名:");
    scanf("%s",name);
    if(*name == '#')
    {
        new = NULL;
    }
    else
    {
        new = (struct node *)malloc(sizeof(struct node));
        new->name = (char *)malloc(20);
        new->number = (char *)malloc(20);
        new->birthday = (char *)malloc(20);
        new->tel_num = (char *)malloc(20);
        strcpy(new->name,name);
        printf("输入学号:");
        scanf("%s",number);
        strcpy(new->number,number);
        printf("输入生日:");
        scanf("%s",birthday);
        strcpy(new->birthday,birthday);
        printf("输入电话:");
        scanf("%s",tel_num);
        strcpy(new->tel_num,tel_num);
        printf("输入%s的左子树:\n",new->name);
        new->left = cre_tree();
        printf("输入%s的右子树:\n",new->name);
        new->right = cre_tree();
    }
    return new;
}
void judge_node(struct node *root,char *c)
{
    if(root != NULL)
    {
        if(strcmp(root->name,c) == 0)
 {
     judge = 1;
 }
        judge_node(root->left,c);
 judge_node(root->right,c);
    }
}
void search(struct node *root,char *c)
{
    if(root != NULL)
    {
        if(strcmp(root->name,c) == 0)
 {
     printf("%s  %s  %s  %s\n",root->name,root->number,root->birthday,root->tel_num);
 }
        search(root->left,c);
 search(root->right,c);
    }
}
void preord(struct node *root)         //前序遍历打印二叉树。     
{
    if(root != NULL)
    {
        if(strcmp(root->name,"#")!=0)
        {
     printf("%s  %s  %s  %s\n",root->name,root->number,root->birthday,root->tel_num);
 }
 preord(root->left);
 preord(root->right);
    }
}
void add_node(struct node *root)
{
    char *name = (char *)malloc(20);
    char *number = (char *)malloc(20);
    char *birthday = (char *)malloc(20);
    char *tel_num = (char *)malloc(20);
    if(root->right == NULL)
    {
        struct node *new = (struct node *)malloc(sizeof(struct node));
        new->name = (char *)malloc(20);
        new->number = (char *)malloc(20);
        new->birthday = (char *)malloc(20);
        new->tel_num = (char *)malloc(20);
        printf("输入新增同学姓名:");
        scanf("%s",name);
        strcpy(new->name,name);
        printf("输入新增同学学号:");
        scanf("%s",number);
        strcpy(new->number,number);
        printf("输入新增同学生日:");
        scanf("%s",birthday);
        strcpy(new->birthday,birthday);
        printf("输入新增同学电话:");
        scanf("%s",tel_num);
        strcpy(new->tel_num,tel_num);
        root->right = new;
        new->left = NULL;
        new->right = NULL;
    }
    else
    {
        add_node(root->right);
    }
}

void alter_print()
{
    printf("1.:修改学号\n");
    printf("2.:修改生日\n");
    printf("3.:修改电话\n");
    printf("4.:不修改\n");
}

void alter_node(struct node *root,char *c)//修改信息
{
    int i = 0;
    char *number = (char *)malloc(20);
    char *birthday = (char *)malloc(20);
    char *tel_num = (char *)malloc(20);
    int flag;
    if(root != NULL)
    {
        if(strcmp(root->name,c) == 0)
        {
            while(i <=0)
            {
                 alter_print();
                 scanf("%d",&flag);
                 switch(flag)
                 {
                 case 1:
                     printf("请输入修改后的学号:");
                     scanf("%s",number);
                     strcpy(root->number,number);
                     break;
                 case 2:
                     printf("输入修改后的生日:");
                     scanf("%s",birthday);
                     strcpy(root->birthday,birthday);
                     break;
                 case 3:
                     printf("输入修改后的电话:");
                     scanf("%s",tel_num);
                     strcpy(root->tel_num,tel_num);
                     break;
                 case 4:
                     i = 1;
                     break;
                 default:
                     break;
                 }
             }
        }
        search(root->left,c);
        search(root->right,c);
    }
}

void print_choice()
{
    printf("1.按姓名查找:\n");
    printf("2.新增同学信息:\n");
    printf("3.修改同学信息:\n");
    printf("4.删除学生信息:\n");
    printf("5.显示:\n");
    printf("6.退出:\n");
}

void del_node(struct node *root,char *c)              
{
    if(root != NULL)
    {
        if(strcmp(root->name,c) == 0)
        {
            strcpy(root->name,"#");
        }
        del_node(root->left,c);
        del_node(root->right,c);
    }
}
int main()
{
    int flag;
    char *search_name = (char *)malloc(30);
    char *alter_name = (char *)malloc(30);
    char *del_name = (char *)malloc(30);
    printf("创建同学录:\n");
    bin_tree = cre_tree();
    printf("先序遍历:\n");
    preord(bin_tree);
    print_choice();
    while(1)
    {
        scanf("%d",&flag);
        switch(flag)
        {
        case 1:
            printf("请输入要查找的姓名:");
            scanf("%s",search_name);
            judge_node(bin_tree,search_name);
  	    if(judge == 0)
            {
                printf("查无此人。\n");
            }
            search(bin_tree,search_name);
            print_choice();
            break;
        case 2:
            printf("新增:\n");
            add_node(bin_tree);
            printf("姓名  学号  生日  电话\n");
            preord(bin_tree);
            print_choice();
            break;
        case 3:
            printf("请输入要修改信息的姓名:");
            scanf("%s",alter_name);
            alter_node(bin_tree,alter_name);
            printf("姓名  学号  生日  电话\n");
            preord(bin_tree);
            print_choice();
            break;
        case 4:
            printf("请输入要删除信息的姓名:");
            scanf("%s",del_name);
            del_node(bin_tree,del_name);
            printf("姓名  学号  生日  电话\n");
            preord(bin_tree);
            print_choice();
            break;
        case 5:
            printf("姓名  学号  生日  电话\n");
            preord(bin_tree);
            print_choice();
            break;
        case 6:
            exit(0);
        default:
            break;
        }
    }
    return 0;
}
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值