简单的二叉树实现同学录,二叉树的建立,插入,查找,前序遍历。还有一个功能是删除,不过为了简便,就写了一个伪删除,看起来像删除了一样,其实没有,只是在找到要删除的点后给其付值‘#’,然后打印的时候遇到‘#’不打印,投机取巧,不过后面再插入的时候如果遇到了‘#’,我会在插进去,也就不会有很大的浪费,也算是满足删除的功能吧。
#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;
}