当前位置:网站首页>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;
}
边栏推荐
- ARP欺骗-教程详解
- 金融口译,口译中金融高频词有哪些
- Take you to an in-depth understanding of the version update of 3.4.2, what does it bring to users?
- 【2022河南萌新联赛第(五)场:信息工程大学】【部分思路题解+代码解析】
- flutter 制作嵌套列表
- Did not detect default resource location for test class xxxx
- Redis 定长队列的探索和实践
- 学习总结week4_1json
- 线程执行测试效果
- 快35了,还在“点点点”?那些入行几年的测试点工后来都怎么样了?
猜你喜欢
随机推荐
flutter 创建可增型列表和列表排序
Recommend several easy-to-use MySQL open source clients, it is recommended to collect
树的介绍、树的定义和基本术语、二叉树的定义和性质、二叉树的顺序表示与实现和链式表示与实现以及树的遍历方法以及两种创建方式
Shell 文本三剑客 awk
三极管开关电路参数设计与参数介绍
sql优化
exchange2010 邮件数据库无法装入
从零开始配置 vim(9)——初始配置
Leetcode 47 全排列Ⅱ
使用注解实现限流
二维空间下的向量旋转
Kettle 裁剪表详解(truncate)
netstat和ss命令区别
金融财经翻译的行业前景如何
Mini Program Navigation and Navigation Parameters
Flink CDC 2.0及其他数据同步工具对比
zabbix添加监控主机和自定义监控项
Dijkstra求最短路
Do you know these basic types of software testing?
flutter异步