C语言动态通讯录的实现

1.主函数

通过枚举,结构体来构建基础

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<stdlib.h>
#define Max_Name  20
#define Max_Address 20
#define Max_Sex 2
#define Max_phone 20
#define Max     1000
#define SZ    2
#define Begin 3
//enum effitient
//{
//	a = 20,b=20
//};
enum option
{
	Exist,Add,Print,Del,Sort,Search,Change
};
enum option2
{
	name=1,age,tele,addr,sex
};
typedef struct peo 
{
	char name[Max_Name];
	char sex[Max_Sex];
	int age;
	char Phone_Number[Max_phone];
	char address[Max_Address];
}peo;

typedef struct con
{
	peo* man;
	int num;
	int colum;
}con;
con every;

2.函数文件

实现功能

#include"Address_Book.h"

void menu()
{
	printf("*********通讯录*********\n");
	printf("* 1.增加      2.打印 ****\n");
	printf("* 3.删除      4.排序 ****\n");
	printf("* 5.查找      6.改变 ****\n");
	printf("***     0.退出        ***\n");
	printf("************************\n");
}
void iniCon(con* p)
{
	p->num = 0;
	p->man =(peo*)malloc(Begin*sizeof(peo));
	p->colum = Begin;
	memset(p->man, 0, sizeof(p->man));
}
void Add_man(con* p)
{
	if (p->colum == p->num)
	{
		printf("需要扩容\n");
		p->colum += SZ;
		p->man=(peo*)realloc(p->man, (p->colum) * sizeof(peo));
		/*perror("realloc");*/
		printf("扩容成功\n");
		
	}
	printf("请输入名字\n");
	scanf("%s", p->man[p->num].name);//为什么不加&符号,因为这是name是数组,数组名为首元素地址
	printf("请输入性别\n");
	scanf("%s", p->man[p->num].sex);
	printf("请输入年龄\n");
	scanf("%d", &(p->man[p->num].age));
	printf("请输入电话\n");
	scanf("%s", p->man[p->num].Phone_Number);
	printf("请输入地址\n");
	scanf("%s", p->man[p->num].address);
	printf("已成功录入!!!!\n");
	p->num++;
}
void Print_man(con*p)
{
	int a = 0;
	printf("%-2s\t%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "序号", "名字", "性别", "年龄", "电话", "地址");
	for (a = 0; a < p->num; a++)
	{
		printf("%-2d\t", a+1);
		printf("%-20s\t", p->man[a].name);
		printf("%-5s\t", p->man[a].sex);
		printf("%-5d\t", p->man[a].age);
		printf("%-12s\t", p->man[a].Phone_Number);
		printf("%-20s\n", p->man[a].address);
	}
}
void Del_man(con *p)
{
	int a;
	printf("请输入你想要清空的人\n");
	scanf("%d", &a);
	if (a < Max)
	{
		memset(&(p->man[a]), 0, sizeof(p->man[a]));
		printf("清除成功\n");
	}
	else
		printf("输入错误\n");
	
}
int sort_name(const void* p1,const void* p2)
{
	return strcmp(((peo*)p1)->name,((peo*)p2)->name);

}
int sort_sex(const void* p1, const void* p2)
{
	return strcmp(((peo*)p1)->sex, ((peo*)p2)->sex);

}
int sort_tele(const void* p1, const void* p2)
{
	return strcmp(((peo*)p1)->Phone_Number, ((peo*)p2)->Phone_Number);

}
int sort_addr(const void* p1, const void* p2)
{
	return strcmp(((peo*)p1)->address, ((peo*)p2)->address);

}
int sort_int(const void* p1, const void* p2)
{
	return ((peo*)p1)->age - ((peo*)p2)->age;
}

void Sort_man(con* p)
{
	int a;
	printf("你想用什么排序:1.名字  2.年龄  3.电话  4.地址  5.性别\n");
	scanf("%d", &a);
	switch (a)
	{
	case name:
		qsort(p->man, p->num, sizeof(peo), sort_name);
		break;
	case age:
		qsort(p->man, p->num, sizeof(p->man[0]), sort_int);
		break;
	case tele:
		qsort(p->man, p->num, sizeof(p->man[0]), sort_tele);
		break;
	case addr:
		qsort(p->man, p->num, sizeof(p->man[0]), sort_addr);
		break;
	case sex:
		qsort(p->man, p->num, sizeof(p->man[0]), sort_sex);
		break;
	default:
		break;
	}
}

void Search_man(con* p)
{
	char se[20];
	int m;
	int k;
	printf("你想要搜寻谁:>\n");
	while ((k = getchar()) != '\n' && k != EOF);
	fgets(se,20,stdin);
	se[strlen(se)-1] = '\0';
	int a;
	for (a = 0; a < p->num; a++)
	{
		if (!strcmp(p->man[a].name, se))
		{
			printf("恭喜,已找到\n");
			printf("%-2d\t", a + 1);
			printf("%-20s\t", p->man[a].name);
			printf("%-5s\t", p->man[a].sex);
			printf("%-5d\t", p->man[a].age);
			printf("%-12s\t", p->man[a].Phone_Number);
			printf("%-20s\n", p->man[a].address);
			break;
		}
		
	}
	if(a==p->num)
		printf("根本就没有,找不到的。\n");
}
void Change_man(con*p)
{
	int a;
	printf("你想改变哪一个人(输入序号):>\n");
	scanf("%d", &a);
	printf("请输入名字\n");
	scanf("%s", p->man[a].name);//为什么不加&符号,因为这是name是数组,数组名为首元素地址
	printf("请输入性别\n");
	scanf("%s", p->man[a].sex);
	printf("请输入年龄\n");
	scanf("%d", &(p->man[a].age));
	printf("请输入电话\n");
	scanf("%s", p->man[a].Phone_Number);
	printf("请输入地址\n");
	scanf("%s", p->man[a].address);
	printf("已成功改变!!!!\n");


}
void Exit(con*p)
{
	free(p->man);
	p->man = NULL;
}

3.主程序文件

控制程序流程

#define _CRT_SECURE_NO_WARNINGS 1
#include"Address_Book.h"
//动态版
int main()

{
	 iniCon(&every);
	 every.man[1].age = 19;
	 strcpy (every.man[1].name , "233");
	 strcpy (every.man[1].Phone_Number ,"1128282882");
	 strcpy(every.man[1].address, "西南大学");
	 strcpy(every.man[1].sex, "男");


	 every.man[2].age = 20;
	 strcpy(every.man[2].name, "2蛮吧");
	 strcpy(every.man[2].Phone_Number, "28282882191");
	 strcpy(every.man[2].sex, "男");
	 strcpy(every.man[2].address, "重庆大学");

	 every.man[0].age = 22;
	 strcpy(every.man[0].Phone_Number, "22838322221");
	 strcpy(every.man[0].name, "3蛮吧");
	 strcpy(every.man[0].sex, "男");
	 strcpy(every.man[0].address, "重邮大学");
	 every.num = 3;

	int input;
	
	do {
		menu();
		scanf("%d", &input);
		switch (input)
		{
			case Add:
				Add_man(&every);
				system("cls");
				break;
			case Print:
				Print_man(&every);
				break;
			case Del:
				Del_man(&every);
				break;
			case Sort:
				Sort_man(&every);
				Print_man(&every);
				break;
			case Search:
				Search_man(&every);
				break;
			case Change:
				Print_man(&every);
				Change_man();
				Print_man(&every);
			break;
			case 0:
				printf("已退出\n");
				Exit(&every);
				break;
			default:
				printf("输入错误请重试\n");
				break;
		}
		
	} while (input);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值