项目名称:通讯录
简单介绍:通讯录是手机里很常见的功能,今天我将用C语言结合数据结构中的顺序表来实现它的一些基本功能。
主要内容:
头文件:
contact.h(定义通讯录及相关操作函数声明)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"perinfo.h"
typedef int data;
typedef struct contact
{
per* p;
data size;
data capcity;
}con;
void coninit(con* pf);
void condestory(con* pf);
void concheck(con* pf);
void conadd(con* pf);
void condel(con* pf);
void conshow(con* pf);
void conmodify(con* pf);
data confindbyname(con* pf,char *name);
perinfo.h(联系人数据定义)
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDRESS_MAX 20
typedef struct perinfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char address[ADDRESS_MAX];
}per;
源码:
#define _CRT_SECURE_NO_WARNINGS
#include"perinfo.h"
#include"contact.h"
void coninit(con* pf)// 通讯录初始化
{
pf->p = NULL;
pf->size = pf->capcity = 0;
}
void condestory(con* pf)// 通讯录销毁
{
if (pf->p)
{
free(pf->p);
pf->p = NULL;
}
}
void concheck(con* pf)// 检查空间是否够用
{
if (pf->size == pf->capcity)
{
data newsize = pf->size == 0 ? 4 : 2 * pf->size;
per*a = (per*)realloc(pf->p, 2 * newsize * sizeof(per));
if (a != NULL)
pf = a;
pf->size = newsize;
}
}
void conadd(con* pf)// 添加联系人信息
{
assert(pf);
concheck(pf);
per z;
printf("请输入要添加的数据:\n");
printf("请输入姓名:\n");
scanf("%s", z.name);
printf("请输入性别:\n");
scanf("%s", z.gender);
printf("请输入年龄:\n");
scanf("%d", &(z.age));
printf("请输入电话号码:\n");
scanf("%s", z.tel);
printf("请输入住址:\n");
scanf("%s", z.address);
strcpy((pf->p)[pf->size].name ,z.name);
strcpy((pf->p)[pf->size].gender, z.gender);
(pf->p)[pf->size].age = z.age;
strcpy((pf->p)[pf->size].tel, z.tel);
strcpy((pf->p)[pf->size].address, z.address);
pf->size++;
}
void condel(con* pf)// 删除联系人信息
{
assert(pf);
assert(pf->size);
char name[NAME_MAX];
data find = confindbyname(pf, name);
printf("请输入要删除的联系人姓名:\n");
scanf("%s", name);
if (find < 0)
printf("要删除的联系人不存在!");
pf->size--;
}
void conshow(con* pf)// 展示联系人信息
{
assert(pf);
int i = 0;
printf(" 姓名 性别 年龄 电话 住址\n");
while (i < pf->size)
{
printf("%s %s %d %s %s",
(pf->p)[i].name,
(pf->p)[i].gender,
(pf->p)[i].age,
(pf->p)[i].tel,
(pf->p)[i].address
);
i++;
}
}
void conmodify(con* pf)// 修改联系人信息
{
assert(pf);
char name[NAME_MAX];
data find= confindbyname(pf, name);
printf("请输入你要修改的联系人姓名:\n");
scanf("%s", name);
if (find < 0)
printf("没找到该联系人");
}
data confindbyname(con* pf, char* name)// 根据联系人姓名查找联系人
{
int i = 0;
while (i < pf->size)
{
if (strcmp((pf->p)[i].name, name) == 0)
return i;
i++;
}
return -1;
}
主函数:
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
#include"perinfo.h"
void menu()//菜单
{
printf("*********通讯录*********\n");
printf("****1.添加****2.删除****\n");
printf("****3.修改****4.展示****\n");
printf("****5.查找****0.退出****\n");
printf("************************\n");
}
int main()
{
char name[NAME_MAX];
int op = -1;
con pf;
coninit(&pf);
do
{
menu();
printf("请选择您的操作\n");
scanf_s("%d", &op);
switch (op)
{
case 1:
conadd(&pf);
break;
case 2:
condel(&pf);
break;
case 3:
conmodify(&pf);
break;
case 4:
conshow(&pf);
break;
case 5:
printf("请输入要删除的用户姓名:\n");
scanf_s("%s", name);
confindbyname(&pf,name);
break;
case 0:
printf("操作结束\n");
break;
default:
printf("输入有误,请重新输入");
break;
}
} while (op != 0);
condestory(&pf);
return 0;
}