C语言进阶——编写通讯录(动态内存管理、结构体)

C语言进阶——编写通讯录(动态内存管理、结构体)

实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
添加联系人信息
删除指定联系人信息
查找指定联系人信息
修改指定联系人信息
显示所有联系人信息
清空所有联系人
以名字排序所有联系人

#define MAX_SIZE 1000
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
typedef struct Information{
    
    
	char name[10];
	char sex[3];
	short age;
	char num[12];
	char addr[20];
}Information;
typedef struct TXL{
    
    
	Information *Person;
	short number;
}TXL;
//通讯录菜单
void menu(){
    
    
	printf("**********************************通讯录***********************************\n");
	printf("******************************1.添加联系人.1*******************************\n");
	printf("******************************2.删除联系人.2*******************************\n");
	printf("******************************3.查找联系人.3*******************************\n");
	printf("******************************4.修改联系人.4*******************************\n");
	printf("******************************5.显示联系人.5*******************************\n");
	printf("******************************6.清空联系人.6*******************************\n");
	printf("******************************7.排序联系人.7*******************************\n");
	printf("*********************************0.退出.0**********************************\n");
}
//初始化
void PerAgain(TXL *P){
    
    
	assert(P != NULL);
	P->Person= (Information *)malloc(sizeof(Information)*MAX_SIZE);
	memset(P->Person,0,sizeof(P->Person));
	P->number = 0;
}
//添加联系人
void AddPer(TXL *P){
    
    
	assert(P!=NULL);
	if (P->number<=MAX_SIZE){
    
    
		printf("请输入用户姓名:");
		scanf("%s",P->Person[P->number].name);
		printf("请输入用户性别:");
		scanf("%s", P->Person[P->number].sex);
		printf("请输入用户年龄:");
		scanf("%d", &(P->Person[P->number].age));
		printf("请输入用户电话:");
		scanf("%s", P->Person[P->number].num);
		printf("请输入用户家庭住址:");
		scanf("%s", P->Person[P->number].addr);
		printf("添加成功\n");
		P->number++;
	}
	else{
    
    
		printf("人员已满,添加失败\n");
	}
}
//查找联系人
int PSer(TXL *P){
    
    
	assert(P != NULL);
	char use[10];
	printf("请输入要查找的人物姓名:");
	scanf("%s", use);
	for (int i = 0; i < P->number; ++i){
    
    
		if (strcmp(P->Person[i].name, use) == 0){
    
    
			printf("找到你要找的人了\n");
			return i;
		}
	}
	printf("没找到你要找的人\n");
	return -1;
}
//删除联系人
void Deleted(TXL *P){
    
    
	assert(P!=NULL);
	for (int i = PSer(P); i < (P->number - 1)&&i>=0; ++i){
    
    
		P->Person[i] = P->Person[i + 1];
	}
	P->number--;
	printf("删除成功\n");
}
//修改联系人
void Exchange(TXL *P){
    
    
	assert(P != NULL);
	char use[10];
	int i;
	printf("请输入要修改的人物姓名:");
	scanf("%s", use);
	for (i = 0; i < P->number; ++i){
    
    
		if (strcmp(P->Person[i].name, use) == 0){
    
    
			break;
		}
	}
	printf("你要全部修改还是修改一项,全部请输入5,一个请输入1:");
	int input,in;
	scanf("%d",&input);
	switch(input){
    
    
	case 5:
		printf("请输入用户姓名:");
		scanf("%s", P->Person[i].name);
		printf("请输入用户性别:");
		scanf("%s", P->Person[i].sex);
		printf("请输入用户年龄:");
		scanf("%d", &(P->Person[i].age));
		printf("请输入用户电话:");
		scanf("%s", P->Person[i].num);
		printf("请输入用户家庭住址:");
		scanf("%s", P->Person[i].addr);
		printf("修改成功\n");
		break;
	case 1:
		printf("请输入你要修改哪一项,姓名0,性别1,年龄2,电话3,地址4:");
		scanf("%d",&in);
		switch (in){
    
    
		case 0:
			printf("请输入用户姓名:");
			scanf("%s", P->Person[i].name);
			break;
		case 1:
			printf("请输入用户性别:");
			scanf("%s", P->Person[i].sex);
			break;
		case 2:
			printf("请输入用户年龄:");
			scanf("%d", &(P->Person[i].age));
			break;
		case 3:
			printf("请输入用户电话:");
			scanf("%s", P->Person[i].num);
			break;
		case 4:
			printf("请输入用户家庭住址:");
			scanf("%s", P->Person[i].addr);
			break;
		}
		printf("修改成功\n");
		break;
	default:
		printf("格式错误\n");
		break;
	}
}
//显示联系人
void Show(TXL *P){
    
    
	assert(P!=NULL);
	printf("%-10s %-10s %-10s %-10s %-10s \n","姓名","性别","年龄","电话","家庭住址");
	for (int i = 0; i < P->number;++i){
    
    
		printf("%-10s %-10s %-10d %-10s %-10s \n", P->Person[i].name, P->Person[i].sex, P->Person[i].age, P->Person[i].num, P->Person[i].addr);
	}
}
//清空联系人
void Clock(TXL *P){
    
    
	assert(P != NULL);
	P->number = 0;
}
//排序联系人
int MyCmp(void*str1, void *str2){
    
    
	return *((char*)str1) - *((char*)str2);
}
void Sort(TXL *P){
    
    
	assert(P != NULL);
	qsort(P->Person, P->number, sizeof(Information),MyCmp);
	printf("排序完成\n");
}
//打开通讯录
void STXL(){
    
    
	TXL P;
	PerAgain(&P);
	int inp = 0;
	do{
    
    
		menu();
		printf("请输入你的操作:");
		scanf("%d",&inp);
		switch (inp){
    
    
		case 1:
			AddPer(&P);
			break;
		case 2:
			Deleted(&P);
			break;
		case 3:
			PSer(&P);
			break;
		case 4:
			Exchange(&P);
			break;
		case 5:
			Show(&P);
			break;
		case 6:
			Clock(&P);
			break;
		case 7:
			Sort(&P);
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("格式错误\n");
			break;
		}
	} while (inp);
}
int main(){
    
    
	STXL();
	system("pause");
	return 0;
}

排序这里有点小问题,不过不碍事,嘻嘻。运行没问题。

猜你喜欢

转载自blog.csdn.net/qq_45841205/article/details/110236901