使用线性表实现通讯录管理

目录

  • 🚀前言
  • 🦜任务目标
  • 🌟顺序表实现
  • 🐍链表实现

🚀前言

在这里插入图片描述

大家好!我是 EnigmaCoder
本文介绍线性表的实验,使用顺序表和链表实现通讯录管理,包含初始化、插入、删除、查询、输出。

🦜任务目标

  1. 线性表数据结构应用:利用顺序表和链表实现动态存储通讯录信息,包括初始化、插入、删除、查询和遍历功能。

  2. 核心算法实现:

  • 动态扩容机制( realloc 实现顺序表空间扩展);

  • 按学号/姓名的精准查询(基于自定义比较函数);

  • 元素的插入与删除(涉及数据移位操作)。

  1. 学生数据样例:
学号(num)姓名(name)性别(sex)电话号码(tel)QQ号码(qq)备注
1001张三138123456781234567890常规数据(男)
1002李四139876543219876543210常规数据(女)
1003王芳15800001111456789123QQ号为9位(合法)
1010刘畅18666668888123456789012QQ号为12位(最大值)

🌟顺序表实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define LIST_INIT_SIZE  10
#define LISTIHCREAHENT 5typedef struct {int num;char name[20];char sex[3];char tel[14];char qq[12];
}ElemType;typedef struct {ElemType* elem;int length;int listsize;
}SqList;int InitList_Sq(SqList& L) {L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem)exit(-1);L.length = 0;L.listsize = LIST_INIT_SIZE;
}int ListInsert_Sq(SqList& L, int i, ElemType e) {ElemType* newbase;if (i<1 || i>L.length + 1) {return 0;}if (L.length == L.listsize) {newbase = (ElemType*)realloc(L.elem, (LIST_INIT_SIZE + LISTIHCREAHENT) * sizeof(ElemType));if (!L.elem)exit(-1);L.elem = newbase;L.listsize += LISTIHCREAHENT;}for (int j = L.length - 1; j >= i - 1; j--) {L.elem[j + 1] = L.elem[j];}L.elem[i - 1] = e;L.length++;return 1;
}int ListDelete_Sq(SqList& L, int i, ElemType& e) {if (i<0 || i>L.length)return 0;for (int j = i ; j <= L.length-1; j++) {L.elem[j-1] = L.elem[j];}L.length--;return 1;
}int LocateElem_Sq(SqList L, ElemType e, int(*equal)(ElemType, ElemType)) {int i = 1;while (i <= L.length && !equal(e, L.elem[i - 1])) i++;if (i <= L.length) return 1;else return 0;}int comparebynum(ElemType x, ElemType y) {return x.num == y.num ? 1 : 0;
}int comparebyname(ElemType x, ElemType y) {if (strcmp(x.name, y.name) == 0)return 1;else return 0;
}void inputOne(ElemType& x) {scanf("%d%s%s%s%s", &x.num, x.name, x.sex, x.tel, x.qq);
}void outputOne(ElemType x) {printf("%d\t%s\t%s\t%s\t%s\n", x.num, x.name, x.sex, x.tel, x.qq);
}void Output(SqList L) {for (int i = 0; i <= L.length-1; i++) {outputOne(L.elem[i]);}
}int main() {SqList L;int choice,i,y,m;ElemType e,t,x;do{printf("       通讯录管理系统\n");printf("====================================\n");printf("               0:退出\n");printf("               1:建立通讯录\n");printf("               2:插入\n");printf("               3:删除\n");printf("               4:查询\n");printf("               5:输出\n");printf("====================================\n");printf("请选择0-5\n");scanf("%d",&choice);switch(choice){case 0: exit(1);case 1: InitList_Sq(L);break;case 2: printf("input i:");scanf("%d",&i);printf("input one record:");inputOne(e);ListInsert_Sq(L,i,e);break;case 3: printf("input i:");scanf("%d",&i);ListDelete_Sq(L,i,t);break;case 4: printf("41.姓名查询\n42.学号查询\n");printf("输入选项: ");scanf("%d",&y);if(y!=41&&y!=42) {printf("请重新选择。\n");break; }if(y==41){printf("需查询的姓名:");scanf("%s",t.name);m=LocateElem_Sq(L,t,comparebyname); }else {printf("需查询的学号:");scanf("%d",&t.num);m=LocateElem_Sq(L,t,comparebynum);}		        if(m) outputOne(L.elem[m-1]);else  printf("查询失败。\n");break;case 5: Output(L);break;		}}while(choice);free(L.elem);return 0;
}

🐍链表实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct {int num;char name[20];char sex[3];char tel[14];char qq[12];
} ElemType;typedef struct LNode {ElemType data;struct LNode* next;
} LNode, * LinkList;void InitList_L(LinkList& L) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;
}int ListInsert_L(LinkList& L, int i, ElemType e) {LinkList p = L, s;int j = 0;while (p && j < i - 1) {p = p->next;j++;}if (!p || j > i - 1) return -1;s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return 1;
}int ListDelete_L(LinkList& L, int i, ElemType& e) {LinkList p = L, q;int j = 0;while (p->next && j < i - 1) {p = p->next;j++;}if (!(p->next) || j > i - 1) return -1;q = p->next;p->next = q->next;e = q->data;free(q);return 1;
}LinkList LocateElem_L(LinkList L, ElemType e, int(*op)(ElemType a, ElemType b)) {LinkList p = L->next;while (p && !op(p->data, e)) {p = p->next;}return p;
}int comparebynum(ElemType x, ElemType y) {return x.num == y.num ? 1 : 0;
}int comparebyname(ElemType x, ElemType y) {return strcmp(x.name, y.name) == 0 ? 1 : 0;
}void inputOne(ElemType& x) {printf("请输入学号、姓名、性别、电话、QQ:");scanf("%d%s%s%s%s", &x.num, x.name, x.sex, x.tel, x.qq);
}void outputOne(ElemType x) {printf("%d\t%s\t%s\t%s\t%s\n", x.num, x.name, x.sex, x.tel, x.qq);
}void outputList(LinkList L) {LinkList p = L->next;while (p) {outputOne(p->data);p = p->next;}
}int main() {LinkList L;int choice, i, y;ElemType e, t;do {printf("       通讯录管理系统\n");printf("====================================\n");printf("               0:退出\n");printf("               1:建立通讯录\n");printf("               2:插入\n");printf("               3:删除\n");printf("               4:查询\n");printf("               5:输出\n");printf("====================================\n");printf("请选择0 - 5\n");scanf("%d", &choice);switch (choice) {case 0:exit(1);case 1:InitList_L(L);break;case 2:printf("input i:");scanf("%d", &i);inputOne(e);if (ListInsert_L(L, i, e) == -1) {printf("插入失败\n");}break;case 3:printf("input i:");scanf("%d", &i);if (ListDelete_L(L, i, e) == -1) {printf("删除失败\n");}else {printf("删除的记录为:");outputOne(e);}break;case 4:printf("41.姓名查询\n42.学号查询\n");printf("输入选项: ");scanf("%d", &y);if (y != 41 && y != 42) {printf("请重新选择。\n");break;}if (y == 41) {printf("需查询的姓名:");scanf("%s", t.name);LinkList result = LocateElem_L(L, t, comparebyname);if (result) {outputOne(result->data);}else {printf("查询失败。\n");}}else {printf("需查询的学号:");scanf("%d", &t.num);LinkList result = LocateElem_L(L, t, comparebynum);if (result) {outputOne(result->data);}else {printf("查询失败。\n");}}break;case 5:outputList(L);break;}} while (choice);LinkList p = L;while (p) {LinkList temp = p;p = p->next;free(temp);}return 0;
}    

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

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

相关文章

firewall docker 冲突问题解决(亲测有效)

# 关闭iptables&#xff0c;使用firewall systemctl disable iptables # 禁用服务 systemctl stop iptables # 关闭服务 systemctl status iptables # 查看服务状态 systemctl enable firewalld # 设置防火墙开机自启动 systemctl start firewalld # 开启服务 systemctl s…

[250428] Nginx 1.28.0 发布:性能优化、安全增强及新特性

目录 Nginx 1.28.0 稳定版发布主要亮点包括&#xff1a;功能增强&#xff1a;安全性改进&#xff1a;其他&#xff1a; Nginx 1.28.0 稳定版发布 Nginx 官方于 4 月 24 日发布了最新的 1.28.0 稳定版本。此版本基于之前的 1.27.x 主线分支&#xff0c;整合了多项新功能、性能优…

昇腾的CANN是什么?跟英伟达CUDA的有什么联系和区别?【浅谈版】

昇腾的CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为专门为AI场景设计的异构计算架构&#xff0c;类似于英伟达的CUDA&#xff0c;但它针对的是华为自家的昇腾AI处理器&#xff08;Ascend系列&#xff09;。简单来说&#xff0c;CANN的作用是连…

C++ STL vector高级特性与实战技巧

引言 各位小伙伴们好&#xff01;上一篇博客我们介绍了vector的基础知识和常见操作&#xff0c;今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车&#xff0c;我们上一篇讲了如何上下车&#xff08;添加删…

使用PageHelper实现分页查询(详细)

一&#xff1a;需求分析与设计 1.1 产品原型 &#xff08;1&#xff09;分页展示&#xff0c;每页展示10条数据&#xff0c;根据员工姓名进行搜索 &#xff08;2&#xff09;业务规则 1.2 接口设计 &#xff08;1&#xff09;操作&#xff1a;查询&#xff0c;请求方式&#xf…

手搓传染病模型(SEICR)

模型描述 SEICR 模型是一种用于描述具有慢性期的传染病传播规律的数学模型。该模型将人群分为五个部分&#xff0c;分别是易感个体&#xff08;Susceptible&#xff0c;S&#xff09;、潜伏期个体&#xff08;Exposed&#xff0c;E&#xff09;、急性期感染个体&#xff08;In…

音视频开源项目列表

音视频开源项目列表 一、多媒体处理框架 通用音视频处理 FFmpeg - https://github.com/FFmpeg/FFmpeg 最强大的音视频处理工具库支持几乎所有格式的编解码提供命令行工具和开发库 GStreamer - https://gitlab.freedesktop.org/gstreamer/gstreamer 跨平台多媒体框架基于管道…

通往“共识空域”的系统伦理演化

随着低空经济逐步从分布式运营向跨区域联动发展&#xff0c;AI无人系统不再只在本地决策&#xff0c;而开始涉及跨城市、跨机构的任务调度与行为协调。这一趋势带来了新的伦理挑战&#xff1a;多系统之间如何达成行动共识&#xff1f;算法背后的价值判断标准能否统一&#xff1…

Elasticsearch 常用的 API 接口

文档类 API Index API &#xff1a;创建并建立索引&#xff0c;向指定索引添加文档。例如&#xff1a;PUT /twitter/tweet/1 &#xff0c;添加一个文档。 Get API &#xff1a;获取文档&#xff0c;通过索引、类型和 ID 获取文档。如GET /twitter/tweet/1。 DELETE API &…

【Vue】性能优化与调试技巧

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Vue 性能优化与调试技巧1.1 使用 v-if 替代 v-show 控制条件渲染示例代码&#xff1a; 1.2 组件懒加载&#xff08;异步组件&#xff09;示例代码&#xff1a;效果分析图&#xff08;Mermaid 图表示&#xff09…

广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角

文章目录 广义线性模型三剑客&#xff1a;线性回归、逻辑回归与Softmax分类的统一视角引言&#xff1a;机器学习中的"家族相似性"广义线性模型(GLMs)基础三位家族成员的统一视角1. 线性回归(Linear Regression)2. 逻辑回归(Logistic Regression)3. Softmax分类(Softm…

【Linux系统篇】:Linux线程控制基础---线程的创建,等待与终止

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.线程创建二.线程等待三.线程终止四.扩展内容1.重谈pthread_…

More Effective C++学习笔记

条款1 指针与引用的区别 条款2 尽量使用C风格的类型转换 条款3 不要对数组使用多态 条款4 避免无用的缺省构造函数 条款5 谨慎定义类型转换函数 条款6 自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别 条款7 不要重载“&&”,“||”, 或“,” 条款8 理…

先知AIGC超级工场,撬动运营效率新杠杆

北京先智先行科技有限公司&#xff0c;作为行业内的重要参与者&#xff0c;拥有“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”这三款旗舰产品。这些产品在不同领域发挥着关键作用&#xff0c;尤其是先知AIGC超级工场&#xff0c;正悄然改变着内容创作与产品推广的…

十一岁少年叶珉雪用艺术点亮公益之路 个人原创公益演唱会传递大爱与担当

4月29日晚&#xff0c;"韶华映雪益路同行"叶珉雪个人原创公益演唱会在广东碧桂园学校歌剧院圆满落幕。 这场由该校美育成果浇灌出的艺术盛宴&#xff0c;生动诠释了广东碧桂园学校育人理念。11岁的叶珉雪以超越年龄的艺术掌控力&#xff0c;呈现了一场融合歌唱、舞蹈…

【深度学习基础】:VGG实战篇(图像风格迁移)

文章目录 前言style transfer原理原理解析损失函数 style transfer代码效果图 fast style transfer 代码效果图 前言 本篇来带大家看看VGG的实战篇&#xff0c;这次来带大家看看计算机视觉中一个有趣的小任务&#xff0c;图像风格迁移。 可运行代码位于&#xff1a; Style_tr…

python爬虫基础:requests库详解与案例

1.Requests模块的使用 requests模块的介绍与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据。 中文文档&#xff1a;https://requests.readthedocs.io/projects/cn/zh_CN/latest/ 对于爬虫任务&#xff0c;使用 requests模块基本能够解决绝大部分的数据抓取的…

Spring 容器相关的核心注解​

以下是 Spring 容器中用于 ​​Bean 管理、依赖注入、配置控制​​ 的关键注解&#xff0c;按功能分类说明&#xff1a; ​​1. Bean 声明与注册​​ 注解作用示例​​Component​​通用注解&#xff0c;标记一个类为 Spring Bean&#xff08;自动扫描注册&#xff09; Compo…

C与指针5——字符串合集

常用函数 1、拷贝、长度、比较 size_t strlen();\\返回无符号整形 char* strcpy();char* strncpy();\\拷贝 int strcmp();int strncmp();\\比较 char* strcat();char* strncat();\\连接2、查找 char* strchr(const char * st,int ch);\\找字符第一次出现的位置 char* strrch…

论软件需求管理

目录 摘要&#xff08;300~330字&#xff09; 正文&#xff08;2000~2500字&#xff0c;2200字为宜&#xff09; 背景介绍&#xff08;500字做左右&#xff09; 论点论据&#xff08;1500字做左右&#xff09; 收尾&#xff08;200字左右&#xff09; 注&#xff1a;本篇论…