普通版本
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
contact.h文件:
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
enum Oper
{
EXIT,
ADD,
DEL,
SEARCH,
SHOW,
CLEAR,
SORT,
DESTORY
};
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 11
#define MAX_ADDR 20
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 2
typedef struct Personinfo
{
char name[MAX_NAME];
short age;
char sex[MAX_SEX];//性别
char tele[MAX_TELE];
char addr[MAX_ADDR];
}Personinfo;//每个人的信息
typedef struct Contact
{
Personinfo per[MAX_NUMBER];
int usedSize;
}Contact;//通讯录
void initContact(Contact *pcon);
void AddContact(Contact *pcon);
void ShowContact(Contact *pcon);
void DelContact(Contact *pcon);
void ClearContact(Contact *pcon);
void SearchContact(Contact *pcon);
#endif
contact.h文件
#include "Contact.h"
#pragma warning (disable:4996)
//初始化通讯录
void initContact(Contact *pcon)
{
pcon->usedSize = 0;
memset(pcon->per, 0, sizeof(pcon->per));
}
//添加联系人
void AddContact(Contact *pcon)
{
if (pcon->usedSize == MAX_NUMBER)
{
printf("不好意思,满了\n");
return;
}
printf("请输入姓名:");
scanf("%s", pcon->per[pcon->usedSize].name);
printf("请输入年龄:");
scanf("%d", &(pcon->per[pcon->usedSize].age));
printf("请输入性别:");
scanf("%d", pcon->per[pcon->usedSize].sex);
printf("请输入电话:");
scanf("%d", pcon->per[pcon->usedSize].tele);
printf("请输入住址:");
scanf("%d", pcon->per[pcon->usedSize].addr);
pcon->usedSize++;
printf("添加成功!\n");
}
//输出通讯录
void ShowContact(Contact *pcon)
{
int i = 0;
printf("%-10s %-5s %-5s %-11s %-20s\n", "姓名" ,"年龄",
"性别", "电话", "地址");
for (i = 0; i < pcon->usedSize; i++)
{
printf("%-10s %-5d %-5s %-11s %-20s\n",
pcon->per[i].name,pcon->per[i].age,
pcon->per[i].sex, pcon->per[i].tele,
pcon->per[i].addr);
}
}
//查找联系人,并返回下标
int FindContact(Contact *pcon)
{
int i = 0;
char name[MAX_NAME] = { 0 };
if (pcon->usedSize == 0)
{
printf("通讯录为空\n");
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 SearchContact(Contact *pcon)
{
int index = FindContact(pcon);
if (index == -1)
{
printf("查无此人\n");
return;
}
else{
int i = index;
printf("%-10s %-5d %-5s %-11s %-20s\n",
pcon->per[i].name, pcon->per[i].age,
pcon->per[i].sex, pcon->per[i].tele,
pcon->per[i].addr);
}
}
//删除联系人
void DelContact(Contact *pcon)
{
int index = FindContact(pcon);
int i = 0;
if (index == -1)
{
printf("查无此人\n");
return;
}
for (i = index; i < pcon->usedSize - 1; i++)
{
pcon->per[i] = pcon->per[i + 1];
}
pcon->usedSize--;
printf("删除成功\n");
}
void ClearContact(Contact *pcon)
{
pcon->usedSize = 0;
}
test.c
#include "Contact.h"
#pragma warning (disable:4996)
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
void menu()
{
printf("######欢迎使用XXX通讯录############\n");
printf("#####0.exit######1.add#############\n");
printf("#####2.del#######3.search############\n");
printf("#####4.show######5.clear#############\n");
printf("#####6.sort######7.destory#############\n");
printf("####################################\n");
}
int main()
{
int input = 0;
Contact con;
initContact(&con);
do{
menu();
printf("请输入你的操作:");
scanf("%d", &input);
switch (input)
{
case EXIT:
break;
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case SORT:
break;
case DESTORY:
break;
default:
break;
}
} while (input);
system("pause");
return 0;
}
动态版本:
1.定义通讯录结构体时,个人信息数组改为个人信息指针,
增加一个容量变量,可以通过动态申请所需要的内存来存储。
2.初始化通讯录时,可以X先设原本的容量DEFAULT_SIZE=2,
然后动态申请空间。
3.增加个人信息时,首先判断是否满了,若为满要进行扩容。
可以增加 判断扩容是否成功 函数。
4.动态申请内存时,容易发生内存泄漏,增加摧毁函数。
程序如下
contact.h文件:
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<vld.h>
enum Oper
{
EXIT,
ADD,
DEL,
SEARCH,
SHOW,
CLEAR,
SORT,
DESTORY
};
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 11
#define MAX_ADDR 20
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 2
typedef struct Personinfo
{
char name[MAX_NAME];
short age;
char sex[MAX_SEX];//性别
char tele[MAX_TELE];
char addr[MAX_ADDR];
}Personinfo;//每个人的信息
typedef struct Contact
{
Personinfo *per;
int usedSize;
int cpaticty;//容量
}Contact;//通讯录
void initContact(Contact *pcon);
void AddContact(Contact *pcon);
void ShowContact(Contact *pcon);
void DelContact(Contact *pcon);
void ClearContact(Contact *pcon);
void SearchContact(Contact *pcon);
void DestoryContact(Contact *pcon);
#endif
contact.c文件
#include "Contact.h"
#pragma warning (disable:4996)
void initContact(Contact *pcon)
{
pcon->usedSize = 0;
pcon->cpaticty = DEFAULT_SIZE;
pcon->per = (Personinfo *)malloc(sizeof(Personinfo)*pcon->cpaticty);
assert(pcon->per != NULL);
}
//返回值代表扩容是否成功
static int CheckFullAndRe(Contact *pcon)
{
if (pcon->usedSize == pcon->cpaticty)
{
Personinfo *ptr = NULL;
ptr=(Personinfo *)realloc(pcon->per, sizeof(Personinfo)*pcon->cpaticty * 2);
if (ptr != NULL)
{
pcon->per = ptr;
pcon->cpaticty *= 2;
printf("扩容成功\n");
return 1;
}
else{
return 0;//扩容失败
}
}
return 1;//内存没满,没有进入if,需要返回值
}
//增加联系人
void AddContact(Contact *pcon)
{
/*if (pcon->useSize == MAX_NUMBER)
{
printf("不好意思,满了\n");
return;
}*/
if (CheckFullAndRe(pcon) != 1)
{
printf("扩容失败!\n");
return;
}
printf("请输入姓名:");
scanf("%s", pcon->per[pcon->usedSize].name);
printf("请输入年龄:");
scanf("%d", &(pcon->per[pcon->usedSize].age));
printf("请输入性别:");
scanf("%d", pcon->per[pcon->usedSize].sex);
printf("请输入电话:");
scanf("%d", pcon->per[pcon->usedSize].tele);
printf("请输入住址:");
scanf("%d", pcon->per[pcon->usedSize].addr);
pcon->usedSize++;
printf("添加成功!\n");
}
//显示联系人
void ShowContact(Contact *pcon)
{
int i = 0;
printf("%-10s %-5s %-5s %-11s %-20s\n", "姓名" ,"年龄",
"性别", "电话", "地址");
for (i = 0; i < pcon->usedSize; i++)
{
printf("%-10s %-5d %-5s %-11s %-20s\n",
pcon->per[i].name,pcon->per[i].age,
pcon->per[i].sex, pcon->per[i].tele,
pcon->per[i].addr);
}
}
//查找联系人返回下标
int FindContact(Contact *pcon)
{
int i = 0;
char name[MAX_NAME] = { 0 };
if (pcon->usedSize == 0)
{
printf("通讯录为空\n");
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 SearchContact(Contact *pcon)
{
int index = FindContact(pcon);
if (index == -1)
{
printf("查无此人\n");
return;
}
else{
int i = index;
printf("%-10s %-5d %-5s %-11s %-20s\n",
pcon->per[i].name, pcon->per[i].age,
pcon->per[i].sex, pcon->per[i].tele,
pcon->per[i].addr);
}
}
//删除联系人
void DelContact(Contact *pcon)
{
int index = FindContact(pcon);
int i = 0;
if (index == -1)
{
printf("查无此人\n");
return;
}
for (i = index; i < pcon->usedSize - 1; i++)
{
pcon->per[i] = pcon->per[i + 1];
}
pcon->usedSize--;
printf("删除成功\n");
}
//清空联系人
void ClearContact(Contact *pcon)
{
pcon->usedSize = 0;
}
//摧毁
void DestoryContact(Contact *pcon)
{
free(pcon->per);
pcon->per = NULL;//预防野指针
pcon->cpaticty = 0;
pcon->usedSize = 0;
}
test.c文件:
#include "Contact.h"
#pragma warning (disable:4996)
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 摧毁
void menu()
{
printf("######欢迎使用XXX通讯录############\n");
printf("#####0.exit######1.add#############\n");
printf("#####2.del#######3.search############\n");
printf("#####4.show######5.clear#############\n");
printf("#####6.sort######7.destory#############\n");
printf("####################################\n");
}
int main()
{
int input = 0;
Contact con;
initContact(&con);
do{
menu();
printf("请输入你的操作:");
scanf("%d", &input);
switch (input)
{
case EXIT:
DestoryContact(&con);
break;
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case SORT:
break;
case DESTORY:
DestoryContact(&con);
break;
default:
break;
}
} while (input);
system("pause");
return 0;
}
文件版本:摧毁之前把数据保存在文件里面
1.增加存储函数。
2.初始化时加载文件内容。增加加载函数。
:打开文件,判断空间是否满了,若满了必须扩容。
程序如下:
contact.h文件:
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<vld.h>
enum Oper
{
EXIT,
ADD,
DEL,
SEARCH,
SHOW,
CLEAR,
SORT,
DESTORY
};
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 11
#define MAX_ADDR 20
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 2
typedef struct Personinfo
{
char name[MAX_NAME];
short age;
char sex[MAX_SEX];//性别
char tele[MAX_TELE];
char addr[MAX_ADDR];
}Personinfo;//每个人的信息
typedef struct Contact
{
//Personinfo per[MAX_NUMBER];//普通版本
Personinfo *per;
int usedSize;
int cpaticty;//容量
}Contact;//通讯录
void initContact(Contact *pcon);
void AddContact(Contact *pcon);
void ShowContact(Contact *pcon);
void DelContact(Contact *pcon);
void ClearContact(Contact *pcon);
void SearchContact(Contact *pcon);
void DestoryContact(Contact *pcon);
int CheckFullAndRe(Contact *pcon);
void LoadContact(Contact *pcon);
#endif
contact.c文件:
#include "Contact.h"
#pragma warning (disable:4996)
//加载,读文件
void LoadContact(Contact *pcon)
{
FILE *pf = fopen("Contact.bat", "rb");
Personinfo tmp = { 0 };
//fread函数的返回值是:读取的字节数
if (pf == NULL)
{
return;
}//第一次加载什么都不用做
while (fread(&tmp, sizeof(Personinfo), 1, pf) > 0)
{
CheckFullAndRe(pcon);//必须判断是否为满,如果满了扩容
pcon->per[pcon->usedSize] = tmp;
pcon->usedSize++;
}
fclose(pf);
pf = NULL;
}
void initContact(Contact *pcon)
{
/*pcon->usedSize = 0;
memset(pcon->per, 0, sizeof(pcon->per));*///普通版本
pcon->usedSize = 0;
pcon->cpaticty = DEFAULT_SIZE;
pcon->per = (Personinfo *)malloc(sizeof(Personinfo)*pcon->cpaticty);
assert(pcon->per != NULL);
LoadContact(pcon);
}
//返回值代表扩容是否成功
static int CheckFullAndRe(Contact *pcon)
{
if (pcon->usedSize == pcon->cpaticty)
{
Personinfo *ptr = NULL;
ptr=(Personinfo *)realloc(pcon->per, sizeof(Personinfo)*pcon->cpaticty * 2);
if (ptr != NULL)
{
pcon->per = ptr;
pcon->cpaticty *= 2;
printf("扩容成功\n");
return 1;
}
else{
return 0;//扩容失败
}
}
return 1;//内存没满,没有进入if,需要返回值
}
void AddContact(Contact *pcon)
{
if (CheckFullAndRe(pcon) != 1)
{
printf("扩容失败!\n");
return;
}
printf("请输入姓名:");
scanf("%s", pcon->per[pcon->usedSize].name);
printf("请输入年龄:");
scanf("%d", &(pcon->per[pcon->usedSize].age));
printf("请输入性别:");
scanf("%d", pcon->per[pcon->usedSize].sex);
printf("请输入电话:");
scanf("%d", pcon->per[pcon->usedSize].tele);
printf("请输入住址:");
scanf("%d", pcon->per[pcon->usedSize].addr);
pcon->usedSize++;
printf("添加成功!\n");
}
void ShowContact(Contact *pcon)
{
int i = 0;
printf("%-10s %-5s %-5s %-11s %-20s\n", "姓名" ,"年龄",
"性别", "电话", "地址");
for (i = 0; i < pcon->usedSize; i++)
{
printf("%-10s %-5d %-5s %-11s %-20s\n",
pcon->per[i].name,pcon->per[i].age,
pcon->per[i].sex, pcon->per[i].tele,
pcon->per[i].addr);
}
}
int FindContact(Contact *pcon)
{
int i = 0;
char name[MAX_NAME] = { 0 };
if (pcon->usedSize == 0)
{
printf("通讯录为空\n");
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 SearchContact(Contact *pcon)
{
int index = FindContact(pcon);
if (index == -1)
{
printf("查无此人\n");
return;
}
else{
int i = index;
printf("%-10s %-5d %-5s %-11s %-20s\n",
pcon->per[i].name, pcon->per[i].age,
pcon->per[i].sex, pcon->per[i].tele,
pcon->per[i].addr);
}
}
void DelContact(Contact *pcon)
{
int index = FindContact(pcon);
int i = 0;
if (index == -1)
{
printf("查无此人\n");
return;
}
for (i = index; i < pcon->usedSize - 1; i++)
{
pcon->per[i] = pcon->per[i + 1];
}
pcon->usedSize--;
printf("删除成功\n");
}
void ClearContact(Contact *pcon)
{
pcon->usedSize = 0;
}
//存储
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->cpaticty = 0;
pcon->usedSize = 0;
}