当前位置:网站首页>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;
}
边栏推荐
- 电话自动拨号在电脑上自动拨打
- 动态网页开发基础
- The so-called software testing ability is actually these 5 points
- 带你深入理解3.4.2的版本更新,对用户带来了什么?
- No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
- Flink Table&Sql API使用遇到的问题总结
- 常用类以及接口
- 使用flink-sql写入mysql的时候,只指定插入的字段,但是会报错id字段错误,没有默认值,创
- 从8k到13k,我全靠这本《接口自动化测试——从入门到精通》
- 量化投资学习——在FPGA上运行高频交易策略
猜你喜欢
随机推荐
Do you know these basic types of software testing?
golang go get 时提示 no Go files in xxx
Did not detect default resource location for test class xxxx
云程发轫,万里可期 | 云扩科技再次入选Gartner《2022年中国ICT技术成熟度曲线报告》
书法家唐效奇
Pen paper records
Software life cycle (the work of each phase of software engineering)
金融口译,口译中金融高频词有哪些
MongoDB 常用查询语句
It's almost 35, still "did a little"?What happened to the test workers who had been in the industry for a few years?
一个刚入行的测试员怎么样做好功能测试?测试思维真的很重要
从零开始配置 vim(9)——初始配置
模型部署ONNX学习
day17正则表达式作业
The so-called software testing ability is actually these 5 points
How does a new tester do functional testing?Test thinking is really important
Dynamic Web Development Fundamentals
flex 的 三个参数:flex-grow、flex-shrink、flex-basis
Shell 文本三剑客 awk
uni-app自定义导航栏