C语言进阶|通讯录的实现

embedded/2024/9/25 19:15:19/

基于动态顺序表实现通讯录

C语言基础要求:结构体、动态内存管理、顺序表、文件操作
1、功能要求

  1. 至少能够存储100个人的通讯信息
  2. 能够保存用户信息:名字、性别、年龄、电话、地址等
  3. 增加联系人信息
  4. 删除指定联系人
  5. 查找制定联系人
  6. 修改指定联系人
  7. 显示联系人信息

2、代码实现

【思考1】用静态顺序表和动态顺序表分别如何实现
【思考2】如何保证程序结束后,历史通讯录信息不会丢失

//contact.h
#define NAME_MAX 11
#define TEL_MAX 13
#define SEX_MAX 5
#define ADDR_MAX 14
//通讯录包含的类型
typedef struct
{char name[NAME_MAX];int age;char tel[TEL_MAX];char sex[SEX_MAX];char addr[ADDR_MAX];
}PersonInfo;
//前置声明
struct Seqlist;
typedef struct Seqlist CT;
//初始化
void CTInit(CT* ct);
//销毁
void CTDestroy(CT* ct);
//查看
void CTCheck(CT* ct);
//增加
void CTAdd(CT* ct);
//删除
void CTDel(CT* ct);
//查找
void CTFind(CT* ct);
//修改
void CTVice(CT* ct);
//contact.c
//查找函数
int CTFind1(CT* ct)
{char tmp[NAME_MAX] = { 0 };scanf("%s", tmp);for (int i = 0; i < ct->size; i++){if (!strcmp(tmp, ct->sqlist->name)){return i;}}return -1;}
//赋值函数
void CTAss(SLTYPE* a, SLTYPE* b)
{for (int i = 0; i < NAME_MAX; i++)a->name[i] = b->name[i];a->age = b->age;for (int i = 0; i < TEL_MAX; i++)a->tel[i] = b->tel[i];for (int i = 0; i < SEX_MAX; i++)a->sex[i] = b->sex[i];for (int i = 0; i < ADDR_MAX; i++)a->addr[i] = b->addr[i];
}
//初始化
void CTInit(CT* ct)
{ct->size = 0;ct->capacity = 0;ct->sqlist = NULL;
}
//销毁
void CTDestroy(CT* ct)
{free(ct->sqlist);ct->sqlist = NULL;ct->size = ct->capacity = 0;
}
//查看
void CTCheck(CT* ct)
{printf("%-11s%-8s%-13s%-8s%-14s\n", "姓名", "年龄", "电话", "性别", "住址");for (int i = 0; i < ct->size; i++){printf("%-11s%-8d%-13s%-8s%-14s\n", ct->sqlist[i].name, ct->sqlist[i].age, ct->sqlist[i].tel, ct->sqlist[i].sex, ct->sqlist[i].addr);}
}
//增加
void CTAdd(CT* ct)
{//先判断是否要扩容if (ct->size == ct->capacity){int newcapacity = ct->capacity == 0 ? 4 : 2 * ct->capacity;SLTYPE* tmp = (SLTYPE*)realloc(ct->sqlist, newcapacity * sizeof(SLTYPE));if (tmp == NULL){perror("realloc");exit(1);}ct->sqlist = tmp;}printf("请输入联系人的姓名:\n");scanf("%s", (ct->sqlist+ct->size)->name);printf("请输入联系人的年龄:\n");scanf("%d", &(ct->sqlist+ ct->size)->age);printf("请输入联系人的电话:\n");scanf("%s", (ct->sqlist+ ct->size)->tel);printf("请输入联系人的性别:\n");scanf("%s", (ct->sqlist+ ct->size)->sex);printf("请输入联系人的地址:\n");scanf("%s", (ct->sqlist+ ct->size)->addr);ct->size++;CTSort(ct);
}
//删除
void CTDel(CT* ct)
{printf("请输入要删除的联系人:\n");int pos = CTFind1(ct);if (pos == -1){printf("找不到此联系人,请检查是否输入错误。\n");return;}for (int i = pos; i < ct->size; i++){CTAss(ct->sqlist + i, ct->sqlist + i + 1);}ct->size--;printf("删除成功!\n");
}
//查找
void CTFind(CT* ct)
{printf("请输入想要查找的联系人:\n");int pos = CTFind1(ct);printf("%-11s%-8s%-13s%-8s%-14s\n", "姓名", "年龄", "电话", "性别", "住址");printf("%-11s%-8d%-13s%-8s%-14s\n", ct->sqlist[pos].name, ct->sqlist[pos].age, ct->sqlist[pos].tel, ct->sqlist[pos].sex, ct->sqlist[pos].addr);
}
//修改
void CTVice(CT* ct)
{printf("请输入要修改的联系人:\n");int pos = CTFind1(ct);if (pos == -1){printf("找不到此联系人,请检查是否输入错误。\n");return;}char type[8] = { 0 };printf("请输入要修改的数据类型:\n");scanf("%s", type);if (!strcmp(type, "姓名")){printf("请输入要修改的姓名:\n");char tmp_name[NAME_MAX] = { 0 };scanf("%s", tmp_name);for (int i = 0; i < NAME_MAX; i++)(ct->sqlist+pos)->name[i] = tmp_name[i];CTSort(ct);}else if (!strcmp(type, "年龄")){printf("请输入要修改的年龄:\n");int tmp_age = 0;scanf("%d", &tmp_age);(ct->sqlist+pos)->age = tmp_age;}else if (!strcmp(type, "电话")){printf("请输入要修改的电话:\n");char tmp_tel[TEL_MAX] = { 0 };scanf("%s", &tmp_tel);for (int i = 0; i < TEL_MAX; i++)(ct->sqlist+pos)->tel[i] = tmp_tel[i];}else if (!strcmp(type, "性别")){printf("请输入要修改的性别:\n");char tmp_sex[SEX_MAX] = { 0 };scanf("%s", tmp_sex);for (int i = 0; i < SEX_MAX; i++)(ct->sqlist+pos)->sex[i] = tmp_sex[i];}else if (!strcmp(type, "住址")){printf("请输入要修改的住址:\n");char tmp_addr[ADDR_MAX] = { 0 };scanf("%s", tmp_addr);}else{printf("输入错误\n");}
}
//test.c
void menu()
{printf("**************************************\n");printf("*****1.添加联系人    2.删除联系人*****\n");printf("*****3.查找联系人    4.修改联系人*****\n");printf("*****5.查看联系人    0.  退  出  *****\n");printf("**************************************\n");
}int main()
{CT contect1;CTInit(&contect1);int choice = 1;do{menu();printf("请输入你要做的选项:\n");scanf("%d", &choice);switch (choice){case 1:CTAdd(&contect1);break;case 2:CTDel(&contect1);break;case 3:CTFind(&contect1);break;case 4:CTVice(&contect1);break;case 5:CTCheck(&contect1);break;case 0:CTDestroy(&contect1);break;default:printf("输入错误,请重新输入:\n");break;}} while (choice);return 0;
}

顺序表的问题及思考

  1. 中间/头部的插入删除,时间复杂度为O(N)。
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

思考:如何解决以上问题呢?


http://www.ppmy.cn/embedded/4848.html

相关文章

2024-Java-Maven学习笔记

Maven Maven是一个Java项目管理和构建工具&#xff0c;作用&#xff1a;定义&#xff08;规范&#xff09;项目结构、项目依赖、使用统一的方式自动化构建&#xff08;clean、compile&#xff09;。 提供了一套依赖管理机制&#xff1a;利用仓库统一管理jar包&#xff0c;利用…

如何加速量子网络?——光子“打包”发送,突破远程传输极限

未来的光纤量子网络有望支持远距离量子计算机之间的通信。目前&#xff0c;长距离快速传输量子信息存在重大挑战&#xff0c;因为绝大多数的光子无法在传输中生存下来。 与逐个发送光子相比&#xff0c;成组地向远程站点发送光子能在未来的量子网络中更快地建立量子链路 现在&a…

【从浅学到熟知Linux】环境变量详谈(含使用程序获取环境变量的3种方法、如何查看环境变量)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 环境变量基本概念查看环境变量的方法环境变量相关命令环境变量组织方式及获取环境变量的3种方法验…

tcp bbr pacing 的对与错

前面提到 pacing 替代 burst 是大势所趋&#xff0c;核心原因就是摩尔定律逐渐失效&#xff0c;主机带宽追平交换带宽&#xff0c;交换机不再能轻易吸收掉主机突发&#xff0c;且随着视频类流量激增&#xff0c;又不能以大 buffer 做带宽后备。因此&#xff0c;主机必须 pacing…

政企即时通讯APP:快速构建专属、安全的智慧办公解决方案

在数字化时代&#xff0c;政企单位对信息系统的依赖日益加深&#xff0c;但随之而来的信息安全隐患也不容忽视。组织内部信息系统的安全问题&#xff0c;尤其是在人员调整或离职时&#xff0c;管理员账号管理的混乱&#xff0c;以及敏感资料泄露和业务系统破坏的风险&#xff0…

C++必修:从C语言到C++的过渡(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是C C&#xff08;c plus plus&#xff09;是一种计算机高级程序设计语言&…

【leetcode面试经典150题】63. 删除链表的倒数第 N 个结点(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…