【初阶数据结构】解锁顺序表潜能:一站式实现高效通讯录系统

🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生

文章目录

  • 前言
  • 一、通讯录框架Test.c
  • 二、通讯录
    • 2.1 Contacts.h
    • 2.2 Contacts.c
  • 三、底层逻辑
  • 3.1 SeqList.h
  • 3.2 SeqList.c
  • 四、基于顺序表的通讯录实现效果
    • 4.1 添加
    • 4.2 删除
    • 4.3 修改
    • 4.4 查找
    • 4.5 展示
  • 总结与每日励志

前言

本文聚焦C语言顺序表的实战应用,从零搭建功能完整的通讯录系统。通过封装顺序表的增删改查核心逻辑,实现联系人的添加、删除、修改、查找与展示功能,兼顾内存动态扩容与安全销毁机制。代码遵循模块化设计思想,清晰划分接口层与底层逻辑,既适合巩固数据结构基础,也为新手提供可直接复用的实战案例,助力快速掌握多文件编程与结构化开发思维(许多大学C语言期末大作业就是这个希望能给小伙伴们一些启发)。


一、通讯录框架Test.c

#include"seqlist.h"#include"Contacts.h"voidmenu(){printf("******************通讯录******************\n");printf("*******1.增加联系人 2.删除联系人********\n");printf("*******3.修改联系人 4.查找联系人********\n");printf("*******5.展示联系人 0. 退出 *********\n");printf("******************************************\n");}intmain(){intop;Contactss;SLInit(&s);do{menu();printf("请输入你的选择:");scanf("%d",&op);switch(op){case1:ContactsAdd(&s);break;case2:ContactsDel(&s);break;case3:ContactsModify(&s);break;case4:ContactsFind(&s);break;case5:ContactsShow(&s);break;case0:printf("退出通讯录....\n");break;default:printf("输入错误,请重新选择您的操作!\n");break;}}while(op);ContactsDestory(&s);return0;}

二、通讯录

2.1 Contacts.h

#definemax_name 20#definemax_gender 20#definemax_tel 30#definemax_addr 50//姓名 性别 年龄 电话 地址typedefstructPersonalInfor{charname[max_name];chargender[max_gender];intage;chartel[max_tel];charaddr[max_addr];}peoInfo;typedefstructSeqListContacts;//通讯录的初始化和销毁voidContactsInit(Contacts*ps);//通讯录的销毁voidContactsDestory(Contacts*ps);//通讯录的打印voidContactsShow(Contacts*ps);//通讯录的插入voidContactsAdd(Contacts*ps);//通讯录的删除voidContactsDel(Contacts*ps);//通讯录的查找voidContactsFind(Contacts*ps);//通讯录的修改voidContactsFind(Contacts*ps);

注意
(1)为什么要typedef struct SeqList Contacts;这么写
答:前置声明:因为在SeqList.h和Contacts.h里互相包含头文件会编译错误所以这么写。
前置声明:前向声明(前置声明)只是告诉编译器 “这个类型存在”,但如果要实际使用这个类型(比如访问成员、创建非指针变量、调用相关函数),就必须要有完整的定义
(2)为什么不能typedef SL Contacts;这么写
答:因为在Contacts.h里面并没有包含SeqList.h这个头文件,所以无法识别SL是什么,它只认识 int、struct XXX 这类 “基础标识”,不认识自定义的别名。

2.2 Contacts.c

本质:底层依赖顺序表的实现逻辑。

#include"SeqList.h"#include"Contacts.h"//初始化voidContactsInit(Contacts*ps){SLInit(ps);}//销毁voidContactsDestory(Contacts*ps){SLDestory(ps);}//打印voidContactsShow(Contacts*ps){SLPrint(ps);}//插入voidContactsAdd(Contacts*ps){peoInfoinfo;printf("请输入要添加的联系人姓名:\n");scanf("%s",info.name);printf("请输入要添加的联系人性别:\n");scanf("%s",info.gender);printf("请输入要添加的联系人年龄:\n");scanf("%d",&info.age);printf("请输入要添加的联系人电话:\n");scanf("%s",info.tel);printf("请输入要添加的联系人住址:\n");scanf("%s",info.addr);SLPushBack(ps,info);}//删除intFindName(Contacts*ps,char*str){for(inti=0;i<ps->size;i++){if(strcmp(ps->a[i].name,str)==0)returni;}return-1;}voidContactsDel(Contacts*ps){//要删除的数据必须要存在,才能执行删除操作//查找charname[30];printf("请输入要删除的数据的姓名:\n");scanf("%s",name);intfind=FindName(ps,name);if(find==-1){printf("此数据已删除或未有此数据\n");return;}SLErase(ps,find);printf("删除成功!\n");}//通讯录的查找voidContactsFind(Contacts*ps){charname[max_name];printf("请输入要查找的数据的姓名:\n");scanf("%s",name);intfind=FindName(ps,name);if(find==-1){printf("此数据已删除或未有此数据\n");return;}printf("姓名: %s 性别 : %s 年龄 : %d 电话 : %s 地址 : %s\n",ps->a[find].name,ps->a[find].gender,ps->a[find].age,ps->a[find].tel,ps->a[find].addr);}//修改voidContactsModify(Contacts*ps){//通讯录不为空if(ps->size==0){printf("当前通讯录为空\n");return;}//要修改的联系人数据存在charname[max_name];printf("请输入要修改的用户姓名:\n");scanf("%s",name);intfind=FindName(ps,name);if(find<0){printf("要修改的联系人数据不存在!\n");return;}else{//直接修改printf("请输入新的姓名:\n");scanf("%s",ps->a[find].name);printf("请输入新的性别:\n");scanf("%s",ps->a[find].gender);printf("请输入新的年龄:\n");scanf("%d",&ps->a[find].age);printf("请输入新的电话:\n");scanf("%s",ps->a[find].tel);printf("请输入新的住址:\n");scanf("%s",ps->a[find].addr);printf("修改成功!\n");}}

三、底层逻辑

3.1 SeqList.h

#include <stdio.h>#include <assert.h>#include <stdlib.h>#include"Contacts.h"typedefpeoInfoSLDateType;typedefstructSeqList{SLDateType*a;//存储数据intsize;//有效数据个数intcapacity;//空间容量}SL;voidSLInit(SL*ps);//初始化voidSLDestory(SL*ps);//销毁voidSLPrint(SL*ps);//打印//插入部分voidSLPushBack(SL*ps,SLDateTypex);//尾插//删除部分voidSLPopback(SL*ps);//尾删voidSLPopFront(SL*ps);//头删voidSLErase(SL*ps,intpos);//任意位置删除

3.2 SeqList.c

#include"seqlist.h"#include"Contacts.h"//初始化voidSLInit(SL*ps){ps->a=NULL;ps->size=ps->capacity=0;}//销毁voidSLDestory(SL*ps){if(ps->a){free(ps->a);ps->a=NULL;}ps->size=ps->capacity=0;}//打印voidSLPrint(SL*ps){for(inti=0;i<ps->size;i++)printf("姓名:%s 性别:%s 年龄:%d 电话:%s 地址:%s\n",ps->a[i].name,ps->a[i].gender,ps->a[i].age,ps->a[i].tel,ps->a[i].addr);}//检查是否需要扩容voidCheckCapacity(SL*ps){intnewcapacity=ps->capacity==0?4:ps->capacity*2;SLDateType*temp=realloc(ps->a,newcapacity*sizeof(SLDateType));if(temp==NULL){printf("开辟失败!\n");exit(-1);}ps->a=temp;ps->capacity=newcapacity;}//尾插voidSLPushBack(SL*ps,SLDateTypex){assert(ps);if(ps->size==ps->capacity)CheckCapacity(ps);ps->a[ps->size++]=x;}//任意位置删除voidSLErase(SL*ps,intpos){assert(ps);assert(pos>=0&&pos<ps->size);for(inti=pos+1;i<ps->size;i++)ps->a[i-1]=ps->a[i];ps->size--;}

四、基于顺序表的通讯录实现效果

4.1 添加

4.2 删除

4.3 修改

4.4 查找

4.5 展示

总结与每日励志

✨本文基于C语言顺序表实现通讯录管理系统,包含添加、删除、修改、查找和展示联系人功能。通过模块化设计将底层顺序表操作与通讯录业务逻辑分离,使用动态内存管理实现扩容机制。代码采用多文件结构,包含测试框架、通讯录接口和顺序表实现三部分,完整展示了数据结构的实际应用。系统具有以下特点:1)支持联系人信息的完整CRUD操作;2)采用类型封装解决头文件循环引用问题;3)提供内存安全保证;4)交互式菜单界面。该实现既可作为数据结构学习案例,也适用于C语言课程实践项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据领域数据服务的用户需求挖掘方法

大数据领域数据服务的用户需求挖掘&#xff1a;从“拍脑袋”到“系统性解题” 在大数据行业摸爬滚打5年&#xff0c;我见过太多“叫好不叫座”的数据服务&#xff1a; 花费3个月开发的“实时销售看板”&#xff0c;上线后运营人员说“不如Excel好用”&#xff1b;投入百万搭建的…

西门子S7 200smart与欧姆龙E5cc温控器通讯实战

西门子S7 200smart与欧姆龙E5cc温控器通讯程序 功能&#xff1a;通过西门子s7 200smart与欧姆龙e5cc温控器modbus通讯&#xff0c;实现目标温度设定&#xff0c;实际温度读取&#xff0c;设定报警类型&#xff0c;报警值&#xff0c;报警值上下限&#xff0c;探头型号设定等功能…

【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 2:论文

【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 1:介绍 代码 GitHub: https://github.com/multimodal-art-projection/AutoMV Website: https://m-a-p.ai/AutoMV/ Abstract 摘要 Music-to-Video (M2V) generation for full-lengt…

【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 1:介绍

AutoMV: Automatic Multi-Agent System for Music Video Generation AutoMV:用于音乐视频生成的自动多智能体系统 无需训练 AutoMV is a training-free, multi-agent system that automatically generates coherent, long-form music videos (MVs) directly from a full-leng…

SSM289的美食推荐带店铺管理系统

目录SSM289美食推荐与店铺管理系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM289美食推荐与店铺管理系统摘要 SSM289是一款基于SSM&#xff08;SpringSpring MVCMyBatis&#xff09;框架开发的美食推荐与店铺管理系…

SSM278的考研互助辅导平台vue

目录 SSM278考研互助辅导平台Vue实现摘要 开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; SSM278考研互助辅导平台Vue实现摘要 SSM278考研互助辅导平台基于Vue.js框架开发&#xff0c;整合Spring、Spring MVC和MyBatis&#x…

S7-1200 控制 5 轴伺服程序案例分享

S7-1200控制5轴伺服程序案例。1.PTO伺服轴脉冲定位控制功能应用速度模式应用扭矩模式应用。 2.程序为结构化编程,每一功能为模块化设计,具有一个项目都有的功能:自动_手动_单步_暂停后原位置继续运行_轴断电保持_报警功能_气缸运行及报警. 3.每个功能块可以无数次重复调用&…

生产线效率已近瓶颈,如何通过精益管理实现新的突破?

泻药&#xff0c;生产线效率已近瓶颈&#xff0c;如何通过精益管理实现新的突破&#xff1f;这个问题&#xff0c;其实我在很多制造企业里反复听到过。老板常说的是一句话&#xff1a;“人已经很忙了&#xff0c;设备也没少开&#xff0c;但效率就是上不去。”再追问几句&#…

电力系统复杂网络分析:MATLAB 实现最优微电网布局

电力系统复杂网络分析 matlab源代码&#xff0c;代码按照高水平文章复现&#xff0c;保证正确 电力系统复杂网络分析(CAN) 利用复杂网络分析方法&#xff0c;求解配网系统中微电网最优位置的新&#xff0c;该位置将增强电网的弹性&#xff0c;减少电力损失和线路负荷&#xff0…

计算机毕业设计springboot医院门诊信息管理系统 基于SpringBoot的智慧门诊综合服务平台 面向中小型医院的SpringBoot门诊业务一体化系统

计算机毕业设计springboot医院门诊信息管理系统v1oug17b &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“看病难、排队久、信息孤岛”成为医院门诊的普遍痛点时&#xff0c;一…

Kiro教程(三)| Kiro 实战与最佳实践

Kiro教程&#xff08;三&#xff09;| Kiro 实战与最佳实践 Kiro 实战与最佳实践案例 1&#xff1a;从零开发 Todo 应用&#xff08;Spec 模式&#xff09;项目要求Step 1&#xff1a;创建项目并配置 SteeringStep 2&#xff1a;启动 SpecStep 3&#xff1a;审核三阶段文档 案例…

URL末尾到底该不该加斜杠?前端老油条的血泪经验

URL末尾到底该不该加斜杠&#xff1f;前端老油条的血泪经验URL末尾到底该不该加斜杠&#xff1f;前端老油条的血泪经验引言&#xff1a;这事儿真没你想的那么简单先搞清楚服务器眼里的斜杠是啥浏览器和搜索引擎怎么看这事重定向风暴&#xff1a;你网站慢可能就因为这个前端路由…

三菱fx - 5u轴定位与Modbus RTU RS - 485测微计通信案例大揭秘

三菱fx-5u轴定位&#xff0c;Modbus RTU RS-485与测微计通信案例 &#xff0c;包含编程软件&#xff0c;plc和维伦触摸屏程序&#xff0c;plc地址规划表&#xff0c;手册&#xff0c;轴定位和Modbus通信视频教程&#xff0c;设备运行视频等。 plc程序框架逻辑清晰&#xff0c;功…

Kiro教程(二)| Kiro 核心功能完全指南

Kiro教程&#xff08;二&#xff09;| Kiro 核心功能完全指南Kiro 核心功能完全指南1. 开发模式选择2. Vibe 模式深度解析2.1 核心概念2.2 提示词技巧2.3 多轮对话3. Spec 模式深度解析3.1 核心概念3.2 三阶段流程3.3 需求文档&#xff08;requirements.md&#xff09;3.4 设计…

2026/1/20

2026/1/20初步学习了解:关于如何做老年人评估系统

计算机毕业设计springboot基于Java的房屋租赁系统的设计与实现 基于SpringBoot与Java的在线租房管理平台的设计与实现 JavaWeb架构下智慧住房租赁服务系统研发

计算机毕业设计springboot基于Java的房屋租赁系统的设计与实现a1b8r553 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。城市化把“找房”变成一场信息拉锯战&#xff1a;传单、中…

A.每日一题——3314.构造最小位运算数组I+3315.构造最小位运算数组II

题目链接&#xff1a;3314. 构造最小位运算数组 I&#xff08;简单&#xff09; 3315. 构造最小位运算数组 II&#xff08;简单&#xff09; 算法原理&#xff1a; 解法一&#xff1a;暴力枚举 4ms击败30.43% 时间复杂度O(N∗M) 思路很简单&#xff0c;先来一层for循环遍历链表…

2026/1/17~19

2026/1/17~19休息

欧姆龙CP1H + CIF11与欧姆龙E5cc温控器通讯程序分享

欧姆龙CP1HCIF11与欧姆龙E5cc温控器通讯程序 功能&#xff1a;全新原创可直接应用生产程序。 通过昆仑通态触摸屏&#xff0c;串口网关模式&#xff0c;欧姆龙CP1H的CIF11通讯板&#xff0c;实现对欧姆龙E5CC温控器 设定温度值&#xff0c;读取实际温度&#xff0c;设定探头类型…

【DPFSP问题】基于混沌增强领导者黏菌算法CELSMA求解分布式置换流水车间调度DPFSP附Matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。&#x1f525; 内容介绍一、技术背景与核心目标分布式置换流…