文件版本通讯录

1.contact.h

//#pragma once

#ifndef _CONTACT_H_
#define _CONTACT_H_

#include <stdio.h>
#include <windows.h>
#pragma warning (disable:4996)

#define MAX_NAME 10	
#define MAX_SEX 5
#define MAX_TELE 20
#define MAX_ADDR 30

#define CON_START 2		//初始通讯录大小  
#define INC_COUNT 10   //每次增容大小  

#define FILENAME "contact.txt"    //用来保存信息的文件  


typedef struct PeoInfo {	//个人信息结构体
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}Peo;

typedef struct Contact {	//通讯录信息结构体
	Peo* con;//结构体指针,数据存放的位置
	int count;//现在存放的个数
	int capacity;//容量
}Con, *pCon;

/*接口函数*/
void initContact(pCon pcon);//初始化通讯录

void add(pCon pcon);
void dele(pCon pcon);
void search(pCon pcon);
void modify(pCon pcon);
void show(pCon pcon);
void empty(pCon pcon);
void sort(pCon pcon);

void Loadcontact(pCon pcon);
void Savecontact(pCon pcon);
#endif

2.contact.c

#include "contact.h"

/*初始化*/
void initContact(pCon pcon)
{
	pcon->con = (Peo*)malloc(CON_START * sizeof(Peo));
	if (pcon->con == NULL) {
		printf("Out Of Memory\n");
		exit(EXIT_FAILURE);
	}
	memset(pcon->con, 0, CON_START * sizeof(Peo));
	pcon->count = 0;
	pcon->capacity = CON_START;//初始化最大容量为CON_START
}

void check(pCon pcon) //检测
{
	Peo *ptr = NULL;
	if (pcon->count == pcon->capacity) {
		ptr = (Peo*)realloc(pcon, (pcon->count + INC_COUNT) * sizeof(Peo));
		if (ptr == NULL) {
			printf("Out Of Memory\n");
			exit(EXIT_FAILURE);
		}
		else {
			pcon->con = ptr;
			pcon->capacity = pcon->capacity + INC_COUNT;
		}
	}
}

/*增加成员*/
void add(pCon pcon)
{
	check(pcon);
	printf("name:");
	scanf("%s", pcon->con[pcon->count].name);

	printf("age:");
	scanf("%d", &(pcon->con[pcon->count].age));

	printf("sex:");
	scanf("%s", pcon->con[pcon->count].sex);

	printf("tele:");
	scanf("%s", pcon->con[pcon->count].tele);

	printf("addr:");
	scanf("%s", pcon->con[pcon->count].addr);

	pcon->count++;
}

int find(pCon pcon)
{
	char name[10] = { 0 };
	int i = 0;
	printf("请输入姓名: ");
	scanf("%s", name);
	for (i = 0; i < pcon->count; i++) {
		if (strcmp(name, pcon->con[i].name) == 0) {
			return i;
		}
	}
	return -1;
}

/*删除成员*/
void dele(pCon pcon)
{
	int i = 0;
	int ret = 0;

	if (pcon->count == 0) {
		printf("通讯录为空\n");
		return;
	}

	ret = find(pcon);
	if (ret == -1) {
		printf("没有找到!\n");
	}
	else {
		for (i = ret; i < pcon->count - 1; i++) {
			pcon->con[i] = pcon->con[i + 1];
		}
		pcon->count--;
		printf("删除成功!\n");
	}

}

/*查找成员*/
void search(pCon pcon)
{
	int ret = 0;
	if (pcon->count == 0) {
		printf("通讯录为空\n");
		return;
	}
	ret = find(pcon);
	if (ret == -1) {
		printf("没有找到\n");
	}
	else {

		printf("%5s\t%s\t%5s\t%5s\t%5s\n", "name", "age", "sex", "tele", "addr");
		printf("%5s\t%d\t%5s\t%5s\t%5s\n", \
			pcon->con[ret].name, \
			pcon->con[ret].age, pcon->con[ret].sex, \
			pcon->con[ret].tele, pcon->con[ret].addr);
	}
}

/*修改*/
void modify(pCon pcon)
{
	int ret = 0;
	if (pcon->count == 0) {
		printf("通讯录为空\n");
		return;
	}
	ret = find(pcon);
	if (ret == -1) {
		printf("没有找到\n");
	}
	else {
		printf("name:");
		scanf("%s", &(pcon->con[ret].name));

		printf("age:");
		scanf("%d", &(pcon->con[ret].age));

		printf("sex:");
		scanf("%s", &(pcon->con[ret].sex));

		printf("tele:");
		scanf("%s", &(pcon->con[ret].tele));

		printf("addr:");
		scanf("%s", &(pcon->con[ret].addr));
	}
}

/*排序*/
void sort(pCon pcon)     //从小到大  
{
	int flag = 0;
	int i = 0;
	int j = 0;
	for (i = 0; i<pcon->count - 1; i++) {

		flag = 1;
		for (j = 0; j<pcon->count - i - 1; j++) {

			if (strcmp(pcon->con[j].name, pcon->con[j + 1].name)>0) {

				Peo tmp = pcon->con[j];
				pcon->con[j] = pcon->con[j + 1];
				pcon->con[j + 1] = tmp;
				flag = 0;

			}

		}
		if (flag == 1)
			break;
	}
	//show(pcon);  
	printf("排序完成\n");
}

/*展示信息*/
void show(pCon pcon)
{
	int i = 0;
	printf("%5s\t%s\t%5s\t%5s\t%5s\n", "name", "age", "sex", "tele", "addr");
	//printf("%d\n",pcon->count );  
	for (i = 0; i<pcon->count; i++) {
		printf("%5s\t%d\t%5s\t%5s\t%5s\n", \
			pcon->con[i].name, \
			pcon->con[i].age, pcon->con[i].sex, \
			pcon->con[i].tele, pcon->con[i].addr);
	}
}

void empty(pCon pcon)
{
	if (pcon->con != NULL) {
		free(pcon->con);
		pcon->con = NULL;
	}
}

/*加载*/  
void Loadcontact(pCon pcon)    
{
	Peo tmp = { 0 };
	FILE *pfread = fopen(FILENAME, "r");

	if (pfread == NULL){
		perror(FILENAME);
		exit(EXIT_FAILURE);
	}
	while (fread(&tmp, sizeof(Peo), 1, pfread)){    //读取  
		check(pcon);
		pcon->con[pcon->count++] = tmp;    //赋值  
	}

	fclose(pfread);
}

/*保存*/
void Savecontact(pCon pcon)
{
	FILE *pfwrite = fopen(FILENAME, "w");
	int i = 0;

	if (pfwrite == NULL){
		perror(FILENAME);
		exit(EXIT_FAILURE);
	}
	for (i = 0; i<pcon->count; i++){
		fwrite(pcon->con + i, sizeof(Peo), 1, pfwrite);
	}
	fclose(pfwrite);
}

3.test.c

#include "contact.h"
/*
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
0. 退出
*/

enum Option	//枚举,增加代码可读性
{
	Exit,//从0开始
	Add,
	Dele,
	Search,
	Modify,
	Show,
	Empty,
	Sort
};

void menu()
{
	printf("##############################\n");
	printf("######  Design By Liyuan  ####\n");
	printf("##############################\n");
	printf("###### 1.add     2.dele   ####\n");
	printf("###### 3.search  4.modify ####\n");
	printf("###### 5.show    6.empty  ####\n");
	printf("###### 7.sort    0.exit   ####\n");
	printf("##############################\n");
}

test()
{
	Con myCon;//创建的一个Con类型变量,即新创建一个通讯录名
	int input = 0;
	initContact(&myCon);//初始化

	while (1) {
		menu();
		printf("Please Select<0-7>:");
		scanf("%d", &input);

		switch (input) {
		case Add:
			add(&myCon);
			break;

		case Dele:
			dele(&myCon);
			break;

		case Search:
			search(&myCon);
			break;

		case Modify:
			modify(&myCon);
			break;

		case Show:
			show(&myCon);
			break;

		case Empty:
			empty(&myCon);
			break;

		case Sort:
			sort(&myCon);
			break;

		case Exit:
			Savecontact(&myCon);
			empty(&myCon);//释放内存,防止内存泄漏
			exit(0);
			break;

		default:
			printf("Select Erro.Please Reselect!\n");
			break;
		}
	}
}

int main()
{
	test();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39026129/article/details/80612148