同学录管理系统
实现学生通讯录管理的几个操作功能(新建、插入、删除、从文件中读取、写入文件和查询、屏幕输出等功能)。通讯录中学生的信息有学号、姓名、出生日期、性别、电话和地址等。
[内容]
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;
}
}
}
}