实现学生通讯录管理的几个操作功能(新建、插入、删除、从文件中读取、写入文件和查询、屏幕输出等功能)。通讯录中学生的信息有学号、姓名、出生日期、性别、电话和地址等。
[内容] 1、利用链式存储结构来实现 2、系统的菜单功能项如下: 1----新建学生通讯录 2----向学生通讯录插入学生信息 3----在通讯录删除学生信息 4----在文件中读取通讯录信息 5----向文件中写入学生通讯录信息 6----在通讯录中查询学生信息 7----在屏幕中输出全部学生信息 8----退出 #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 100 #define len sizeof(Student) /*定义一个学生类型的结构体 sizeof(Student) 所用的空间的大小赋值给变量len*/ static int De; static int De2; typedef struct Classmaterecord *Position; typedef Position BinTree; BinTree BT; typedef struct Classmaterecord { int number; //学号 char name[N]; //姓名 char sex[N]; //性别 char phone[N]; //电话号码 BinTree Left;//左子树 BinTree Right; //右子树 }Student; void init()//初始化 { BT==NULL; } void Traversal( );//显示 先序、中序、后序实现遍历 void Preorder(BinTree BT); void Inorder(BinTree BT); void Postorder(BinTree BT); void Find();//查找 按学号、姓名、电话号码 void FindBynum(BinTree BT,int number); void FindByname(BinTree BT,char name[]); void FindByphone(BinTree BT,char phone[]); void FindBynum(BinTree BT,int number){//按照学号进行查找 if(BT!= NULL){ FindBynum(BT->Left,number); if(BT->number==number){ system("cls"); printf("\n==============================所查同学数据===========================\n"); printf("\n--------学号-------------姓名-----------性别-----------手机号码------\n"); printf("\n\t%3d\t",BT->number); printf("\t%3s\t",BT->name); printf("\t%3s\t",BT->sex); printf("\t%3s\t",BT->phone); printf("\n\n"); } FindBynum(BT->Right,number); } } void FindByname(BinTree BT,char name[]) //按照名字查找 遍历查找 { if(BT != NULL){ FindByname(BT->Left,name); if(strcmp(BT->name,name) == 0){ system("cls"); printf("\n===============================所查同学数据============================\n"); printf("\n--------学号-------------姓名-----------性别-----------手机号码-----\n"); printf("\n\t%3d\t",BT->number); printf("\t%3s\t",BT->name); printf("\t%3s\t",BT->sex); printf("\t%3s\t",BT->phone); printf("\n\n"); } FindByname(BT->Right,name); } } void FindByphone(BinTree BT,char phone[]){ //按照电话号码进行查找 if(BT!=NULL){ FindByphone(BT->Left,phone); if(strcmp(BT->phone,phone)==0){ system("cls"); printf("\n==============================所查同学数据==========================\n"); printf("\n--------学号-------------姓名-----------性别-----------手机号码-----\n"); printf("\n\t%3d\t",BT->number); printf("\t%3s\t",BT->name); printf("\t%3s\t",BT->sex); printf("\t%3s\t",BT->phone); printf("\n\n"); } FindByphone(BT->Right,phone); } } //显示前序遍历的结果 void Preorder(BinTree BT){ if(BT!=NULL){ printf("\n\t%d\t",BT->number); printf("\t%s\t",BT->name); printf("\t%s\t",BT->sex); printf("\t%s\t",BT->phone); printf("\n\n"); Preorder(BT->Left); Preorder(BT->Right); } } //中序遍历 void Inorder(BinTree BT){ if(BT!=NULL){ Inorder(BT->Left); printf("\n\t%3d\t",BT->number); printf("\t%3s\t",BT->name); printf("\t%3s\t",BT->sex); printf("\t%3s\t",BT->phone); printf("\n\n"); Inorder(BT->Right); } } //后序遍历 void Postorder(BinTree BT){ if(BT!=NULL){ Postorder(BT->Left); Postorder(BT->Right); printf("\n\t%3d\t",BT->number); printf("\t%3s\t",BT->name); printf("\t%3s\t",BT->sex); printf("\t%3s\t",BT->phone); printf("\n\n"); } } void Traversal() { printf("显示原来的预置数组里同学的信息\n"); printf("----------------------------------------------------------\n"); printf("(1)先序遍历预置数组里同学的信息\n"); printf("(2)中序遍历预置数组里同学的信息\n"); printf("(3)后序遍历预置数组里同学的信息\n"); printf("(0)返回主菜单\n"); printf("----------------------------------------------------------\n"); printf("请输入你的选择(0-3):\n"); int i; scanf("%d",&i); switch(i){ case 1: { system("cls"); printf("\n--------学号-------------姓名-----------性别-----------手机号码-----\n"); Preorder(BT); break; } case 2:{ system("cls"); printf("\n--------学号-------------姓名-----------性别-----------手机号码-----\n"); Inorder(BT); break; } case 3:{ system("cls"); printf("\n--------学号-------------姓名-----------性别-----------手机号码-----\n"); Postorder(BT); break; } case 0:system("cls"); break; } } void Find(){ printf(" 查找同学的信息\n"); printf("----------------------------------------------------------\n"); printf("(1)按照学号查找同学的信息\n"); printf("(2)按照姓名查找同学的信息\n"); printf("(3)按照电话查找同学的信息\n"); printf("(0)返回主菜单\n"); printf("----------------------------------------------------------\n"); printf("请输入你的选择(0-4): "); int i; scanf("%d",&i); if(i==1){ int number; printf("\n请输入学号:") ; scanf("%d",&number); FindBynum(BT,number); } else if(i==2){ char name[N]; printf("\n请输入姓名:") ; scanf("%s",name); FindByname(BT,name); } else if(i==3){ char phone[N]; printf("\n请输入手机号码:") ; scanf("%s",phone); FindByphone(BT,phone); } } void Delete();//删除 按学号、姓名、电话号码 void chazhao(BinTree BT, char name[]); void chazhao1(BinTree BT, char phone[]); BinTree DeleteBynum(BinTree BT,int number); Student *FindMin(BinTree BT) { if(!BT){ //空的二叉树,返回NULL return NULL; } else{ if(!BT->Left) return BT; //找到最左叶的结点并返回 else{ return FindMin(BT->Left); //沿着左分支继续查找 } } } void chazhao(BinTree BT, char name[])//有名字查找学号 { BinTree D; D=BT; if(D!=NULL) { chazhao(D->Left,name); chazhao(D->Right,name); if(strcmp(D->name,name)==0){ De=D->number; } } } void chazhao1(BinTree BT, char phone[]) //由电话查找学号 { BinTree D; D=BT; if(D!=NULL){ chazhao1(D->Left,phone); chazhao1(D->Right,phone); if(strcmp(D->phone ,phone)==0){ De2=D->number; } } } BinTree DeleteBynum(BinTree BT,int number){ //由学号删除 BinTree Tmp; if( !BT ) printf("要删除的元素未找到"); else { if( number<BT->number ) BT->Left = DeleteBynum( BT->Left, number ); /* 从左子树递归删除 */ else if( number> BT->number ) BT->Right = DeleteBynum( BT->Right,number ); /* 从右子树递归删除 */ else { /* BT就是要删除的结点 */ /* 如果被删除结点有左右两个子结点 */ if( BT->Left && BT->Right ) { /* 从右子树中找最小的元素填充删除结点 */ Tmp = FindMin( BT->Right ); BT->number=Tmp->number; strcpy(BT->name,Tmp->name); strcpy(BT->phone,Tmp->phone); strcpy(BT->sex,Tmp->sex); /* 从右子树中删除最小元素 */ BT->Right = DeleteBynum( BT->Right, BT->number ); } else { /* 被删除结点有一个或无子结点 */ Tmp = BT; if( !BT->Left ) /* 只有右孩子或无子结点 */ BT = BT->Right; else /* 只有左孩子 */ BT = BT->Left; free( Tmp ); } } } return BT; } void Delete()//删除按学号、姓名、电话号码 { printf(" 删除同学的信息\n"); printf("----------------------------------------------------------\n"); printf("(1)根据学号做为索引删除同学的信息\n"); printf("(2)根据姓名作为索引删除同学的信息\n"); printf("(3)根据电话做为索引删除同学的信息\n"); printf("(0)返回主菜单\n"); printf("----------------------------------------------------------\n"); printf("请输入你的选择(0-3):\n"); int i; scanf("%d",&i); if(i==1){ int number; printf("请输入学号:"); scanf("%d",&number); DeleteBynum(BT,number); } else if(i==2){ char name[N]; printf("请输入姓名:"); scanf("%s",name); chazhao(BT,name); DeleteBynum(BT,De); } else if(i==3){ char phone[N]; printf("请输入手机号:"); scanf("%s",phone); chazhao1(BT,phone); DeleteBynum(BT,De2); } system("cls"); printf("\n====================================================================\n"); printf("\t*****************|| 删除成功! ||*****************\n"); printf("====================================================================\n"); } BinTree Add(int number,char name[],char sex[],char phone[],BinTree BT);//新增元素的添加(插入) void Modify();//修改 按学号、姓名、电话号码 void ModifyBynum(BinTree BT,int number); void ModifyByname(BinTree BT,char name[]); void ModifyByphone(BinTree BT,char phone[]); void add()//添加数据 { int number; printf("\n==================================添加同学数据===============================\n"); printf("\n"); printf("请输入学号:") ; scanf("%d",&number); printf("\n"); printf("请输入姓名:") ; char name[N]; scanf("%s",name); char sex[N]; printf("\n"); printf("请输入性别:") ; scanf("%s",sex); char phone[N]; printf("\n"); printf("请输入手机号:") ; scanf("%s",phone); BT = Add(number,name,sex,phone,BT); system("cls"); } BinTree Add(int number,char name[],char sex[],char phone[],BinTree BT) { if(BT==NULL){ // 判断根节点是否有人,没有人则执行插入操作 BT=(Student*)malloc(len); BT->number=number; strcpy(BT->name,name); strcpy(BT->sex,sex); strcpy(BT->phone,phone); BT->Left=NULL; BT->Right=NULL; } else{ //如果根结点有人 if(number<BT->number){ //如果插入的学号比根结点的学号小,则放在左孩子结点 BT->Left=Add(number,name,sex,phone,BT->Left); } else if(number>BT->number){ //插入的学号比根节点的学号要大,则放在右孩子结点 BT->Right=Add(number,name,sex,phone,BT->Right); } else if(number=BT->number){ printf("插入结点失败,插入失败的结点是%d%s\n:",number,BT->name); } } return BT; }//插入失败 void ModifyBynum(BinTree BT,int number)//按学号修改 { int k; if (BT != NULL){ ModifyBynum(BT->Left,number); if(BT->number==number){ printf("\t%d\t", BT->number); printf("%s\t", BT->name); printf("%s\t", BT->sex); printf("%s\n", BT->phone); while(1){ printf("\n\n"); printf(" 1: 姓名\n"); printf(" 2: 性别\n"); printf(" 3: 电话\n"); printf(" 0:退出修改\n"); scanf("%d",&k); switch(k){ case 1:{ char name[N]; printf("请输入名字:"); scanf("%s",&name); strcpy(BT->name,name); }break; case 2:{ char sex[N]; printf("请输入性别:"); scanf("%s",&sex); strcpy(BT->sex,sex); }break; case 3:{ char phone[N]; printf("请输入新号码:"); scanf("%s",phone); strcpy(BT->phone,phone); }break; case 4:{ printf("\t学号\t姓名\t性别\t电话\n"); printf("\t%d\t",BT->number); printf("%s\t",BT->name); printf("%s\t",BT->sex); printf("%s\n",BT->phone); printf("\n"); }break; case 0:break; } if(k==0)break; } system("cls"); } ModifyBynum(BT->Right,number); } } void ModifyByname(BinTree BT,char name[])//按姓名修改 { int k; if(BT != NULL){ ModifyByname(BT->Left,name); if(strcmp(BT->name,name)==0){ printf("\t%d\t", BT->number); printf("%s\t", BT->name); printf("%s\t", BT->sex); printf("%s\n", BT->phone); while(1){ printf("\n\n"); printf(" 1: 姓名\n"); printf(" 2: 性别\n"); printf(" 3: 电话\n"); printf(" 0:退出修改\n"); scanf("%d",&k); switch(k){ case 1:{ char name[N]; printf("请输入名字:"); scanf("%s",&name); strcpy(BT->name,name); }break; case 2:{ char sex[N]; printf("请输入性别:"); scanf("%s",&sex); strcpy(BT->sex,sex); }break; case 3:{ char phone[N]; printf("请输入新号码:"); scanf("%s",phone); strcpy(BT->phone,phone); }break; case 4:{ printf("\t学号\t姓名\t性别\t电话\n"); printf("\t%d\t",BT->number); printf("%s\t",BT->name); printf("%s\t",BT->sex); printf("%s\n",BT->phone); printf("\n"); }break; case 0:break; } if(k==0)break; } system("cls"); } ModifyByname(BT->Right,name); } } void ModifyByphone(BinTree BT,char phone[])//按手机号修改 { int k; if(BT != NULL){ ModifyByphone(BT->Left,phone); if(strcmp(BT->phone,phone)==0){ printf("\t%d\t", BT->number); printf("%s\t", BT->name); printf("%s\t", BT->sex); printf("%s\n", BT->phone); while(1){ printf("\n\n"); printf(" 1: 姓名\n"); printf(" 2: 性别\n"); printf(" 3: 电话\n"); printf(" 0:退出修改\n"); scanf("%d",&k); switch(k){ case 1:{ char name[N]; printf("请输入名字:"); scanf("%s",&name); strcpy(BT->name,name); }break; case 2:{ char sex[N]; printf("请输入性别:"); scanf("%s",&sex); strcpy(BT->sex,sex); }break; case 3:{ char phone[N]; printf("请输入新号码:"); scanf("%s",phone); strcpy(BT->phone,phone); }break; case 4:{ printf("\t学号\t姓名\t性别\t电话\n"); printf("\t%d\t",BT->number); printf("%s\t",BT->name); printf("%s\t",BT->sex); printf("%s\n",BT->phone); printf("\n"); }break; case 0:break; } if(k==0) break; } system("cls"); } ModifyByphone(BT->Right,phone); } } void Modify(){ //修改 按学号、姓名、电话号码 printf(" 修改同学的信息\n"); printf("----------------------------------------------------------\n"); printf("(1)根据学号做为索引修改同学的信息\n"); printf("(2)根据姓名作为索引修改同学的信息\n"); printf("(3)根据电话做为索引修改同学的信息\n"); printf("(0)返回主菜单\n"); printf("----------------------------------------------------------\n"); printf("请输入你的选择(0-3):\n"); int i; scanf("%d",&i); if(i==1){ int number; printf("请输入学号:"); scanf("%d",&number); ModifyBynum(BT,number);} else if(i==2){ char name[N]; printf("请输入姓名:"); scanf("%s",name); ModifyByname(BT,name); } else if(i==3){ char phone[N]; printf("请输入手机号:"); scanf("%s",phone); ModifyByphone(BT,phone); } } //主函数 int main(){ //预置数组信息 BT=Add(01,"张常超","男","15537271222",BT); BT=Add(02,"刘鹏翔","男","15514902622",BT); BT=Add(03,"程龙","男","12345678901",BT); int n=-1; while(n!=0){ // 系统首页 printf("\n\t\t\t *********************"); printf("\n\t\t\t|| 同学录管理系统 ||\n"); printf("*******************************************************************\n"); printf(" 1:显示原来的预置数组里同学的信息 \n\n"); printf(" 2:查找同学的信息 \n\n"); printf(" 3:修改同学录信息 \n\n"); printf(" 4:添加新同学信息 \n\n"); printf(" 5:删除同学录信息 \n\n"); printf(" 0:退出该系统\n\n"); printf("*******************************************************************\n"); printf("选择您要进行的操作前的序号(0~5): "); scanf("%d",&n); system("cls"); switch(n){ case 0:{ break; } case 1:{ Traversal(); break; } case 2:{ Find(); break; } case 3:{ Modify(); break; } case 4:{ add(); break; } case 5:{ Delete(); break; } } } }