同学录管理系统(C语言)

同学录管理系统

实现学生通讯录管理的几个操作功能(新建、插入、删除、从文件中读取、写入文件和查询、屏幕输出等功能)。通讯录中学生的信息有学号、姓名、出生日期、性别、电话和地址等。

[内容]

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;
				}
		}
	 	
	} 
} 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值