当前位置:网站首页>c语言:通讯录(动态版本)
c语言:通讯录(动态版本)
2022-08-10 03:25:00 【摸鱼王胖嘟嘟】
前言
大家好~今天是通讯录的动态版本实现,希望对大家对知识的掌握有所提升!
contact.c
#include"contact.h"
//初始化通讯录
void InitContact(Contact* pc)
{
assert(pc);
pc->sz = 0;
pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
if (NULL == pc->data)
{
printf("InitContact: :%s\n", strerror(errno));
return;
}
pc->capacity = DEFAULT_SZ;
}
static void CheckCapacity(Contact* pc)
{
if (pc->capacity == pc->sz)
{
PeoInfo* prt = (PeoInfo*)realloc(pc->data, (pc->capacity + INCREASE_SZ) * sizeof(PeoInfo));
if (NULL == prt)
{
printf("AddContact: :%s\n", strerror(errno));
return;
}
else
{
pc->data = prt;
pc->capacity += INCREASE_SZ;
printf("增容成功\n");
}
}
}
//增加联系人信息
void AddContact(Contact* pc)
{
assert(pc);
CheckCapacity(pc);
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("增加联系人信息成功\n");
}
void DestroyContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}
//打印联系人信息
void PrintContact(Contact* pc)
{
assert(pc);
if (0 == pc->sz)
{
printf("通讯录为空\n");
return;
}
int i = 0;
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name,
pc->data[i].age, pc->data[i].sex,
pc->data[i].tele, pc->data[i].addr);
}
}
static int Find_By_NAME(const Contact* pc,char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//删除联系人信息
void DelContact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = {
0 };
if (pc->sz == 0)
{
printf("通讯录为空,无法删除信息\n");
return;
}
else
{
printf("请输入要删除联系人的姓名:>");
scanf("%s", name);
int pos = Find_By_NAME(pc, name);
if (pos == -1)
{
printf("要删除的联系人不存在\n");
return;
}
int i = 0;
for (i = pos; i < (pc->sz - 1); i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除联系人信息成功\n");
}
}
//查找联系人信息
void SearchContact(const Contact* pc)
{
assert(pc);
char name[NAME_MAX] = {
0 };
printf("请输入要查找联系人的姓名:>");
scanf("%s", name);
int pos = Find_By_NAME(pc, name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
return;
}
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[pos].name,
pc->data[pos].age, pc->data[pos].sex,
pc->data[pos].tele, pc->data[pos].addr);
}
//修改联系人信息
void ModifyContact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = {
0 };
printf("请输入要修改联系人的姓名:>");
scanf("%s", name);
int pos = Find_By_NAME(pc, name);
if (pos == -1)
{
printf("要修改的联系人不存在\n");
return;
}
else
{
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].addr);
printf("请输入修改后人员的电话:>");
scanf("%s", pc->data[pos].tele);
printf("修改联系人员信息成功\n");
}
}
//排序联系人信息
static int cmp_Per_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
assert(pc);
qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_Per_by_name);
PrintContact(pc);
}
//清空联系人信息
void ClearContact(Contact* pc)
{
assert(pc);
InitContact(pc);
printf("清空成功\n");
}
contact.h
#pragma once
//头文件的包含
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
//定义结构体类型
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000
#define DEFAULT_SZ 3
#define INCREASE_SZ 2
//创建通讯录
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInfo;
//动态版本
typedef struct Contact
{
PeoInfo* data;//存放人的信息,维护通讯录的指针
int sz;//记录通讯录中实际联系人的个数
int capacity;//当前通讯录的容量
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//增加联系人信息
void AddContact(Contact* pc);
//打印联系人信息
void PrintContact(Contact* pc);
//删除联系人信息
void DelContact(Contact* pc);
//查找联系人信息
void SearchContact(const Contact* pc);
//修改联系人信息
void ModifyContact(Contact* pc);
//排序联系人信息
void SortContact(Contact* pc);
//清空联系人信息
void ClearContact(Contact* pc);
//释放通讯录动态内存
void DestroyContact(Contact* pc);
test.c
#include"contact.h"
menu()
{
printf("********************************************\n");
printf("********* 1.add 2.del *********\n");
printf("********* 3.search 4.modify *********\n");
printf("********* 5.sort 6.print *********\n");
printf("********* 7.clear 0.exit *********\n");
printf("********************************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT,
CLEAR
};
int main()
{
int input = 0;
//创建通讯录
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 SORT:
SortContact(&Con);
break;
case PRINT:
PrintContact(&Con);
break;
case CLEAR:
ClearContact(&Con);
break;
case EXIT:
DestroyContact(&Con);
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
边栏推荐
猜你喜欢
随机推荐
【Verilog数字系统设计(夏雨闻)5-------模块的结构、数据类型、变量和基本运算符号1】
Shell 文本三剑客 awk
WPF 实现更换主题色
js阻止事件冒泡方案
Basic understanding of network models
有关视频传输时粘包问题的一些解决方法
模型部署ONNX学习
第三章 搜索与图论(二)
使用 requestAnimationFrame 提升 web 性能
怎么进行服务器性能监控,有什么监控工具
Dynamic Web Development Fundamentals
Redis 定长队列的探索和实践
Kettle 裁剪表详解(truncate)
三极管开关电路参数设计与参数介绍
flutter 每天一背,需要掌握
软件的生命周期(软件工程各阶段的工作)
使用curl指令发起websocket请求
质量小议13 -- 侥幸
【2022河南萌新联赛第(五)场:信息工程大学】【部分思路题解+代码解析】
NFG电商系统在元宇宙趋势下做什么?









