C语言实现通讯录(动态分配内存)

#define _CRT_SECURE_NO_WARNINGS  //VS警告
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>     //头文件
#define Max_name 1024  //名字字节最大值
#define Max_sex  4
#define Max_number 15
#define Max_address 1024
typedef struct contact
{
	char name[Max_name];
	char sex[Max_sex];
	int age;
	char number[Max_number];
	char address[Max_address];
}contact;
typedef struct person{
	contact  *persinInfo;
	int sequence;
	int capacity; //当前数组的最大容量
}person;
person addr_num;
typedef void(*Fun)(person *);
void Init(person *addr_num){
	assert(addr_num !=NULL);
	addr_num->sequence = 0;
	addr_num->capacity = 10;
	addr_num->persinInfo = (contact*)malloc(sizeof(contact)*addr_num->capacity);

	for (int i = 0; i < addr_num->capacity; ++i){
		memset(addr_num->persinInfo[i].name, 0, Max_name);
		memset(addr_num->persinInfo[i].address, 0, Max_address);
		memset(addr_num->persinInfo[i].number, 0, Max_number);
		memset(addr_num->persinInfo[i].sex, 0, Max_sex);
		addr_num->persinInfo[i].age = 0;
	}
}
int print_menu(){
	printf("**********************************\n");
	printf("**    1. 添加联系人信息         **\n");
	printf("**    2. 删除指定联系人信息     **\n");
	printf("**    3. 查找指定联系人信息     **\n");
	printf("**    4. 修改指定联系人信息     **\n");
	printf("**    5. 显示所有联系人信息     **\n");
	//printf("**    6. 清空所有联系人         **\n");
	//printf("**    7. 以名字排序所有联系     **\n");
	//printf("**    8. 保存联系人到文件       **\n");
	//printf("**    9. 加载联系人             **\n");
	printf("**    0. 退出                   **\n");
	printf("**********************************\n");
	printf("请输入你要选择的选项:\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
void add_people(person *addr_num){

	assert(addr_num != NULL);
	if (addr_num->sequence >= addr_num->capacity)
	{
		addr_num->capacity += 10;
		addr_num->persinInfo = (contact *)realloc(addr_num->persinInfo,addr_num->capacity);
	}
	contact *per = &addr_num->persinInfo[addr_num->sequence];
	printf("请输入你要添加的名字\n");
	scanf("%s", per->name);
	printf("请输入你要添加的性别\n");
	scanf("%s",per->sex);
	printf("请输入你要添加的年龄\n");
	scanf("%d", &(per->age));
	printf("请输入你要添加的电话号码\n");
	scanf("%s", per->number);
	printf("请输入你要添加的地址\n");
	scanf("%s", per->address);
	++addr_num->sequence;
	printf("添加完成\n");


}
void del_people(person *addr_num){
	int choice = 0;
	assert(addr_num != NULL);

	if (addr_num->sequence==0)
	{
		printf("当前没有人可删,请添加后进行操作\n");
		return;
	}
	else {
		while (1){
			printf("请输入你要删除的人的序号:\n");
			scanf("%d", &choice);
			if (choice <= 0 || choice > addr_num->sequence){
				printf("没有该序号,请核对后进行选择\n");
				continue;
			}
			else {
				contact *p = &addr_num->persinInfo[choice-1];
				contact *per = &addr_num->persinInfo[addr_num->sequence - 1];
				strcpy(p->name, per->name);
				strcpy(p->sex, per->sex);
				strcpy(p->address, per->address);
				strcpy(p->number, per->number);
				p->age = per->age;
				--addr_num->sequence;
				break;
			}

		}
	}
		printf("已经删除\n");
	
}
void printf_people(person *addr_num){
	assert(addr_num != NULL);
	if (addr_num->sequence == 0){ printf("共有%d条记录\n", addr_num->sequence); return; }

	printf("共有%d条记录\n", addr_num->sequence);
	for (int i = 0; i < addr_num->sequence; ++i){
		contact*per = &addr_num->persinInfo[i];
		printf("序号[%d]\n", i+1);
		printf("姓名%s            电话号码:%s\n", per->name, per->number);
		printf("性别:%s       年龄:%d     住址:%s\n",per->sex, per->age, per->address);
		printf("\n");
	}
	printf("显示完成\n");
}
void find_people(person *addr_num){
	assert(addr_num != NULL);
	int choice = 0;
	char name[15];
	char number[15];
	int i = 0;
	while (1){
		printf("请输入你要查找的类型:\n");
		printf("1.姓名\n");
		printf("2.电话号\n");
		scanf("%d", &choice);
		if (choice != 1 && choice != 2){
			printf("输入错误请重新输入\n");
			continue;
		}
		else if (choice == 1){
			printf("请输入你要找的姓名\n");
			scanf("%s", name);
			for (i; i < addr_num->sequence; ++i){
				if (strcmp(name,&addr_num->persinInfo[i].name)==0){
					printf("该人的序号为%d\n", i+1);
					printf("姓名为:%s\n",addr_num->persinInfo[i].name);
					printf("性别为:%s\n", addr_num->persinInfo[i].sex);
					printf("年龄为:%d\n", addr_num->persinInfo[i].age);
					printf("电话为:%s\n",addr_num->persinInfo[i].number );
					printf("地址为:%s\n", addr_num->persinInfo[i].address);
					return;

				}

			}
		}
		else {
			printf("请输入你要找的电话:\n");
			scanf("%s", number);
			for (i; i < addr_num->sequence; ++i){
				if (strcmp(number, &addr_num->persinInfo[i].number) == 0){
					printf("该人的序号为%d\n", i + 1);
					printf("姓名为:%s\n", addr_num->persinInfo[i].name);
					printf("性别为:%s\n", addr_num->persinInfo[i].sex);
					printf("年龄为:%d\n", addr_num->persinInfo[i].age);
					printf("电话为:%s\n", addr_num->persinInfo[i].number);
					printf("地址为:%s\n", addr_num->persinInfo[i].address);
					return;
                  }
				
			}
		}
		printf("没找到人,请重新核对\n");
		return ;
	}
	return ;
}
void modify_people(person *addr_num){
	assert(addr_num != NULL);
	int choice = 0;
	while (1){
		printf("请输入你要修改的序号(输入0退出)\n");
		scanf("%d", &choice);
		if (choice == 0){ return; }
		if (choice<0 || choice>addr_num->sequence)
		{
			printf("没有该序号,请核对\n");
			continue;
		}
		else{
			printf("请输入你要修改的值:\n");
			printf("1.姓名\t2.性别\t3.年龄\t4.电话号码\t5.地址 \n");
            int choose = 0;
			scanf("%d", &choose);
			if (choose == 1){
				printf("请输入要修改的姓名:\n");
				scanf("%s", addr_num->persinInfo[choice-1].name);
				continue;
			}
			else if (choose == 2){
				printf("请输入要修改的性别:\n");
				scanf("%s", addr_num->persinInfo[choice - 1].sex);
				continue;;
			}
			else if (choose == 3){
				printf("请输入要修改的年龄:\n");
				scanf("%d", addr_num->persinInfo[choice - 1].age);
				continue;
			}
			else if (choose == 4){
				printf("请输入要修改的电话:\n");
				scanf("%s", addr_num->persinInfo[choice - 1].number);
			continue;
			}
			else if (choose == 5){
				printf("请输入要修改的地址:\n");
				scanf("%s", addr_num->persinInfo[choice - 1].address);
				continue;
			}
			else printf("选择错误\n");
		}

	}

}
int main(){

	Init(&addr_num);
	Fun arr[] = {
		NULL,
	  add_people,
 	  del_people,
 	  find_people,
 	  modify_people,
	  printf_people,
	  
	};
	int index = 0;
	while (1){
		index=print_menu();
		if (index==0)
		{
			printf("通讯录已结束\n");
			break;
		}
		else if (index<0 || index>6){
			printf("你输入的有误,请重新输入\n");
			continue;
		}
		system("cls");
		arr[index](&addr_num);
			}
	system("pause");
	return 0;
}

有问题的地方请指出,不会的问题请提出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章