一、简易版通讯录
1、头文件部分Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#pragma once
#define NAME_MAX 100
#define GENDER_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 100
#define MAX 200
typedef struct info
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}info;
typedef struct Contact
{
info data[MAX];
int size;
}Contact,*pContact;
void InitContact(pContact pc);
void AddContact(pContact pc);
void DelContact(pContact pc);
void SearchContact(pContact pc);
int FindContact(pContact pc, char* name);
void ModifyContact(pContact pc);
void SortContact(pContact pc);
void ShowContact(pContact pc);
2、函数实现部分Contact.c
#include"Contact.h"
void InitContact(pContact pc)
{
pc->size = 0;
}
void AddContact(pContact pc)
{
info curInfo;
if (pc->size == MAX)
{
printf("通讯录已满!添加失败。\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", curInfo.name);
printf("请输入性别:\n");
scanf("%s", curInfo.gender);
printf("请输入年龄:\n");
scanf("%d", &curInfo.age);
printf("请输入电话号码:\n");
scanf("%s", curInfo.tele);
printf("请输入地址:\n");
scanf("%s", curInfo.addr);
pc->data[pc->size] = curInfo;
pc->size++;
}
void DelContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入被删除的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,删除失败!\n");
return;
}
for (int i = pos; i < pc->size-1; ++i)
{
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("删除成功!\n");
}
void SearchContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入要查找的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,查找失败!\n");
return;
}
printf("===============================\n");
printf("姓名:%s\n", pc->data[pos].name);
printf("性别:%s\n", pc->data[pos].gender);
printf("年龄:%d\n", pc->data[pos].age);
printf("电话:%s\n", pc->data[pos].tele);
printf("地址:%s\n", pc->data[pos].addr);
printf("===============================\n");
}
void ModifyContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入要修改的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,修改失败!\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", pc->data[pos].name);
printf("请输入性别:\n");
scanf("%s", pc->data[pos].gender);
printf("请输入年龄:\n");
scanf("%d", &pc->data[pos].age);
printf("请输入电话号码:\n");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:\n");
scanf("%s", pc->data[pos].addr);
printf("修改成功!\n");
}
void SortContact(pContact pc)
{
//按姓名升序排序(冒泡排序)
//第一层循环:待排序的元素个数
for (int sz = pc->size; sz > 0; --sz)
{
//第二层循环:找到当前区间中的最大值,存放在当前区间的最后一个位置
for (int i = 1; i < sz; ++i)
{
//data[i]和data[i-1]比较
if (strcmp(pc->data[i - 1].name, pc->data[i].name) > 0)
{
info tmp = pc->data[i - 1];
pc->data[i - 1] = pc->data[i];
pc->data[i] = tmp;
}
}
}
}
int FindContact(pContact pc, char* name)
{
for (int i = 0; i < pc->size; ++i)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
return -1;
}
}
void ShowContact(pContact pc)
{
for (int i = 0; i < pc->size; ++i)
{
printf("===========第%d个人==============\n", i + 1);
printf("姓名:%s\n", pc->data[i].name);
printf("性别:%s\n", pc->data[i].gender);
printf("年龄:%d\n", pc->data[i].age);
printf("电话:%s\n", pc->data[i].tele);
printf("地址:%s\n", pc->data[i].addr);
printf("=================================\n");
}
}
3、主函数部分test.c
#include"Contact.h"
enum OPTION
{
EXIT,
ADD,
DEL,
SEA,
MOD,
SHOW,
SORT
};
void menu()
{
printf("=====================0:exit 1:add 2:del===============\n");
printf("=====================3:search 4:modify 5:show==============\n");
printf("=====================6:sort ================\n");
}
void testContact()
{
Contact ct;
int option;
InitContact(&ct);
do
{
menu();
scanf("%d", &option);
switch (option)
{
case EXIT:
break;
case ADD:
AddContact(&ct);
break;
case DEL:
DelContact(&ct);
break;
case SEA:
SearchContact(&ct);
break;
case MOD:
ModifyContact(&ct);
break;
case SHOW:
ShowContact(&ct);
break;
case SORT:
SortContact(&ct);
break;
default:
printf("输入的选项有误!\n");
}
} while (option);
}
int main()
{
testContact();
return 0;
}
二、动态内存版通讯录
1、头文件部分Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#pragma once
#define NAME_MAX 100
#define GENDER_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 100
#define MAX 200
#define DEFAULT 10
typedef struct info
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}info;
//静态存储
//typedef struct Contact
//{
// info data[MAX];
// int size;
//}Contact,*pContact;
//动态存储
typedef struct Contact
{
info* data;
int size;
int capacity;//当前空间的大小
}Contact, *pContact;
void InitContact(pContact pc);
int CheckCapacity(pContact pc);
void AddContact(pContact pc);
void DelContact(pContact pc);
void SearchContact(pContact pc);
int FindContact(pContact pc, char* name);
void ModifyContact(pContact pc);
void SortContact(pContact pc);
void ShowContact(pContact pc);
2、函数实现部分Contact.c
#include"Contact.h"
void InitContact(pContact pc)
{
pc->size = 0;
pc->data = (info*)malloc(sizeof(info)*DEFAULT);
pc->capacity = DEFAULT;
}
int CheckCapacity(pContact pc)
{
if (pc->size == pc->capacity)
{
//pc->data = (info*)realloc(pc->data, sizeof(info)*(pc->capacity + 10));
info*tmp = (info*)malloc(sizeof(info)*(pc->capacity + 10));
if (pc->data == NULL)
return 0;
memcpy(tmp, pc->data, sizeof(info)*pc->size);
free(pc->data);
pc->data = tmp;
pc->capacity += 10;
}
return 1;
}
void AddContact(pContact pc)
{
info curInfo;
if (CheckCapacity(pc) == 0)
{
printf("通讯录已满!添加失败。\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", curInfo.name);
printf("请输入性别:\n");
scanf("%s", curInfo.gender);
printf("请输入年龄:\n");
scanf("%d", &curInfo.age);
printf("请输入电话号码:\n");
scanf("%s", curInfo.tele);
printf("请输入地址:\n");
scanf("%s", curInfo.addr);
pc->data[pc->size] = curInfo;
pc->size++;
}
void DelContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入被删除的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,删除失败!\n");
return;
}
for (int i = pos; i < pc->size-1; ++i)
{
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("删除成功!\n");
}
void SearchContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入要查找的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,查找失败!\n");
return;
}
printf("===============================\n");
printf("姓名:%s\n", pc->data[pos].name);
printf("性别:%s\n", pc->data[pos].gender);
printf("年龄:%d\n", pc->data[pos].age);
printf("电话:%s\n", pc->data[pos].tele);
printf("地址:%s\n", pc->data[pos].addr);
printf("===============================\n");
}
void ModifyContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入要修改的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,修改失败!\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", pc->data[pos].name);
printf("请输入性别:\n");
scanf("%s", pc->data[pos].gender);
printf("请输入年龄:\n");
scanf("%d", &pc->data[pos].age);
printf("请输入电话号码:\n");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:\n");
scanf("%s", pc->data[pos].addr);
printf("修改成功!\n");
}
void SortContact(pContact pc)
{
//按姓名升序排序(冒泡排序)
//第一层循环:待排序的元素个数
for (int sz = pc->size; sz > 0; --sz)
{
//第二层循环:找到当前区间中的最大值,存放在当前区间的最后一个位置
for (int i = 1; i < sz; ++i)
{
//data[i]和data[i-1]比较
if (strcmp(pc->data[i - 1].name, pc->data[i].name) > 0)
{
info tmp = pc->data[i - 1];
pc->data[i - 1] = pc->data[i];
pc->data[i] = tmp;
}
}
}
}
int FindContact(pContact pc, char* name)
{
for (int i = 0; i < pc->size; ++i)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
return -1;
}
}
void ShowContact(pContact pc)
{
for (int i = 0; i < pc->size; ++i)
{
printf("===========第%d个人==============\n", i + 1);
printf("姓名:%s\n", pc->data[i].name);
printf("性别:%s\n", pc->data[i].gender);
printf("年龄:%d\n", pc->data[i].age);
printf("电话:%s\n", pc->data[i].tele);
printf("地址:%s\n", pc->data[i].addr);
printf("=================================\n");
}
}
3、主函数部分test.c
#include"Contact.h"
enum OPTION
{
EXIT,
ADD,
DEL,
SEA,
MOD,
SHOW,
SORT
};
void menu()
{
printf("=====================0:exit 1:add 2:del===============\n");
printf("=====================3:search 4:modify 5:show==============\n");
printf("=====================6:sort ================\n");
}
void testContact()
{
Contact ct;
int option;
InitContact(&ct);
do
{
menu();
scanf("%d", &option);
switch (option)
{
case EXIT:
break;
case ADD:
AddContact(&ct);
break;
case DEL:
DelContact(&ct);
break;
case SEA:
SearchContact(&ct);
break;
case MOD:
ModifyContact(&ct);
break;
case SHOW:
ShowContact(&ct);
break;
case SORT:
SortContact(&ct);
break;
default:
printf("输入的选项有误!\n");
}
} while (option);
}
int main()
{
testContact();
return 0;
}
三、文件版通讯录
1、头文件部分Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#pragma once
#define NAME_MAX 100
#define GENDER_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 100
#define MAX 200
#define DEFAULT 10
typedef struct info
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}info;
//静态存储
//typedef struct Contact
//{
// info data[MAX];
// int size;
//}Contact,*pContact;
//动态存储
typedef struct Contact
{
info* data;
int size;
int capacity;//当前空间的大小
}Contact, *pContact;
void InitContact(pContact pc);
int CheckCapacity(pContact pc);
void AddContact(pContact pc);
void DelContact(pContact pc);
void SearchContact(pContact pc);
int FindContact(pContact pc, char* name);
void ModifyContact(pContact pc);
void SortContact(pContact pc);
void ShowContact(pContact pc);
void LoadContact(pContact pc);
void SaveContact(pContact pc);
2、函数实现部分Contact.c
#include"Contact.h"
void InitContact(pContact pc)
{
pc->size = 0;
pc->data = (info*)malloc(sizeof(info)*DEFAULT);
pc->capacity = DEFAULT;
}
int CheckCapacity(pContact pc)
{
if (pc->size == pc->capacity)
{
//pc->data = (info*)realloc(pc->data, sizeof(info)*(pc->capacity + 10));
info*tmp = (info*)malloc(sizeof(info)*(pc->capacity + 10));
if (pc->data == NULL)
return 0;
memcpy(tmp, pc->data, sizeof(info)*pc->size);
free(pc->data);
pc->data = tmp;
pc->capacity += 10;
}
return 1;
}
void AddContact(pContact pc)
{
info curInfo;
if (CheckCapacity(pc) == 0)
{
printf("通讯录已满!添加失败。\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", curInfo.name);
printf("请输入性别:\n");
scanf("%s", curInfo.gender);
printf("请输入年龄:\n");
scanf("%d", &curInfo.age);
printf("请输入电话号码:\n");
scanf("%s", curInfo.tele);
printf("请输入地址:\n");
scanf("%s", curInfo.addr);
pc->data[pc->size] = curInfo;
pc->size++;
}
void DelContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入被删除的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,删除失败!\n");
return;
}
for (int i = pos; i < pc->size-1; ++i)
{
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("删除成功!\n");
}
void SearchContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入要查找的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,查找失败!\n");
return;
}
printf("===============================\n");
printf("姓名:%s\n", pc->data[pos].name);
printf("性别:%s\n", pc->data[pos].gender);
printf("年龄:%d\n", pc->data[pos].age);
printf("电话:%s\n", pc->data[pos].tele);
printf("地址:%s\n", pc->data[pos].addr);
printf("===============================\n");
}
void ModifyContact(pContact pc)
{
char name[NAME_MAX];
printf("请输入要修改的人的姓名:\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (pos == -1)
{
printf("此人不存在,修改失败!\n");
return;
}
printf("请输入姓名:\n");
scanf("%s", pc->data[pos].name);
printf("请输入性别:\n");
scanf("%s", pc->data[pos].gender);
printf("请输入年龄:\n");
scanf("%d", &pc->data[pos].age);
printf("请输入电话号码:\n");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:\n");
scanf("%s", pc->data[pos].addr);
printf("修改成功!\n");
}
void SortContact(pContact pc)
{
//按姓名升序排序(冒泡排序)
//第一层循环:待排序的元素个数
for (int sz = pc->size; sz > 0; --sz)
{
//第二层循环:找到当前区间中的最大值,存放在当前区间的最后一个位置
for (int i = 1; i < sz; ++i)
{
//data[i]和data[i-1]比较
if (strcmp(pc->data[i - 1].name, pc->data[i].name) > 0)
{
info tmp = pc->data[i - 1];
pc->data[i - 1] = pc->data[i];
pc->data[i] = tmp;
}
}
}
}
int FindContact(pContact pc, char* name)
{
for (int i = 0; i < pc->size; ++i)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
return -1;
}
}
void ShowContact(pContact pc)
{
for (int i = 0; i < pc->size; ++i)
{
printf("===========第%d个人==============\n", i + 1);
printf("姓名:%s\n", pc->data[i].name);
printf("性别:%s\n", pc->data[i].gender);
printf("年龄:%d\n", pc->data[i].age);
printf("电话:%s\n", pc->data[i].tele);
printf("地址:%s\n", pc->data[i].addr);
printf("=================================\n");
}
}
void LoadContact(pContact pc)
{
FILE*pF = fopen("contact.dat", "rb");
if (pF == NULL)
{
printf("打开文件失败!\n");
return;
}
//读取文件内容
info curInfo;
while (fread(&curInfo, sizeof(info), 1, pF))
{
if (CheckCapacity(pc))
{
pc->data[pc->size] = curInfo;
pc->size;
}
}
fclose(pF);
}
void SaveContact(pContact pc)
{
FILE*pF = fopen("contact.dat", "wb");
if (pF == NULL)
{
printf("打开文件失败!\n");
return;
}
for (int i = 0; i < pc->size; ++i)
{
fwrite(pc->data + i, sizeof(info), 1, pF);
}
fclose(pF);
}
3、主函数部分test.c
#include"Contact.h"
enum OPTION
{
EXIT,
ADD,
DEL,
SEA,
MOD,
SHOW,
SORT,
LOAD,
SAVE
};
void menu()
{
printf("=====================0:exit 1:add 2:del===============\n");
printf("=====================3:search 4:modify 5:show==============\n");
printf("=====================6:sort 7:load 8:save==============\n");
}
void testContact()
{
Contact ct;
int option;
InitContact(&ct);
do
{
menu();
scanf("%d", &option);
switch (option)
{
case EXIT:
break;
case ADD:
AddContact(&ct);
break;
case DEL:
DelContact(&ct);
break;
case SEA:
SearchContact(&ct);
break;
case MOD:
ModifyContact(&ct);
break;
case SHOW:
ShowContact(&ct);
break;
case SORT:
SortContact(&ct);
break;
case LOAD:
LoadContact(&ct);
break;
case SAVE:
SaveContact(&ct);
break;
default:
printf("输入的选项有误!\n");
}
} while (option);
}
int main()
{
testContact();
return 0;
}