当前位置:网站首页>【C语言】通讯录(动态版本)
【C语言】通讯录(动态版本)
2022-07-27 20:47:00 【沐曦希】
大家好我是沐曦希
通讯录
1.前言
前面写的通讯录有很大缺陷,它是静态的,不能超过所指定的最大数目,也不能减少内存。那么我们可以用所学到的动态内存来实现动态版本的通讯录。
2.动态功能实现
两个核心的结构体的更改
typedef struct PeoIoFo
{
char name[20];
int age;
char sex[10];
char tele[12];
char addr[20];
}PeoIoFo;
typedef struct Contact
{
struct PeoIoFo* data;
int count;
//当前通讯录的容量
int capacity;
}Contact;
1.第二个结构体中的data数组改成了指针变量data,以此来实现动态内存
2.第二个结构体增加了capacity来记录当前的容量一般增加通讯录所能存储联系人的数目。
2.1 初始化通讯录
int InitContact(struct Contact* pc)
{
assert(pc);
pc->count = 0;
pc->data = (PeoIoFo*)calloc(3, sizeof(PeoIoFo));
if (pc->data == NULL)
{
printf("InitContact:%s\n", strerror(errno));
return 1;
}
pc->capacity = 3;
return 0;
}
通过calloc来开辟空间,并初始化通讯录为0。
2.2 添加联系人信息
void AddContact(struct Contact* pc)
{
assert(pc);
if (pc->capacity == pc->count)
{
PeoIoFo* ptr = (PeoIoFo*)realloc(pc->data, sizeof(PeoIoFo) * (pc->capacity + 2));
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return;
}
else
{
pc->data = ptr;
pc->capacity += 2;
printf("增容成功!\n");
}
}
printf("请输入需要添加联系人的名字:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入需要添加联系人的年龄:>");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入需要添加联系人的性别:>");
scanf("%s", pc->data[pc->count].sex);
printf("请输入需要添加联系人的电话号码:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入需要添加联系人的地址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("增加成功!\n");
}
增加联系人前,应该确保通讯录有足够空间来存储联系人信息,如果不够,可以通过realloc函数来增加空间,之后进行增加联系人信息。
2.3 删除所有联系人信息
void AlldelContact(struct Contact* pc)
{
assert(pc);
realloc(pc->data, sizeof(PeoIoFo) * 3);
memset(pc->data, 0, 3 * sizeof(PeoIoFo));
pc->count = 0;
pc->capacity = 3;
}
通过realloc函数来减少通讯录的空间,并将通讯录容量改为3。
2.4 销毁和释放通讯录的空间
动态内存有开辟,就有释放。
void DestroyContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}
3.完整代码
contact.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
typedef struct PeoIoFo
{
char name[20];
int age;
char sex[10];
char tele[12];
char addr[20];
}PeoIoFo;
typedef struct Contact
{
struct PeoIoFo* data;
int count;
//当前通讯录的容量
int capacity;
}Contact;
//初始化通讯录
int InitContact(struct Contact* pc);
//添加联系人信息
void AddContact(struct Contact* pc);
//打印联系人信息
void ShowContact(const struct Contact* pc);
//删除联系人信息
void DelContact(struct Contact* pc);
//查找联系人
void SearchContact(const struct Contact* pc);
//修改联系人信息
void ModifyContact(struct Contact* pc);
//排序联系人信息
void SortContact(struct Contact* pc);
//清空所有联系人
void AlldelContact(struct Contact* pc);
//销毁所有联系人信息
void Destory(struct Contact* pc);
test.c
#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 7.alldel ******\n");
printf("**********************************\n");
}
int main()
{
struct Contact Con;
InitContact(&Con);
int input = 0;
do {
menu();
printf("请输入选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&Con);
break;
case 2:
DelContact(&Con);
break;
case 3:
SearchContact(&Con);
break;
case 4:
ModifyContact(&Con);
break;
case 5:
ShowContact(&Con);
break;
case 6:
SortContact(&Con);
break;
case 7:
AlldelContact(&Con);
break;
case 0:
printf("退出通讯录\n");
Destory(&Con);
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
contact.c
#include"contact.h"
void menu1()
{
printf("1.名字\n");
printf("2.年龄\n");
printf("3.性别\n");
printf("4.电话号码\n");
printf("5.地址\n");
printf("0.退出\n");
}
void ModifyName(Contact* pc, int ret)
{
printf("请输入更改后的名字:>");
scanf("%s", pc->data[ret].name);
}
void ModifyAge(Contact* pc, int ret)
{
printf("请输入更改后的年龄:>");
scanf("%d", &(pc->data[ret].age));
}
void ModifySex(Contact* pc, int ret)
{
printf("请输入更改后的性别:>");
scanf("%s", pc->data[ret].sex);
}
void ModifyTele(Contact* pc, int ret)
{
printf("请输入更改后的电话号码:>");
scanf("%s", pc->data[ret].tele);
}
void ModifyAddr(Contact* pc, int ret)
{
printf("请输入更改后的地址:>");
scanf("%s", pc->data[ret].addr);
}
int InitContact(struct Contact* pc)
{
assert(pc);
pc->count = 0;
pc->data = (PeoIoFo*)calloc(3, sizeof(PeoIoFo));
if (pc->data == NULL)
{
printf("InitContact:%s\n", strerror(errno));
return 1;
}
pc->capacity = 3;
return 0;
}
static int FindName(const Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
return i;
}
return -1;
}
static void print(const Contact* pc, int ret)
{
printf("%-20s\t%-3s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话号码", "地址");
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-20s\n", pc->data[ret].name,
pc->data[ret].age,
pc->data[ret].sex,
pc->data[ret].tele,
pc->data[ret].addr);
}
void AddContact(struct Contact* pc)
{
assert(pc);
if (pc->capacity == pc->count)
{
PeoIoFo* ptr = (PeoIoFo*)realloc(pc->data, sizeof(PeoIoFo) * (pc->capacity + 2));
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return;
}
else
{
pc->data = ptr;
pc->capacity += 2;
printf("增容成功!\n");
}
}
printf("请输入需要添加联系人的名字:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入需要添加联系人的年龄:>");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入需要添加联系人的性别:>");
scanf("%s", pc->data[pc->count].sex);
printf("请输入需要添加联系人的电话号码:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入需要添加联系人的地址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("增加成功!\n");
}
void ShowContact(const struct Contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,没有联系人信息可以打印!\n");
return;
}
int i = 0;
printf("%-20s\t%-3s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话号码", "地址");
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-3d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
void DelContact(struct Contact* pc)
{
char name[20] = {
'\0' };
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,没有联系人可以删除!\n");
return;
}
printf("请输入需要删除人的名字:>");
scanf("%s", name);
int ret = FindName(pc, name);
if (ret == -1)
{
printf("通讯录上无此联系人!\n");
return;
}
int i = 0;
for (i = ret; i < pc->count - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf("删除联系人成功!\n");
}
void SearchContact(const struct Contact* pc)
{
assert(pc);
char name[20];
if (pc->count == 0)
{
printf("通讯录为空,没有联系人可以查找!\n");
return;
}
printf("请输入需要查找的联系人的姓名:>");
scanf("%s", name);
int ret = FindName(pc, name);
if (ret == -1)
{
printf("通讯录上没有此联系人!\n");
return;
}
printf("找到该联系人:\n");
print(pc, ret);
}
void ModifyContact(struct Contact* pc)
{
assert(pc);
char name[20];
if (pc->count == 0)
{
printf("通讯录为空,没有联系人可以修改!\n");
return;
}
printf("请输入需要修改的联系人的姓名:>");
scanf("%s", name);
int ret = FindName(pc, name);
if (ret == -1)
{
printf("通讯录上无此联系人!\n");
return;
}
printf("找到该联系人:\n");
print(pc, ret);
int input = 0;
do
{
menu1();
printf("请输入选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
ModifyName(pc, ret);
printf("修改后:>\n");
print(pc, ret);
break;
case 2:
ModifyAge(pc, ret);
printf("修改后:>\n");
print(pc, ret);
break;
case 3:
ModifySex(pc, ret);
printf("修改后:>\n");
print(pc, ret);
break;
case 4:
ModifyTele(pc, ret);
printf("修改后:>\n");
print(pc, ret);
break;
case 5:
ModifyAddr(pc, ret);
printf("修改后:>\n");
print(pc, ret);
break;
case 0:
printf("退处修改!\n");
break;
default:
break;
}
} while (input);
}
int cmp_Name(const void* e1, const void* e2)
{
return strcmp(((PeoIoFo*)e1)->name, ((PeoIoFo*)e2)->name);
}
int cmp_int(const void* e1, const void* e2)
{
return (((PeoIoFo*)e1)->age - ((PeoIoFo*)e2)->age);
}
int cmp_Sex(const void* e1, const void* e2)
{
return strcmp(((PeoIoFo*)e1)->sex, ((PeoIoFo*)e2)->sex);
}
int cmp_Tele(const void* e1, const void* e2)
{
return strcmp(((PeoIoFo*)e1)->tele, ((PeoIoFo*)e2)->tele);
}
int cmp_Addr(const void* e1, const void* e2)
{
return strcmp(((PeoIoFo*)e1)->addr, ((PeoIoFo*)e2)->addr);
}
void SortContact(struct Contact* pc)
{
if (pc->count == 0)
{
printf("通讯录为空,无需进行排序!\n");
return;
}
int input = 0;
do
{
menu1();
printf("请输入选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
qsort(pc->data, pc->count, sizeof(PeoIoFo), cmp_Name);
printf("排序后:>\n");
ShowContact(pc);
break;
case 2:
qsort(pc->data, pc->count, sizeof(PeoIoFo), cmp_int);
printf("排序后:>\n");
ShowContact(pc);
break;
case 3:
qsort(pc->data->sex, pc->count, sizeof(PeoIoFo), cmp_Sex);
printf("排序后:>\n");
ShowContact(pc);
break;
case 4:
qsort(pc->data->sex, pc->count, sizeof(PeoIoFo), cmp_Tele);
printf("排序后:>\n");
ShowContact(pc);
break;
case 5:
qsort(pc->data->sex, pc->count, sizeof(PeoIoFo), cmp_Addr);
printf("排序后:>\n");
ShowContact(pc);
break;
case 0:
printf("退处修改!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
}
void AlldelContact(struct Contact* pc)
{
assert(pc);
realloc(pc->data, sizeof(PeoIoFo) * 3);
memset(pc->data, 0, 3 * sizeof(PeoIoFo));
pc->count = 0;
pc->capacity = 3;
}
void DestroyContact(Contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
}
4.写在最后
那么动态版本的通讯录就到这里了。

边栏推荐
猜你喜欢

Desai wisdom number - other charts (parallel coordinate chart): family's willingness to allocate assets in the future

评价自动化测试优劣的隐性指标

Microsoft Office 2019 download installation activation tutorial (full process diagram)

Visual display method of machine learning project

面试官:说一下网络数据传输的具体流程

NDK series (6): let's talk about the way and time to register JNI functions

寻找和利用 XXE – XML 外部实体注入

他山之石 | 蚂蚁超大规模知识图谱构建及应用

Lanproxy映射本地开发环境

Process and planned task management
随机推荐
Figure basic knowledge code
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: un
The principle and demonstration of service path lifting without quotation marks
怎么使用C# Winform实现复制文件显示进度
NDK series (6): let's talk about the way and time to register JNI functions
软件测试功能测试全套常见面试题【功能测试】面试总结4-2
2019年全球十大半导体厂商:英特尔重回第一,苹果逆势大涨
See how Gan controls the image generation style step by step? Explain the evolution process of stylegan in detail
Reinforcement learning - pytorch realizes advantage actor critical (A2C)
[CVA valuation training camp] how to quickly read the annual reports of listed companies - Lesson 4
Apple releases new iPhone se: equipped with A13 bionic processor, priced from 3299 yuan
台积电3nm细节曝光:晶体管密度高达2.5亿个/mm²,性能及能效大幅提升
JUC工具包学习
Microsoft Office 2019 download installation activation tutorial (full process diagram)
【数字识别】基于知识库实现手写体数字识别附matlab代码
测试文章
携手长江存储,江波龙推出全球最小扩展卡
Containerd CTR run the ansible container and execute the complete command of ansible playbook task
新技术引领大中型企业营销新变革,用友BIP CRM重磅发布!
【软考软件评测师】2014综合知识历年真题