通讯录管理系统(文件版本)

在这里我做了备份的释放动态内存操作,防止忘了使用销毁操作导致的内存泄露!下面是源码:

contact.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<vld.h>
#include<assert.h>

#define MAX_NAME 20
#define MAX_TELE 20
#define MAX_ADDR 100
#define MAX_SEX 5

#define MAX_NUMPERSIN 1000
#define INCREAMENT 10

/*个人信息表*/
typedef struct Personinfo
{
	char name[MAX_NAME];				//姓名
	int age;										//年龄
	char tele[MAX_TELE];					//电话
	char addr[MAX_ADDR];				//地址
	char sex[MAX_SEX];						//性别

}Personinfo;

/*通讯录*/
typedef struct Contact
{
	Personinfo *per;		//存储每个人的数组
	int usedSize;			//被使用的个数
	int capticty;				//容量
}Contact;

/*初始化个人信息*/
void InitContact(Contact*);				//声明
/*添加个人信息*/
void AddContact(Contact*);
/*查找个人信息*/
int SearchContact(Contact*, char *);
/*删除元素*/
void DelContact(Contact*);
/*添加元素*/
void ShowContact(Contact *);
/*清空*/
void Clearcontact(Contact*);
/*选择打印个人信息*/
void Per_PrintContact(Contact *);
/*修改个人信息*/
void Modify_Perinfo(Contact *);
/*排序*/
void Sort_Contact(Contact *);
/*摧毁*/
void Destroy_Contact(Contact *);

contact.c

#include"contact.h"

void LoadContact(Contact *pCon)
{
	//加载函数
	int i = 0;
	Personinfo tmp = { 0 };
	FILE *fp = fopen("contact_number", "rb");
	assert(fp != NULL);

	while (fread(&tmp, sizeof(Personinfo), 1, fp))
	{
			pCon->per[pCon->usedSize] = tmp;
			pCon->usedSize++;			//读取成功,相当于每次usedSize加一次
	} 
	fclose(fp);
	fp = NULL;
}

void InitContact(Contact *pCon)			//初始化实现
{
	int i = 0;
	pCon->per = (Personinfo*)malloc(sizeof(Personinfo)*MAX_NUMPERSIN);
	if (pCon->per == NULL)
	{
		return;
	}
	pCon->usedSize = MAX_NUMPERSIN;
	pCon->usedSize = 0;					//使用个数初始化为0

	/*初始化个人信息*/
	memset(pCon->per, 0, sizeof(Personinfo)*MAX_NUMPERSIN);
	
	/*目的是每次初始化的时候会自动读取数据*/
	LoadContact(pCon);
}

/*扩容函数*/
int Broad_memory(Contact *pCon)
{
	if (pCon->per == pCon->usedSize)
	{
		Personinfo *p = (Personinfo *)realloc(pCon->per, pCon->capticty + INCREAMENT);
		if (p != NULL)			//分配内存成功的情况
		{
			pCon->per = p;
			pCon->capticty += INCREAMENT;
			p = NULL;
			printf("扩容成功!\n");
			return 1;
		}
	}

	return 0;
}

/*实现个人信息添加*/
void AddContact(Contact *pCon)
{
	Broad_memory(pCon);

	int i = 0;
	char *name[20] = { 0 };
	if (pCon->usedSize == MAX_NUMPERSIN)
	{
		printf("通讯录存储饱和\n");
		exit(0);
	}

	printf("请输入姓名:>");
	//scanf("%s", pCon->per[pCon->usedSize].name);
	scanf("%s", name);
	scanf("%*[^\n]"); scanf("%*c");

	for (i = 0; i < pCon->usedSize; i++)
	{
		if (strcmp((pCon->per[i].name), name) == 0)
		{
			int input = 0;
			printf("已存在该用户,确定要存放吗\n");
			printf("1、确定,2、取消本次操作\n");
			scanf("%d", &input);
			scanf("%*[^\n]"); scanf("%*c");
			if (input == 2)
			{
				printf("已取消本次操作!\n");
				return;
			}
			break;
		}
	}
	strcpy(pCon->per[pCon->usedSize].name, name);

	printf("请输入年龄:>");
	scanf("%d", &(pCon->per[pCon->usedSize].age));
	scanf("%*[^\n]"); scanf("%*c");
	printf("请输入性别:>");
	scanf("%s", pCon->per[pCon->usedSize].sex);
	scanf("%*[^\n]"); scanf("%*c");
	printf("请输入电话:>");
	scanf("%s", pCon->per[pCon->usedSize].tele);
	scanf("%*[^\n]"); scanf("%*c");
	printf("请输入地址:>");
	scanf("%s", pCon->per[pCon->usedSize].addr);
	scanf("%*[^\n]"); scanf("%*c");

	pCon->usedSize++;
	printf("添加成功!\n");
}

/*根据姓名查找个人信息*/
int SearchContact(Contact *pCon, char *Searname)
{
	int i = 0;
	if (pCon->usedSize == 0)
	{
		printf("通讯录为空\n");
		exit;
	}

	for (i = 0; i < pCon->usedSize; i++)
	{
		if (strcmp((pCon->per[i].name), Searname) == 0)
		{
			return i;
		}
	}
	return -1;
}

/*删除元素*/
void DelContact(Contact *pCon)
{
	char Delname[20] = { 0 };
	int n = 0;
	int i = 0;
	printf("请输入您想删除的人名\n");
	scanf("%s", Delname);
	n = SearchContact(pCon, Delname);			//找到要删除的位置
	if (n == -1)
	{
		printf("不存在该人名信息!\n");
		return;
	}
	for (i = n+ 1; i < pCon->usedSize ; i++)
	{
		pCon->per[i-1] = pCon->per[i];
	}
	pCon->usedSize--;
}

void ShowContact(Contact *pCon)
{
	int i = 0;

	if (pCon->usedSize == 0)
	{
		printf("目前没有存储信息,请先存储信息!\n");
		return;
	}

	printf("%-12s%-9s%-9s%-17s%-8s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pCon->usedSize; i++)
	{
		printf("%-12s%-9d%-9s%-17s%-8s\n", pCon->per[i].name, pCon->per[i].age,
			pCon->per[i].sex, pCon->per[i].tele, pCon->per[i].addr);
	}
}
/*清空信息*/
void Clearcontact(Contact *pCon)
{
	pCon->usedSize = 0;
}

/*打印个人信息*/
void Per_PrintContact(Contact *pCon, int n)
{
	printf("姓名:%s\t性别:%s\t年龄:%d\t电话号码:%s\t地址:%s\n", pCon->per[n].name,
		pCon->per[n].sex, pCon->per[n].age, pCon->per[n].tele, pCon->per[n].addr);
}
/*修改个人信息*/
void Modify_Perinfo(Contact *pCon)
{
	int i = 0;
	char name[20] = { 0 };
	printf("请输入你想修改人名\n");
	scanf("%s", name);

	for (i = 0; i < pCon->usedSize; i++)
	{
		if (strcmp((pCon->per[i].name), name) == 0)
		{
			printf("请输入新的人名:>");
			scanf("%s", pCon->per[i].name);
			printf("请输入年龄:>");
			scanf("%d", &(pCon->per[i].age));
			scanf("%*[^\n]"); scanf("%*c");
			printf("请输入性别:>");
			scanf("%s", pCon->per[i].sex);
			scanf("%*[^\n]"); scanf("%*c");
			printf("请输入电话:>");
			scanf("%s", pCon->per[i].tele);
			scanf("%*[^\n]"); scanf("%*c");
			printf("请输入地址:>");
			scanf("%s", pCon->per[i].addr);
			scanf("%*[^\n]"); scanf("%*c");
			break;
		}
	}

	if (i == pCon->usedSize)
	{
		printf("队列中没有您要修改的信息\n");
	}
}
/*排序(根据姓名)*/
void Sort_Contact(Contact *pCon)
{
	//冒泡排序
	int i = 0, j = 0;
	for (i = 0; i < pCon->usedSize - 1; i++)
	{
		for (j = 0; j < pCon->usedSize - 1 - i; j++)
		{
			int flag = 0;			//冒泡排序优化
			if ((strcmp(pCon->per[j].name,pCon->per[j + 1].name)) > 0)
			{
				Personinfo tmp = pCon->per[j];
				pCon->per[j] = pCon->per[j + 1];
				pCon->per[j + 1] = tmp;
				flag = 1;
			}
			if (flag == 0)
			{
				break;
			}
		}
	}
	printf("排序成功\n");
}

void keepContact(Contact *pCon)
{
	int i = 0;
	FILE *fp = fopen("contact_number", "wb");
	assert(fp != NULL);
	for (i = 0; i < pCon->usedSize; i++)
	{
		fwrite(&(pCon->per[i]), sizeof(Personinfo), 1, fp);
	}
	printf("存档成功!\n");
	fclose(fp);
	fp = NULL;
}

void Destroy_Contact(Contact *pCon)
{
	/*存储函数*/
	keepContact(pCon);

	free(pCon->per);
	pCon->per = NULL;
	pCon->capticty = 0;
	pCon->usedSize = 0;
}

test.c

#include"contact.h"

enum Option
{
	EXIT,  ADD,  SEARCH,  DEL,  SHOW,  CLEAR, MODIFY, SORT,DESTROY,
};


void menu()
{
	printf("***************************************\n");
	printf("**               MENU                **\n");
	printf("**        1、ADD      2、SEARCH      **\n");
	printf("**        3、DEL      4、SHOW        **\n");
	printf("**        5、CLEAR    6、MODIFY      **\n");
	printf("**        7、SORT     8、DESTROY     **\n");
	printf("**		0、EXIT              **\n");
	printf("***************************************\n");
}

void start()
{
	Contact pCon;
	int input = 0;			//选项
	char *Seaname = 0;
	InitContact(&pCon);
	
	//循环体
	do
	{
		menu();				//调用menu()
		printf("请输入选项>");
		scanf("%d", &input);
		scanf("%*[^\n]");scanf("%*c");

		switch (input)
		{
		case ADD:		//添加
			printf("----------存入信息-ing---------\n");
			AddContact(&pCon);
	//		printf("----------------------------------\n");
			break;
			
		case SEARCH:		//查找
			printf("----------查找-ing---------\n");
			printf("请输入您想查找的姓名>");
			char Searname[20] = { 0 };
			scanf("%s", Searname);
			int  n = SearchContact(&pCon, Searname);
			if (n != -1)
			{
				printf("找到了,他是在第%d号位置\n", n + 1);
				Per_PrintContact(&pCon, n);
			}
			else
				printf("不存在该用户信息\n");
		//	printf("----------------------------------\n");
			break;
		
		case DEL:		//删除
			printf("<*执行删除操作!!*>\n");
			DelContact(&pCon);
			printf("删除成功!\n");
		//	printf("----------------------------------\n");
			break;
		
		case SHOW:		//表示
			ShowContact(&pCon);
	//		printf("----------------------------------\n");
			break;
		
		case CLEAR:		//清空
			Clearcontact(&pCon);
			printf("清空成功!\n");
		//	printf("----------------------------------\n");
			break;

		case MODIFY:
			Modify_Perinfo(&pCon);
	//		printf("----------------------------------\n");
			break;
			 
		case SORT:		//排序
			Sort_Contact(&pCon);
		//	printf("----------------------------------\n");
			break;
		case DESTROY:		//摧毁
			Destroy_Contact(&pCon);
			printf("摧毁成功!\n");
			break;

		case EXIT:
			printf("退出!\n");
			break;

		default:		//错误输入处理
			printf("错误输入,请重新输入\n");
			scanf("%d", &input);
			scanf("%*[^\n]"); scanf("%*c");
			break;
		}
		if(input != 0)
		{
			printf("\n按任意键继续!\n");
			getch();
			system("cls");
		}
	} while (input);
	/*释放内存*/
	free(pCon.per);
	pCon.per = NULL;
}

int main()
{
	start();
	system("pause");
	return 0;
}
发布了25 篇原创文章 · 获赞 16 · 访问量 927

猜你喜欢

转载自blog.csdn.net/weixin_44024891/article/details/94470829