头文件:
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 3
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
#define SZ 3
#define FILENAME "contace.dat"
typedef struct PeoInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char tele[TELE_MAX];
}PeoInfo;
typedef struct Contact
{
PeoInfo *data;//存储区域
int sz;// 有效元素
int capacity;//容量
}*pContact; //将存储区域从数组形势改为指针形势
void meau(void);
void InitContact(pContact pcon);//初始化
void AddContact(pContact pcon);//增加用户信息
void ShowContact(const pContact pcon);//显示信息
void DelContact(pContact pcon);//删除信息
void SearchContact(pContact pcon);//查找信息
void ModifyContact(pContact pcon);//修改信息
void SortContach(pContact pcon);//排序信息
void ClearContact(pContact pcon);//清空
void LoadContactData(pContact pcon);
void SaveContact(pContact pcon);
void check(pContact pcon);
#endif
源文件:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"text1.h"
void meau()
{
printf("*******************************************\n");
printf("****1、初始化信息 2、增加新用户*****\n");
printf("****3、已存用户 4、删除用户 *****\n");
printf("****5、查找用户 6、修改信息 *****\n");
printf("****7、给用户排序 8、清空通讯录*****\n");
printf("********* 9、退出通讯录 ***********\n");
printf("*********请输入对应数字选择功能************\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
struct Contact pcon;
do
{
meau();
scanf("%d", &input);
switch (input)
{
case 1:
InitContact(&pcon);//初始化
break;
case 2:
AddContact(&pcon);//增加用户信息
break;
case 3:
ShowContact(&pcon);//显示信息
break;
case 4:
DelContact(&pcon);//删除信息
break;
case 5:
SearchContact(&pcon);//查找信息
break;
case 6:
ModifyContact(&pcon);//修改信息
break;
case 7:
SortContach(&pcon);//排序信息
break;
case 8:
ClearContact(&pcon);//清空
break;
case 9:
SaveContact(&pcon);
return 0;
default:printf("输入错误,请重新输入:\n");
break;
}
} while (input);
return 0;
}
void _Add(pContact pcon, PeoInfo* p)//变为动态开辟形势 在增加联系人时 需要检验容量是否超过最大容
{
check(pcon); //检验函数
pcon->data[pcon->sz] = *p;
pcon->sz++;
}
void LoadContactData(pContact pcon)
{
FILE* pfIn = fopen(FILENAME, "r");
PeoInfo tmp = { 0 };
while (fread(&tmp, sizeof(PeoInfo), 1, pfIn))
{
_Add(pcon, &tmp);
}
}
void SaveContact(pContact pcon)
{
FILE* pf = fopen(FILENAME, "w");
int i = 0;
if (pf == NULL)
{
perror("SaveContactData::fopen");
exit(EXIT_FAILURE);
}
for (i = 0; i < pcon->sz; i++)
{
fwrite(pcon->data + i, sizeof(PeoInfo), 1, pf);
}
fclose(pf);
}
void InitContact(pContact pcon)
{
pcon->sz = 0;
pcon->data = (PeoInfo*)malloc(SZ * sizeof(PeoInfo));
memset(pcon->data, 0,SZ*sizeof(PeoInfo));
pcon->capacity = SZ;
LoadContactData(pcon);
}
void check(pContact pcon)//检验函数 当容量不足时利用malloc函数进行增容 每次增加两个
{
if (pcon->sz == pcon->capacity)
{
PeoInfo* p = (PeoInfo*)realloc(pcon->data, (pcon->capacity + 2)* sizeof(PeoInfo));
pcon->data = (PeoInfo*)p;
pcon->capacity = pcon->capacity + 2;
printf("扩容成功!");
printf("\n");
}
}
void AddContact(pContact pcon)
{
check(pcon);
printf("请输入新用户名字:");
scanf("%s", (pcon->data[pcon->sz]).name);
printf("请输入新用户年龄:");
scanf("%d", &((pcon->data[pcon->sz]).age));
printf("请输入新用户性别:");
scanf("%s", (pcon->data[pcon->sz]).sex);
printf("请输入新用户地址:");
scanf("%s", (pcon->data[pcon->sz]).addr);
printf("请输入新用户电话:");
scanf("%s", (pcon->data[pcon->sz]).tele);
printf("添加成功!\n");
pcon->sz++;
}
void ShowContact(const pContact pcon)
{
int i = 0;
printf("姓名\t年龄\t性别\t地址\t\t电话\n");
for (i = 0; i < pcon->sz; i++)
{
printf("%s\t%d\t%s\t%s\t\t%s\n", (pcon->data[i]).name, (pcon->data[i]).age, (pcon->data[i]).sex, (pcon->data[i]).addr, (pcon->data[i]).tele);
}
printf("\n");
}
void DelContact(pContact pcon)
{
char name[NAME_MAX];
printf("请输入要删除的联系人:");
scanf("%s", &name);
int i = 0;
int j = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(name, pcon->data[i].name) == 0)
{
for (j = i; j < pcon->sz; j++)
{
pcon->data[j] = pcon->data[j + 1];
}
}
}
pcon->sz--;
printf("\n");
}
void SearchContact(pContact pcon)
{
char name[NAME_MAX];
printf("请输入你要查找的联系人:");
scanf("%s", &name);
int i = 0;
printf("姓名\t年龄\t性别\t地址\t\t电话\n");
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(name, pcon->data[i].name) == 0)
{
printf("%s\t%d\t%s\t%s\t\t%s\n", (pcon->data[i]).name, (pcon->data[i]).age, (pcon->data[i]).sex, (pcon->data[i]).addr, (pcon->data[i]).tele);
}
}
}
void ModifyContact(pContact pcon)
{
int i = 0;
char name[NAME_MAX];
printf("请输入你要修改的用户名称:");
scanf("%s", &name);
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(name, pcon->data[i].name) == 0)
{
printf("请输入修改后的名字:");
scanf("%s", pcon->data[i].name);
printf("请输入修改后的年龄:");
scanf("%d", &pcon->data[i].age);
printf("请输入修改后的性别:");
scanf("%s", pcon->data[i].sex);
printf("请输入修改后的地址:");
scanf("%s", pcon->data[i].addr);
printf("请输入修改后的电话:");
scanf("%s", pcon->data[i].tele);
}
}
printf("修改成功!\n");
}
void SortContach(pContact pcon)
{
int n = 0;
printf("*******************************************\n");
printf("************1、按姓名排序******************\n");
printf("************2、按年龄排序******************\n");
printf("*******************************************\n");
scanf("%d", &n);
int i = 0; int j = 0;
if (n == 2)
{
for (i = 0; i < pcon->sz; i++)
{
for (j = 0; j < pcon->sz - i - 1; j++)
{
if (((pcon->data[j]).age)>((pcon->data[j + 1]).age))
{
struct PeoInfo tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
}
}
}
}
else
{
for (i = 0; i < pcon->sz; i++)
{
for (j = 0; j < pcon->sz - i - 1; j++)
{
if ((strcmp((pcon->data[j]).name, (pcon->data[j + 1]).name))>0)
{
struct PeoInfo tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
}
}
}
}
printf("姓名\t年龄\t性别\t地址\t\t电话\n");
for (i = 0; i < pcon->sz; i++)
{
printf("%s\t%d\t%s\t%s\t\t%s\t", (pcon->data[i]).name, (pcon->data[i]).age, (pcon->data[i]).sex, (pcon->data[i]).addr, (pcon->data[i]).tele);
printf("\n");
}
printf("\n");
}
void ClearContact(pContact pcon)
{
pcon->sz = 0;
}