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;
}

有問題的地方請指出,不會的問題請提出。

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