当前位置: 首页 > news >正文

【C语言微项目】通讯录

目录

1. 通讯录底层逻辑

1.1 整体思路

1.2 两层结构

2. 代码实现


1. 通讯录底层逻辑

1.1 整体思路

通讯录本质上就是一个顺序表,只不过顺序表存储的是整数,而通讯录存储的是联系人信息结构体(包含姓名、电话、地址等)。

1.2 两层结构

内层:联系人信息结构体

  • 包含姓名、电话、地址、年龄等字段

  • 这是顺序表中每个元素的实际内容

外层:通讯录管理结构体

  • arr指针:指向动态数组的首地址

  • size:记录当前有多少个联系人

  • capacity:记录当前数组最多能存多少个联系人

2. 代码实现

// Contact.h文件

#include<stdio.h> #pragma once //避免头文件被重复包含 #define NAME_MAX 20 //姓名 #define GENDER_MAX 10 //性别 #define TEL_MAX 20 //电话 #define ADDR_MAX 100 //住址 struct SeqList; //前置声明 typedef struct SeqList Contact; //前置声明+重命名 typedef struct PersonInfo //整个顺序表是结构体Contact,//顺序表中的元素是结构体PeoInfo { char name[NAME_MAX]; char gender[GENDER_MAX]; int age; char tel[TEL_MAX]; char addr[ADDR_MAX]; }PeoInfo; void ContactInit(Contact* con); //初始化 void ContactDestroy(Contact* con); //销毁 void ContactAdd(Contact* con); //添加联系人 void ContactDel(Contact* con); //删除联系人 void ContactModify(Contact* con); //修改数据 void ContactFind(Contact* con); //查找数据 void ContactShow(Contact* con); //打印数据

//Contact.c文件

#include<stdio.h> #include<assert.h> #include<string.h> #include "Contact.h" #include "SeqList1.h" void ContactInit(Contact* con) //初始化 { SLInit(con); } void ContactDestroy(Contact* con) //销毁联系人列表 { SLDestroy(con); } void ContactAdd(Contact* con) //添加联系人 { PeoInfo p1; printf("请输入你要添加的联系人姓名:\n"); scanf("%s", p1.name); printf("请输入你要添加的联系人性别:\n"); scanf("%s", p1.gender); printf("请输入你要添加的联系人年龄:\n"); scanf("%d", &p1.age); printf("请输入你要添加的联系人电话:\n"); scanf("%s", p1.tel); printf("请输入你要添加的联系人地址:\n"); scanf("%s", p1.addr); SLPushBack(con, p1); //在总表中尾插联系人 } int ContactFindByName(Contact* con, const char name[]) { for(int i=0; i<con->size; i++) { if(strcmp(con->arr[i].name, name) == 0) //比较两个字符串 { return i; //返回下标 } } return -1; //没有找到 } void ContactDel(Contact* con) //删除联系人 { char name[NAME_MAX]; printf("请输入你要删除的联系人姓名:\n"); scanf("%s", name); int x = ContactFindByName(con, name); if(x >= 0) { SLErase(con, x); //指定删除对应下标的联系人 printf("删除成功!\n"); } else { printf("您要删除的联系人不存在!\n"); } } void ContactShow(Contact* con) //打印数据 { printf("姓名 性别 年龄 电话 地址\n"); for(int i=0; i<con->size; i++) { printf("%s %s %d %s %s\n", con->arr[i].name, con->arr[i].gender, con->arr[i].age, con->arr[i].tel, con->arr[i].addr); } } void ContactModify(Contact* con) //修改数据 { char name[NAME_MAX]; printf("请输入你要修改的联系人姓名:\n"); scanf("%s", name); int x = ContactFindByName(con, name); if(x<0) { printf("您要修改的联系人数据不存在!\n"); return; } printf("请输入新的姓名:\n"); scanf("%s", con->arr[x].name); printf("请输入新的性别:\n"); scanf("%s", con->arr[x].gender); printf("请输入新的年龄:\n"); scanf("%d", &con->arr[x].age); //特别留意!! printf("请输入新的电话:\n"); scanf("%s", con->arr[x].tel); printf("请输入新的住址:\n"); scanf("%s", con->arr[x].addr); } void ContactFind(Contact* con) //查找数据 { printf("请输入你要查找的联系人姓名:\n"); char name[NAME_MAX]; scanf("%s", name); int x = ContactFindByName(con, name); if(x < 0) { printf("查无此人!\n"); return; } printf("姓名 性别 年龄 电话 地址\n"); printf("%s %s %d %s %s\n", con->arr[x].name, con->arr[x].gender, con->arr[x].age, con->arr[x].tel, con->arr[x].addr); }

//testcon.c文件(菜单栏)

#include<stdio.h> #include <stdio.h> #include "Contact.c" #include "SeqList1.c" #include "Contact.h" #include "SeqList1.h" void menu() { printf("**************通讯录******************\n"); printf("******1.增加联系人 2.删除联系人******\n"); printf("******3.修改联系人 4.查找联系人******\n"); printf("******5.展示联系人 0.退出通讯录******\n"); printf("**************************************\n"); } int main() { Contact con; ContactInit(&con); int op = -1; do { menu(); printf("请选择您的操作:\n"); scanf("%d", &op); switch(op) { case 1: { ContactAdd(&con); break; } case 2: { ContactDel(&con); break; } case 3: { ContactModify(&con); break; } case 4: { ContactFind(&con); break; } case 5: { ContactShow(&con); break; } case 0: { printf("推出通讯录......\n"); break; } default: { printf("输入错误,请重新选择!\n"); break; } } }while(op != 0); return 0; }

// 感谢阅读(*/ω\*)

http://www.jsqmd.com/news/557476/

相关文章:

  • 深入EDKII源码:手把手拆解Redfish DXE Driver如何与BMC的Redis数据库“对话”
  • Linux期末突击:从体系结构到VFS,一张图搞定所有简答题
  • 保山同城相亲交友平台
  • TypeScript——模块解析
  • 技术赋能时序预测:Kronos多模态序列建模框架的跨行业实践指南
  • 从零开始制作专业字幕:开源工具Subtitle Edit完全指南
  • Unity UI性能优化实战:Sprite Atlas图集打包配置全流程(含V1/V2模式选择与避坑指南)
  • OpenClaw隐私保护方案:nanobot本地模型处理敏感数据实战
  • 终极指南:使用Textstat Python库进行文本可读性分析的完整教程
  • TypeScript——声明合并
  • 学术圈大地震!CCF号召抵制NeurIPS,国产AI如何重构科研话语权?
  • HT1621B驱动LCD屏实战:从硬件连接到代码调试全流程(附常见问题排查)
  • HTML---基本标签2
  • 泛型的难点解释
  • 2026智慧综合能源方案优质品牌推荐指南:能耗计量电表/远程抄表电表/远程电力抄表/逆流监测电表/零碳园区能源方案/选择指南 - 优质品牌商家
  • 使用GeoTools把Geojson转换成Shp文件
  • 新手必看!华为云Nginx服务搭建从入门到放弃的5个关键步骤
  • 面向对象的I²C驱动封装设计与实现
  • TypeScript——编译器和编译选项
  • 降AI率工具语义重构技术解读:为何能有效降论文AIGC率
  • 从Corner到Scenario:一次讲透MCMM中工艺角(ss/tt/ff)与场景绑定的实战配置
  • 从零开始搭建苍穹外卖项目:手把手教你配置前后端开发环境(含Nginx避坑指南)
  • TypeScript——tsconfig.json
  • 电子课本智能解析:教育工作者的高效资源获取解决方案
  • Simulink子系统组件切换实战:从Demo到自定义模型的完整指南
  • 中国全国土壤有机碳密度数据集(2010-2024年)
  • Carla自动驾驶模拟器快捷键大全:从手动控制到天气切换
  • 2026高校AIGC政策全面收紧,毕业生如何高效降论文ai率应对?
  • 别再死记硬背了!图解‘快慢指针’和‘对撞指针’,5分钟理解两种核心思想
  • 成都单元门优质品牌推荐:防火窗、防爆门、防盗门、隔音门、不锈钢门、保温门、别墅大门、医院门、实木门、室内套装木门选择指南 - 优质品牌商家