最普通版本的通讯录:
详细见注释,包含初始化,添加,删除,查找,显示,清空等操作
contact.h文件
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<string.h>
#include<windows.h>
#pragma warning (disable:4996)
enum Oper
{
EXIT,
ADD,
DEL,
SEAR,
SHOW,
CLEAR,
DESTORY
};
#define MAX_NUMBER 1000
#define MAX_NAME 10
#define SEX_NAME 5
#define TEL_NAME 11
#define ADDR_NAME 20
//抽象个人信息
typedef struct PersonIfo
{
char name[MAX_NAME];
char sex[SEX_NAME];
int age;
char tele[TEL_NAME];
char addr[ADDR_NAME];
}PersonInfo;
//抽象通讯录
typedef struct Contact
{
int usedsize;//有效数据个数
PersonInfo per[MAX_NUMBER];
}Contact;
void InitContact(Contact *pcon);//通讯录初始化
void AddContact(Contact *pcon);//添加成员
void ShowContact(Contact *pcon);//打印通讯录
void DelContact(Contact *pcon);//删除成员
int SearchContact(Contact *pcon);//查找成员
void ClearContact(Contact *pcon);//清空通讯录
#endif
contact.c
#include"contact.h"
//初始化通讯录**************************************************
void InitContact(Contact *pcon)
{
pcon->usedsize = 0;//将结构体变量中的usedsize初始化为0
memset(pcon->per, 0, sizeof(pcon->per));//初始化结构体变量的数组void * memset ( void * ptr, int value, size_t num );
}
//添加成员*******************************************************
void AddContact(Contact *pcon)
{
if (pcon->usedsize == MAX_NUMBER)//判断该数组是否满了?
{
printf("抱歉,该通讯录已满");
return;
}
printf("请输入下列各项信息:\n");
printf("请输入名字:>");
scanf("%s", pcon->per[pcon->usedsize].name);
printf("请输入性别:>");
scanf("%s", pcon->per[pcon->usedsize].sex);
printf("请输入年龄:>");
scanf("%d", &pcon->per[pcon->usedsize].age);
printf("请输入电话号码:>");
scanf("%s", pcon->per[pcon->usedsize].tele);
printf("请输入地址:>");
scanf("%s", pcon->per[pcon->usedsize].addr);
pcon->usedsize++;
printf("添加联系人成功!");
}
//打印通讯录*******************************************************
void ShowContact(Contact *pcon)
{
int i = 0;
if (pcon->usedsize == 0)
{
printf("该通讯录为空,目前没有可Show的\n");
return;
}
for (i = 0; i < pcon->usedsize; i++)
{
printf("姓名:%s ", pcon->per[i].name);
printf("性别:%s ", pcon->per[i].sex);
printf("年龄:%d ", pcon->per[i].age);
printf("电话号码:%s ", pcon->per[i].tele);
printf("地址:%s ", pcon->per[i].addr);
printf("\n");
}
}
//查找联系人***************************************************
int SearchContact(Contact *pcon)
{
int i = 0;
char name[MAX_NAME] = { 0 };
if (pcon->usedsize == 0)
{
printf("抱歉,该通讯录为空!");
return -1;
}
printf("请输入要查找的联系人姓名:");
scanf("%s", &name);
for (i = 0; i < pcon->usedsize; i++)
{
if(strcmp(pcon->per[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人*****************************************************
void DelContact(Contact *pcon)
{
int i = 0;
int index = SearchContact(pcon);
if (index == -1)
{
printf("未找到此人!");
return;
}
for (i = index; i < pcon->usedsize - 1; i++)
{
pcon->per[i] = pcon->per[i + 1];
}
pcon->usedsize--;
printf("删除联系人成功!");
}
//清空联系人*****************************************************
void ClearContact(Contact *pcon)
{
pcon->usedsize = 0;
printf("清空联系人成功!");
}
test.c实现文件(主函数)
#include"contact.h"
void menu()
{
printf(" \n");
printf("#################################################################\n");
printf("############################通 讯 录#############################\n");
printf("-----------------------------------------------------------------\n");
printf(" 1,添加联系人信息 2,删除联系人信息 \n");
printf(" 3,查找联系人信息 4,显示联系人信息 \n");
printf(" 5,清空联系人信息 6,摧毁联系人信息 \n");
printf("-----------------------------------------------------------------\n");
printf(" 退 出 请 按 0 ! \n");
printf("#################################################################\n");
printf("请输入你的选择:(0~9) \n");
}
int main()
{
int input = 1;
Contact con;
InitContact(&con);
do{
menu();
scanf("%d", &input);
switch (input)
{
case EXIT:
break;
case ADD:AddContact(&con);
break;
case DEL:DelContact(&con);
break;
case SEAR:SearchContact(&con);
break;
case SHOW:ShowContact(&con);
break;
case CLEAR:ClearContact(&con);
break;
default:
break;
}
} while(input);
system("pause");
return 0;
}
动态版本的通讯录:
在普通版本上进行了一定的改进,进行了动态内存的申请,并对所申请的内存进行释放
contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<windows.h>
#pragma warning (disable:4996)
enum Oper
{
EXIT,
ADD,
DEL,
SEAR,
SHOW,
CLEAR,
DESTORY
};
#define MAX_NUMBER 1000
#define MAX_NAME 10
#define SEX_NAME 5
#define TEL_NAME 11
#define ADDR_NAME 20
#define DEFAULT_SIZE 2
//抽象个人信息
typedef struct PersonIfo
{
char name[MAX_NAME];
char sex[SEX_NAME];
int age;
char tele[TEL_NAME];
char addr[ADDR_NAME];
}PersonInfo;
//抽象通讯录
typedef struct Contact
{
int usedsize;//有效数据个数
PersonInfo *per;
int capacity;//通讯录的容量
}Contact;
void InitContact(Contact *pcon);//通讯录初始化
void AddContact(Contact *pcon);//添加成员
void ShowContact(Contact *pcon);//打印通讯录
void DelContact(Contact *pcon);//删除成员
int SearchContact(Contact *pcon);//查找成员
void ClearContact(Contact *pcon);//清空通讯录
void DestoryContact(Contact *pcon);//摧毁通讯录
#endif
contact.c
#include"contact.h"
//初始化通讯录**************************************************
void InitContact(Contact *pcon)
{
pcon->usedsize = 0;//将结构体变量中的usedsize初始化为0
pcon->capacity = DEFAULT_SIZE;
pcon->per = (PersonInfo *)malloc(sizeof(PersonInfo)*pcon->capacity);
assert(pcon->per != NULL);
}
//返回值代表是否扩容成功
static int CheckFullAndRe(Contact *pcon)//在初始化时需要判断是否已经满了(>capacity),满了则需要realloc来进行扩容
{
PersonInfo *ptr;//定义一个临时变量,防止realloc申请空间失败导致pcon->per所指向的目标丢失
if (pcon->usedsize == pcon->capacity)
{
ptr = (PersonInfo *)realloc(pcon->per, sizeof(PersonInfo)*pcon->capacity * 2);
if (ptr != NULL)
{
pcon->per = ptr;
pcon->capacity *= 2;//扩容后容量变为原来的两倍
printf("扩容已经成功!\n");
return 1;
}
else
{
return 0;//扩容失败
}
}
return 1;
}
//添加成员*******************************************************
void AddContact(Contact *pcon)
{
if (CheckFullAndRe(pcon) != 1)
{
printf("扩容失败\n");
return;
}
printf("请输入下列各项信息:\n");
printf("请输入名字:>");
scanf("%s", pcon->per[pcon->usedsize].name);
printf("请输入性别:>");
scanf("%s", pcon->per[pcon->usedsize].sex);
printf("请输入年龄:>");
scanf("%d", &pcon->per[pcon->usedsize].age);
printf("请输入电话号码:>");
scanf("%s", pcon->per[pcon->usedsize].tele);
printf("请输入地址:>");
scanf("%s", pcon->per[pcon->usedsize].addr);
pcon->usedsize++;
printf("添加联系人成功!");
}
//打印通讯录*******************************************************
void ShowContact(Contact *pcon)
{
int i = 0;
if (pcon->usedsize == 0)
{
printf("该通讯录为空,目前没有可Show的\n");
return;
}
for (i = 0; i < pcon->usedsize; i++)
{
printf("姓名:%s ", pcon->per[i].name);
printf("性别:%s ", pcon->per[i].sex);
printf("年龄:%d ", pcon->per[i].age);
printf("电话号码:%s ", pcon->per[i].tele);
printf("地址:%s ", pcon->per[i].addr);
printf("\n");
}
}
//查找联系人***************************************************
int SearchContact(Contact *pcon)
{
int i = 0;
char name[MAX_NAME] = { 0 };
if (pcon->usedsize == 0)
{
printf("抱歉,该通讯录为空!");
return -1;
}
printf("请输入要查找的联系人姓名:");
scanf("%s", &name);
for (i = 0; i < pcon->usedsize; i++)
{
if(strcmp(pcon->per[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人*****************************************************
void DelContact(Contact *pcon)
{
int i = 0;
int index = SearchContact(pcon);
if (index == -1)
{
printf("未找到此人!");
return;
}
for (i = index; i < pcon->usedsize - 1; i++)
{
pcon->per[i] = pcon->per[i + 1];
}
pcon->usedsize--;
printf("删除联系人成功!");
}
//清空联系人*****************************************************
void ClearContact(Contact *pcon)
{
pcon->usedsize = 0;
printf("清空联系人成功!");
}
//摧毁通讯录********************************************************
void DestoryContact(Contact *pcon)//摧毁通讯录
{
free(pcon->per);
pcon->per = NULL;//预防野指针
pcon->capacity = 0;
pcon->usedsize = 0;
}
test.c
#include"contact.h"
void menu()
{
printf(" \n");
printf("#################################################################\n");
printf("############################通 讯 录#############################\n");
printf("-----------------------------------------------------------------\n");
printf(" 1,添加联系人信息 2,删除联系人信息 \n");
printf(" 3,查找联系人信息 4,显示联系人信息 \n");
printf(" 5,清空联系人信息 6,摧毁联系人信息 \n");
printf("-----------------------------------------------------------------\n");
printf(" 退 出 请 按 0 ! \n");
printf("#################################################################\n");
printf("请输入你的选择:(0~9) \n");
}
int main()
{
int input = 1;
Contact con;
InitContact(&con);
do{
menu();
scanf("%d", &input);
switch (input)
{
case EXIT:DestoryContact(&con);
break;
case ADD:AddContact(&con);
break;
case DEL:DelContact(&con);
break;
case SEAR:SearchContact(&con);
break;
case SHOW:ShowContact(&con);
break;
case CLEAR:ClearContact(&con);
break;
case DESTORY:DestoryContact(&con);
break;
default:
break;
}
} while(input);
system("pause");
return 0;
}
文件存储版本实现:
将add的联系人写入文件中,并从文件中读出
contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<windows.h>
#pragma warning (disable:4996)
enum Oper
{
EXIT,
ADD,
DEL,
SEAR,
SHOW,
CLEAR,
DESTORY
};
#define MAX_NUMBER 1000
#define MAX_NAME 10
#define SEX_NAME 5
#define TEL_NAME 11
#define ADDR_NAME 20
#define DEFAULT_SIZE 2
//抽象个人信息
typedef struct PersonIfo
{
char name[MAX_NAME];
char sex[SEX_NAME];
int age;
char tele[TEL_NAME];
char addr[ADDR_NAME];
}PersonInfo;
//抽象通讯录
typedef struct Contact
{
int usedsize;//有效数据个数
PersonInfo *per;
int capacity;//通讯录的容量
}Contact;
void InitContact(Contact *pcon);//通讯录初始化
void AddContact(Contact *pcon);//添加成员
void ShowContact(Contact *pcon);//打印通讯录
void DelContact(Contact *pcon);//删除成员
int SearchContact(Contact *pcon);//查找成员
void ClearContact(Contact *pcon);//清空通讯录
void DestoryContact(Contact *pcon);//摧毁通讯录
void SaveContact(Contact *pcon);//保存联系人到文件
void LoadContact(Contact *pcon);//加载联系人
#endif
contact.c
#include"contact.h"
//在初始化前,加载文件中存储的内容
void LoadContact(Contact *pcon)
{
FILE *pf = fopen("Contact.bat", "rb");
PersonInfo tmp = { 0 };
if (pf == NULL)
{
return;
}
//fread这个函数的返回值是读取成功的字节数
while(fread(&tmp, sizeof(PersonInfo), 1, pf)>0)
{
CheckFullAndRe(pcon);//从文件中读取到per中,必须判断是否为满(即从文件中读取的个数是否比capacity大,如果大,则需要扩容)
pcon->per[pcon->usedsize++] = tmp;
}
fclose(pf);
pf = NULL;
}
//初始化通讯录**************************************************
void InitContact(Contact *pcon)
{
pcon->usedsize = 0;//将结构体变量中的usedsize初始化为0
pcon->capacity = DEFAULT_SIZE;
pcon->per = (PersonInfo *)malloc(sizeof(PersonInfo)*pcon->capacity);
assert(pcon->per != NULL);
LoadContact(pcon);
}
//返回值代表是否扩容成功
static int CheckFullAndRe(Contact *pcon)//在初始化时需要判断是否已经满了(>capacity),满了则需要realloc来进行扩容
{
PersonInfo *ptr;//定义一个临时变量,防止realloc申请空间失败导致pcon->per所指向的目标丢失
if (pcon->usedsize == pcon->capacity)
{
ptr = (PersonInfo *)realloc(pcon->per, sizeof(PersonInfo)*pcon->capacity * 2);
if (ptr != NULL)
{
pcon->per = ptr;
pcon->capacity *= 2;//扩容后容量变为原来的两倍
printf("扩容已经成功!\n");
return 1;
}
else
{
return 0;//扩容失败
}
}
return 1;
}
//添加成员*******************************************************
void AddContact(Contact *pcon)
{
if (CheckFullAndRe(pcon) != 1)
{
printf("扩容失败\n");
return;
}
printf("请输入下列各项信息:\n");
printf("请输入名字:>");
scanf("%s", pcon->per[pcon->usedsize].name);
printf("请输入性别:>");
scanf("%s", pcon->per[pcon->usedsize].sex);
printf("请输入年龄:>");
scanf("%d", &pcon->per[pcon->usedsize].age);
printf("请输入电话号码:>");
scanf("%s", pcon->per[pcon->usedsize].tele);
printf("请输入地址:>");
scanf("%s", pcon->per[pcon->usedsize].addr);
pcon->usedsize++;
printf("添加联系人成功!");
}
//打印通讯录*******************************************************
void ShowContact(Contact *pcon)
{
int i = 0;
if (pcon->usedsize == 0)
{
printf("该通讯录为空,目前没有可Show的\n");
return;
}
for (i = 0; i < pcon->usedsize; i++)
{
printf("姓名:%s ", pcon->per[i].name);
printf("性别:%s ", pcon->per[i].sex);
printf("年龄:%d ", pcon->per[i].age);
printf("电话号码:%s ", pcon->per[i].tele);
printf("地址:%s ", pcon->per[i].addr);
printf("\n");
}
}
//查找联系人***************************************************
int SearchContact(Contact *pcon)
{
int i = 0;
char name[MAX_NAME] = { 0 };
if (pcon->usedsize == 0)
{
printf("抱歉,该通讯录为空!");
return -1;
}
printf("请输入要查找的联系人姓名:");
scanf("%s", &name);
for (i = 0; i < pcon->usedsize; i++)
{
if(strcmp(pcon->per[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人*****************************************************
void DelContact(Contact *pcon)
{
int i = 0;
int index = SearchContact(pcon);
if (index == -1)
{
printf("未找到此人!");
return;
}
for (i = index; i < pcon->usedsize - 1; i++)
{
pcon->per[i] = pcon->per[i + 1];
}
pcon->usedsize--;
printf("删除联系人成功!");
}
//清空联系人*****************************************************
void ClearContact(Contact *pcon)
{
pcon->usedsize = 0;
printf("清空联系人成功!");
}
//文件摧毁之前,现将联系人存储到文件中
void SaveContact(Contact *pcon)
{
int i = 0;
FILE *pf = fopen("Contact.bat", "wb");
assert(pf != NULL);
for (i = 0; i < pcon->usedsize; i++)
{
fwrite(pcon->per + i,sizeof(PersonInfo),1,pf );
}
fclose(pf);
pf = NULL;
}
//摧毁通讯录********************************************************
void DestoryContact(Contact *pcon)//摧毁通讯录
{
SaveContact(pcon);
free(pcon->per);
pcon->per = NULL;//预防野指针
pcon->capacity = 0;
pcon->usedsize = 0;
}
test.c
#include"contact.h"
void menu()
{
printf(" \n");
printf("#################################################################\n");
printf("############################通 讯 录#############################\n");
printf("-----------------------------------------------------------------\n");
printf(" 1,添加联系人信息 2,删除联系人信息 \n");
printf(" 3,查找联系人信息 4,显示联系人信息 \n");
printf(" 5,清空联系人信息 6,摧毁联系人信息 \n");
printf("-----------------------------------------------------------------\n");
printf(" 退 出 请 按 0 ! \n");
printf("#################################################################\n");
printf("请输入你的选择:(0~9) \n");
}
int main()
{
int input = 1;
Contact con;
InitContact(&con);
do{
menu();
scanf("%d", &input);
switch (input)
{
case EXIT:
break;
case ADD:AddContact(&con);
break;
case DEL:DelContact(&con);
break;
case SEAR:SearchContact(&con);
break;
case SHOW:ShowContact(&con);
break;
case CLEAR:ClearContact(&con);
break;
case DESTORY:DestoryContact(&con);
break;
default:
break;
}
} while(input);
system("pause");
return 0;
}