通讯录主要完成以下功能
- 存放好友信息
- 增加好友信息
- 删除指定姓名的好友
- 查找好友信息
- 修改好友信息
- 打印好友信息
首先还是创建三个文件,test.c,contact.c,contact.h接下来将分别讲解三个文件下的代码。
test.c
搭建一个主函数,首先通过对通讯录结构体进行创建和初始化,之后通过do{}while();循环和switch语句实现各个功能。
int main()
{
int input = 0;
struct Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
break;
case EXIT:
DestoryContact(&con);
printf("退出通讯录");
break;
default:
printf("选择错误");
break;
}
} while(input);
return 0;
}
然后为程序写一个目录
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#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");
}
然后是contact.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#define max 1000
#define max_name 20
#define max_sex 5
#define max_tele 12
#define max_addr 30
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
enum Option//枚举功能选择
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
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 size;//记录当前已有元素个数
int capacity;
};
然后在contact.h文件中引用我们需要实现的一些函数
void InitContact(struct Contact* ps);
void AddContact(struct Contact* ps);
void ShowContact(struct Contact* ps);
void DelContact( struct Contact*ps);
void SearchContact(struct Contact* ps);
void ModifyContact(struct Contact* ps);
void DestoryContact(struct Contact* ps);
最后在contact.c文件中实现我们需要的函数
结构体初始化函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"contact.h"
#define DEFAULT_SZ 3
void InitContact(struct Contact* ps)
{
ps->data = (struct PeoInfo*)malloc(DEFAULT_SZ* sizeof(struct PeoInfo));
if (ps->data == NULL)
{
return;
}
ps->size = 0;
ps->capacity = DEFAULT_SZ;
}
确认是否 需要增容且是否成功的函数
void checkcapacity(struct Contact* ps)
{
if (ps->size == ps->capacity)
{
struct PeoInfo* ptr = realloc(ps->data, (ps->capacity + 2) * sizeof(PeoInfo));
if (ptr != NULL)
{
ps->data = ptr;
ps->capacity += 2;
printf("增容成功\n");
}
else
{
printf("失败");
}
}
}
增加好友信息,通过传指的方式获得当前指针所指结构体数组的位置,并判断当前位置是否超过初始设置的内存大小,如果没有则对结构体数组中ps指向内存进行赋值,并在赋值结束时使size +1,完成信息的添加。
void AddContact(struct Contact* ps)
{
checkcapacity(ps);
printf("请输入名字:>");
scanf("%s", ps->data[ps->size].name);
printf("请输入年龄:>");
scanf("%d", &(ps->data[ps->size].age));
printf("请输入性别:>");
scanf("%s", ps->data[ps->size].sex);
printf("请输入电话:>");
scanf("%s", ps->data[ps->size].tele);
printf("请输入地址:>");
scanf("%s", ps->data[ps->size].addr);
ps->size++;
printf("添加成功\n");
}
打印好友信息
void ShowContact(struct Contact* ps)
{
if (ps->size == 0)
{
printf("通讯录为空格\n");
}
else
{
int i = 0;
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\t%-20s\n","名字","年龄","性别","电话","地址");
for (i = 0; i < ps->size; i++)
{
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\t%-20s\n",
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].tele,
ps->data[i].addr);
}
}
}
通过名字查找好友的函数实现
static int FindByname(struct Contact* ps, char*Name)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (0 == strcmp(ps->data[i].name, Name))
{
return i;
}
}
return -1;
}
删除好友信息
void DelContact( struct Contact* ps)
{
char Name[max_name];
int pos = 0;
printf("请输入要删除的名字:>");
scanf("%s", Name);
pos=FindByname(ps, Name);
if (pos ==-1)
{
printf("要删除的人不存在");
}
else
{
int j = 0;
for (j = pos; j <ps->size ; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功\n");
}
}
查找函数,通过调用Findbyname函数实现
void SearchContact(const struct Contact* ps)
{
char Name[max_name];
printf("请输入要查找人的名字:>");
scanf("%s", Name);
int i = 0;
int pos = FindByname(ps, Name);
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\t%-20s\n",
ps->data[pos].name,
ps->data[pos].age,
ps->data[pos].sex,
ps->data[pos].tele,
ps->data[pos].addr);
}
}
修改好友信息函数
void ModifyContact(struct Contact* ps)
{
char Name[max_name];
printf("请输入要修改人的名字:>");
scanf("%s", Name);
int i = 0;
int pos = FindByname(ps, Name);
if (pos == -1)
{
printf("要修改的人不存在\n");
}
else
{
printf("请输入名字:>");
scanf("%s", ps->data[pos].name);
printf("请输入年龄:>");
scanf("%d", &(ps->data[pos].age));
printf("请输入性别:>");
scanf("%s", ps->data[pos].sex);
printf("请输入电话:>");
scanf("%s", ps->data[pos].tele);
printf("请输入地址:>");
scanf("%s", ps->data[pos].addr);
printf("修改成功\n");
}
}
清空通讯录 ,通过释放开辟的动态内存空间来实现。
void DestoryContact(struct Contact* ps)
{
free(ps->data);
ps->capacity = ps->size = 0;
}
注:本文章来源于对B站鹏哥C语言教学视频的学习和理解。