C语言实现通讯录系统——容量自增,文件版本


     头文件maillist.h


#ifndef _MAILLIST_H_
#define _MAILLIST_H_

#include<stdio.h>
#include<windows.h>
#include<assert.h>
#define INIT_MAIL_SIZE 64          //定义宏表示通讯录容量
#define INC_SIZE 64             //宏表示自增容量
#define FILE_NAME "maillistFile.txt"    
#pragma warning (disable:4996)
typedef struct person   //结构体变量,指针,二级指针。表示人的姓名等信息
{
	char name[32];
	char sex[4];
	char age[4];
	char tel[16];
	char address[64];
}person_t, *person_p, **person_pp;
typedef struct mail    //结构体变量,指针,二级指针。表示通讯录相关信息
{
	int size;
	int cap;
	person_p maillist;
}mail_t, *mail_p, **mail_pp;
//相关函数的声明
void menu();
void initMail(mail_pp m);
void addMail(mail_p m, person_p p);
void deleteMail(mail_p m);
void findMail(mail_p m);
void changeMail(mail_p m);
void desplayMail(mail_p m);
void clearMail(mail_p m);
void nameSort(mail_p m);
void desdoryMail(mail_p m);

int fileStore(mail_p m);
int fileLoad(mail_p m);

#endif 

     函数实现maillist.c

#include "maillist.h"    //引入头文件
//内部static函数,判断通讯录,满返回1,否则返回0
static int isMailFull(mail_p m)
{
	assert(m); //断言
	return m->size >= m->cap ? 1 : 0;
}
//判断通讯录,为空时返回1,否则返回0
static int isMailEmpty(mail_p m)
{
	assert(m);
	if (m->size == 0)
	{
		printf("Your maillist is empty!\n");
		return 1;
	}
	return 0;
}
//通讯录容量自增函数
static int incMail(mail_p m)
{
	assert(m);
	person_p p = realloc(m->maillist, (m->cap + INC_SIZE)*sizeof(person_t));
	if (NULL == p)
	{
		perror("realloc");
		return 0;
	}
	m->maillist = p;
	m->cap += INC_SIZE;
	printf("inc success!\n");
	return 1;
}
//字符串比较
static int strCmp(const void* x, const void* y)
{
	return strcmp((*(person_p)x).name, (*(person_p)y).name);
}
//交换结构体变量
static void swap(person_p x, person_p y)
{
	person_t tmp = *x;
	*x = *y;
	*y = tmp;
}
//界面
void menu()
{
	printf("*************************************************************\n");
	printf("*************************************************************\n");
	printf("*******************  1. 添加联系人信息       ****************\n");
	printf("*******************  2. 删除指定联系人信息   ****************\n");
	printf("*******************  3. 查找指定联系人信息   ****************\n");
	printf("*******************  4. 修改指定联系人信息   ****************\n");
	printf("*******************  5. 显示所有联系人信息   ****************\n");
	printf("*******************  6. 清空所有联系人       ****************\n");
	printf("*******************  7. 以名字排序所有联系人 ****************\n");
	printf("*******************  0. 退出                 ****************\n");
	printf("*************************************************************\n");
	printf("*************************************************************\n");
}
//初始化通讯录,并用malloc函数为之分配空间
void initMail(mail_pp m)
{
	assert(m);
	*m = (mail_p)malloc(sizeof(mail_t));
	if (NULL == *m)
	{//判断内存分配是否成功
		perror("malloc");
		exit(1);
	}
	(*m)->maillist = (person_p)malloc(sizeof(person_t)*INIT_MAIL_SIZE);
	if (NULL == (*m)->maillist)
	{
		perror("malloc");
		exit(2);
	}
	(*m)->cap = INIT_MAIL_SIZE;
	(*m)->size = 0;
	fileLoad(*m);
}

int fileLoad(mail_p m)
{
	assert(m);
	FILE* fp = fopen(FILE_NAME, "rb");
	if (NULL == fp)
	{
		perror("fopen");
		return -2;
	}
	person_t p;
	while (1)
	{
		fread(&p, sizeof(person_t), 1, fp);
		if (feof(fp))
		{
			break;
		}
		addMail(m, &p);
	}
	fclose(fp);
	return 0;
}

int fileStore(mail_p m)
{
	assert(m);
	FILE* fp = fopen(FILE_NAME, "wb");
	if (NULL == fp)
	{
		perror("fopen");
		return -1;
	}
	int i = 0;
	for (i = 0; i < m->size; i++)
	{
		fwrite(m->maillist + i, sizeof(person_t), 1, fp);
	}
	fclose(fp);
	return 0;
}
//销毁分配的内存空间
void desdoryMail(mail_p m)
{
	assert(m);
	fileStore(m);//文件存储
	free(m->maillist);
	m->maillist = NULL;
	free(m);
	m = NULL;
}
//添加联系人
void addMail(mail_p m, person_p p)
{
	assert(m);
	if ((!isMailFull(m)) || incMail(m))
	{
		int pos = m->size;
		m->maillist[pos] = *p;
		m->size++;
	}
}
//删除联系人
void deleteMail(mail_p m)
{
	assert(m);
	if (!isMailEmpty(m))
	{
		char name[32];
		printf("Please input the name maillist you delete : ");
		scanf("%s", name);
		int i = 0;
		for (i = 0; i < m->size; i++)
		{
			if (strcmp(m->maillist[i].name, name) == 0)
			{
				swap(m->maillist + i, m->maillist + m->size - 1);
				m->size--;
			}
		}
		if (i == m->size)
		{
			printf("no man!\n");
		}
	}
}
//查找
void findMail(mail_p m)
{
	assert(m);
	if (!isMailEmpty(m))
	{
		char name[32];
		printf("Please input the name of maillist you find : ");
		scanf("%s", name);
		int i = 0;
		for (i = 0; i < m->size; i++)
		{
			if (strcmp(m->maillist[i].name, name) == 0)
			{
				printf("name\tsex\tage\ttel\t\taddress\n");
				printf("%s\t%s\t%s\t%s\t%s\n", m->maillist[i].name, m->maillist[i].sex,
					m->maillist[i].age, m->maillist[i].tel, m->maillist[i].address);
				break;
			}
		}
		if (i == m->size)
		{
			printf("no man!\n");
		}
	}
}
//修改
void changeMail(mail_p m)
{
	assert(m);
	if (!isMailEmpty(m))
	{
		printf("Please input the name of list you want to change ->");
		char name[32];
		scanf("%s", name);
		int i;
		for (i = 0; i < m->size; i++)
		{
			if (strcmp(name, m->maillist[i].name) == 0)
			{
			again:	printf("Please input message you want to change(name|sex|age|tel|address)->");
				char input[16];
				char change[64];
				scanf("%s", input);
				if (strcmp(input, "name") == 0)
				{
					printf("Please input new name ->");
					scanf("%s", change);
					strcpy(m->maillist[i].name, change);
				}
				else if (strcmp(input, "sex") == 0)
				{
					printf("Please input sex ->");
					scanf("%s", change);
					strcpy(m->maillist[i].sex, change);
				}
				else if (strcmp(input, "age") == 0)
				{
					printf("Please input age ->");
					scanf("%s", change);
					strcpy(m->maillist[i].age, change);
				}
				else if (strcmp(input, "tel") == 0)
				{
					printf("Please input new tel ->");
					scanf("%s", change);
					strcpy(m->maillist[i].tel, change);
				}
				else if (strcmp(input, "address") == 0)
				{
					printf("Please input new address ->");
					scanf("%s", change);
					strcpy(m->maillist[i].address, change);
				}
				else
				{
					goto again;
				}
				printf("Congratulationgs,you successed changemessage!\n");
				printf("Are you want to changed again?(Y|N)\n");
				char s = 0;
				getchar();
				scanf("%c", &s);
				if ((s == 'y') || (s == 'Y'))
				{
					goto again;
				}
				else
				{
					break;
				}
			}
		}
		if (i == m->size)
		{
			printf("no man\n");
		}
	}
}
//显示全部联系人
void desplayMail(mail_p m)
{
	assert(m);
	if (!isMailEmpty(m))
	{
		printf("name\tsex\tage\ttel\t\taddress\n");
		int i = 0;
		for (i = 0; i < m->size; i++)
		{
			printf("%s\t%s\t%s\t%s\t%s\n", m->maillist[i].name, m->maillist[i].sex,
				m->maillist[i].age, m->maillist[i].tel, m->maillist[i].address);
		}
	}
}
//清空联系人
void clearMail(mail_p m)
{
	assert(m);
	if (!isMailEmpty(m))
	{
		m->size = 0;
		printf("clear mailist success!\n");
	}
}
//以名字排序所有联系人
void nameSort(mail_p m)
{
	assert(m);
	if (!isMailEmpty(m))
	{
		qsort(m->maillist, m->size, sizeof(person_t), strCmp);
	}
	desplayMail(m);
}

     测试main.c

#include "maillist.h"
//添加联系人
static void myAddMail(mail_p m)
{
	assert(m);
	person_t p;
	printf("name\tsex\tage\ttel\t\taddress\n");
	scanf("%s %s %s %s %s", &p.name, &p.sex, &p.age, &p.tel, &p.address);
	addMail(m, &p);
	printf("Congratulations,you successed addMessage!\n");
}

int main()
{
	mail_p mymail = NULL;
	initMail(&mymail);
	int input = 0;
	int done = 0;
	menu();
	while (!done)
	{
		printf("Please choose <0—7> : ");
		scanf("%d", &input);
		switch (input)
		{//选择对通讯录进行的操作
		case 0:
			printf("bye~\n");
			done = 1;
			break;
		case 1:
			myAddMail(mymail);
			break;
		case 2:
			deleteMail(mymail);
			break;
		case 3:
			findMail(mymail);
			break;
		case 4:
			changeMail(mymail);
			break;
		case 5:
			desplayMail(mymail);
			break;
		case 6:
			clearMail(mymail);
			break;
		case 7:
			nameSort(mymail);
			break;
		default:
			printf("error input!\n");
			break;
		}
	}
	desdoryMail(mymail);
	system("pause");
	return 0;
}


        如有错误,欢迎指出!







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值