通讯录静态版本
创建三个文件: contact.h 通讯录头文件 、contact.c 通讯录函数实现文件 、test.c测试文件
//contact.h 文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define MAX 100
#define MAX_Name 20
#define MAX_Sex 10
#define MAX_Tele 12
#define MAX_Addr 30
typedef struct PeoInfo
{
char name[MAX_Name];
int age;
char sex[MAX_Sex];
char tele[MAX_Tele];
char addr[MAX_Addr];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];
int count;
}Contact;
void InitContact(Contact* pc);
void Add(Contact* pc);
void Show(Contact* pc);
void Del(Contact* pc);
void Search(Contact* pc);
void Modify(Contact* pc);
void Sort(Contact* pc);
//test.c文件
#include"contact.h"
//静态版本
void menu()
{
printf("*************************\n");
printf("******1.add 2.del*******\n");
printf("******3.search 4.modify**\n");
printf("******5.show 6.sort******\n");
printf("******0.exit*************\n");
printf("*************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
Add(&con);
break;
case 2:
Del(&con);
break;
case 3:
Search(&con);
break;
case 4:
Modify(&con);
break;
case 5:
Show(&con);
break;
case 6:
Sort(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入有误,请重试\n");
break;
}
} while (input);
return 0;
}
//contact.c 文件
#include"contact.h"
void InitContact(Contact* pc)
{
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void Add(Contact* pc)
{
assert(pc);
if (pc->count == MAX)
{
printf("联系人已满,无法增加\n");
return;
}
printf("请输入联系人姓名:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入联系人性别:>");
scanf("%s" ,pc->data[pc->count].sex);
printf("请输入联系人电话号码:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入联系人住址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("增加成功\n");
}
int Findname(Contact* pc, char* name)
{
assert(pc);
for (int i = 0; i < pc->count; ++i)
{
if (0 == strcmp(pc->data[i].name, name))
return i;
}
return -1;
}
void Del(Contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录已无联系人\n");
return;
}
char name[20] = { 0 };
printf("请输入要删除的联系人的姓名");
scanf("%s", name);
int pos = Findname(pc, name);
if (pos != -1)
{
printf("找到要删除的联系人\n");
for (int j = pos; j < pc->count-1; ++j)
{
pc->data[j] = pc->data[j + 1];
}
pc->count--;
printf("删除成功\n");
}
else
{
printf("未找到要删除的联系人\n");
}
}
void Search(Contact* pc)
{
assert(pc);
char name_s[20] = { 0 };
printf("输入要查找的联系人的姓名\n");
scanf("%s", name_s);
int pos = Findname(pc, name_s);
if (pos == -1)
{
printf("未找到联系人\n");
return;
}
else
{
printf("找到该联系人了\n");
printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
"姓名", "年龄", "性别", "电话号码", "住址");
printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}
void Modify(Contact* pc)
{
assert(pc);
char name_t[12] = { 0 };
printf("请输入你要修改的联系人的姓名");
scanf("%s", name_t);
int pos = Findname(pc, name_t);
if (pos == -1)
{
printf("未找到要修改的联系人的姓名\n");
return;
}
else
{
printf("找到要修改的联系人的姓名\n");
printf("请修改信息\n");
printf("请输入联系人姓名:>");
scanf("%s", pc->data[pos].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pc->data[pos].age));
printf("请输入联系人性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入联系人电话号码:>");
scanf("%s", pc->data[pos].tele);
printf("请输入联系人住址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
}
int compare_name(const void* e1, const void* e2)
{
assert(e1 && e2);
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sort(Contact* pc)
{
assert(pc);
printf("按姓名排序\n");
qsort(pc->data, pc->count, sizeof(PeoInfo), compare_name);
printf("排序成功\n");
}
void Show(Contact* pc)
{
assert(pc);
printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
"姓名", "年龄", "性别", "电话号码", "住址");
for (int i = 0; i < pc->count; ++i)
{
printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n",pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
通讯录动态版本
我们最初让通讯录可以保存3个人的信息,不够的话每次增加2个,这就需要增容,用到malloc、realloc函数了。
结构体PeoInfo 不用改,Contact 里面data不能用数组了,我们改成指针,同时增加一个成员:capacity用来记录容量,当count(实际联系人个数) ==capacity时,就说明需要增容了。
函数部分需要改变的是初始化,以及增加Add函数,并最后在退出程序时执行销毁操作,释放内存,其它地方可以不改变,代码如下:
//contact.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define MAX 100
#define MAX_Name 20
#define MAX_Sex 10
#define MAX_Tele 12
#define MAX_Addr 30
typedef struct PeoInfo
{
char name[MAX_Name];
int age;
char sex[MAX_Sex];
char tele[MAX_Tele];
char addr[MAX_Addr];
}PeoInfo;
typedef struct Contact
{
PeoInfo *data;
int count;
int capacity;
}Contact;
void InitContact(Contact* pc);
void Add(Contact* pc);
void Show(Contact* pc);
void Del(Contact* pc);
void Search(Contact* pc);
void Modify(Contact* pc);
void Sort(Contact* pc);
void Destory(Contact* pc);
//test.c
#include"contact.h"
//动态版本
void menu()
{
printf("*************************\n");
printf("******1.add 2.del*******\n");
printf("******3.search 4.modify**\n");
printf("******5.show 6.sort******\n");
printf("******0.exit*************\n");
printf("*************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
Add(&con);
break;
case 2:
Del(&con);
break;
case 3:
Search(&con);
break;
case 4:
Modify(&con);
break;
case 5:
Show(&con);
break;
case 6:
Sort(&con);
break;
case 0:
Destory(&con);
printf("退出通讯录\n");
break;
default:
printf("输入有误,请重试\n");
break;
}
} while (input);
return 0;
}
//contact.c
#include"contact.h"
void InitContact(Contact* pc)
{
pc->count = 0;
pc->data = (PeoInfo*)calloc(3,sizeof(PeoInfo));
if (pc->data == NULL)
{
printf("%s\n", strerror(errno));
return;
}
pc->capacity = 3;
}
CheckCapacity(Contact* pc)
{
if (pc->count == pc->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (3 + 2));
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return;
}
else
{
pc->data = ptr;
pc->capacity += 2;
printf("增容成功\n");
}
}
}
void Add(Contact* pc)
{
assert(pc);
CheckCapacity(pc);
printf("请输入联系人姓名:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入联系人性别:>");
scanf("%s", pc->data[pc->count].sex);
printf("请输入联系人电话号码:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入联系人住址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("增加成功\n");
}
int Findname(Contact* pc, char* name)
{
assert(pc);
for (int i = 0; i < pc->count; ++i)
{
if (0 == strcmp(pc->data[i].name, name))
return i;
}
return -1;
}
void Del(Contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录已无联系人\n");
return;
}
char name[20] = { 0 };
printf("请输入要删除的联系人的姓名");
scanf("%s", name);
int pos = Findname(pc, name);
if (pos != -1)
{
printf("找到要删除的联系人\n");
for (int j = pos; j < pc->count - 1; ++j)
{
pc->data[j] = pc->data[j + 1];
}
pc->count--;
printf("删除成功\n");
}
else
{
printf("未找到要删除的联系人\n");
}
}
void Search(Contact* pc)
{
assert(pc);
char name_s[20] = { 0 };
printf("输入要查找的联系人的姓名\n");
scanf("%s", name_s);
int pos = Findname(pc, name_s);
if (pos == -1)
{
printf("未找到联系人\n");
return;
}
else
{
printf("找到该联系人了\n");
printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
"姓名", "年龄", "性别", "电话号码", "住址");
printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}
void Modify(Contact* pc)
{
assert(pc);
char name_t[12] = { 0 };
printf("请输入你要修改的联系人的姓名");
scanf("%s", name_t);
int pos = Findname(pc, name_t);
if (pos == -1)
{
printf("未找到要修改的联系人的姓名\n");
return;
}
else
{
printf("找到要修改的联系人的姓名\n");
printf("请修改信息\n");
printf("请输入联系人姓名:>");
scanf("%s", pc->data[pos].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pc->data[pos].age));
printf("请输入联系人性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入联系人电话号码:>");
scanf("%s", pc->data[pos].tele);
printf("请输入联系人住址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
}
int compare_name(const void* e1, const void* e2)
{
assert(e1 && e2);
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sort(Contact* pc)
{
assert(pc);
printf("按姓名排序\n");
qsort(pc->data, pc->count, sizeof(PeoInfo), compare_name);
printf("排序成功\n");
}
void Show(Contact* pc)
{
assert(pc);
printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
"姓名", "年龄", "性别", "电话号码", "住址");
for (int i = 0; i < pc->count; ++i)
{
printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
void Destory(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}