数据结构:基于顺序表实现通讯录系统(含源码)

目录

一、前言

二、各个功能的实现

2.1 初始化通讯录

 2.2 添加通讯录数据

 2.3 查找通讯录数据

 2.4 删除通讯录数据

 2.5 修改通讯录数据

2.6 展示通讯录数据​编辑

2.7 销毁通讯录数据

 三、添加菜单和测试

四、完整源码

sxb.h

 sxb.c

contact.h

contact.c

 test.c


一、前言

     上一篇我们讲了如何实现动态顺序表,这一篇就基于顺序表实现通讯录系统,我们知道顺序表的底层逻辑其实就是数组,同样的,通讯录系统也只是在顺序表之上进行了一层封装,相当于把每一个用户的所以数据都当做了数组中的一个元素,在通过顺序表的增删查改功能实现通讯录相对应的功能。

ba344a706a7c47c4bb66eacf8b37c025.png每个数组元素中都包含这样整个的用户数据

功能要求:

1.能够保存用户信息:名字、性别、年龄、电话、地址等

2.增加联系人信息

3.删除指定联系人

4.查找制定联系人

5.修改指定联系人

6.显示联系⼈信息

二、各个功能的实现

2.1 初始化通讯录

    这里其实和顺序表的初始化是一样的,只要把数组置空,有效数据,空间容量归0就行了,

0dd074b3f2fa4ed6a3f03059f9e2961a.png

98bb65e40833455dbc8e26724f2eb878.png

 2.2 添加通讯录数据

    添加通讯录数据同样需要用到写顺序表时用到的添加数据函数(毕竟通讯录是基于顺序表建立的系统),我这里用到的是尾插

9dd06b7bb3c54b04a3637fe0da05c1c6.png

 2.3 查找通讯录数据

1b52b0a60714475a80db73b5cd2aed29.png

 2.4 删除通讯录数据

22ef9bb84a2a452b95c5d6218dbd8c29.png

 2.5 修改通讯录数据

f66cd5217b964586a84517998ce55ed5.png

2.6 展示通讯录数据e7c4d49f58eb43ff9fa14dea206ede79.png

2.7 销毁通讯录数据

cceba92ede0443c79865b25530da9a5c.png

7c64e32736cf43f58f3d862ab0432664.png

 三、添加菜单和测试

    作为一个系统肯定是要给别人用的,我们还需要加一个系统使用者提示,方便使用对应功能,

 e17abdc2cc7c4b789f03950f73dba4a2.png

 71bdb803c878445fa25a1709ae35c566.png用switch语句对应数字对应到对应功能。

大功告成后还是需要进行测试的,避免有错误。

四、完整源码

sxb.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"contact.h"
typedef personal SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{SLDataType* arr;int size;     // 有效数据个数int capacity; // 空间容量
}SL;//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);//头部插入删除 / 尾部插入删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
void SLprint(SL* ps);//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);

 sxb.c

#include"sxb.h"
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
void SLDestroy(SL* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tem = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tem == NULL){perror("realloc fail");exit(1);}ps->arr = tem;ps->capacity = newcapacity;}
}
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);int i;for (i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}
void SLPopFront(SL* ps)
{assert(ps);SLCheckCapacity(ps);int i;for (i = 0; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}
void SLPopBack(SL* ps)
{assert(ps);SLCheckCapacity(ps);ps->size--;
}
void SLprint(SL* ps)
{int i;for (i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);SLCheckCapacity(ps);int i = 0;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}
void SLErase(SL* ps, int pos)
{assert(ps);SLCheckCapacity(ps);int i = 0;for (i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

contact.h

//前置声明typedef struct SeqList contact;//用户数据typedef struct PersonInfo{char name[100];//姓名char gender[5];//性别int age;//年龄char telephone[11];//电话char address[100];//地址
}personal;//初始化通讯录void InitContact(contact* con);//添加通讯录数据void AddContact(contact* con);//删除通讯录数据void DelContact(contact* con);//展示通讯录数据void ShowContact(contact* con);//查找通讯录数据int FindContact(contact* con);//修改通讯录数据void ModifyContact(contact* con);//销毁通讯录数据void DestroyContact(contact* con);

contact.c

#include"contact.h"
#include"sxb.h"
#include<string.h>
void InitContact(contact* con)
{SLInit(con);
}void AddContact(contact* con)
{personal arr;printf("请输入联系人姓名\n");scanf("%s", arr.name);printf("请输入联系人性别\n");scanf("%s", arr.gender);printf("请输入联系人年龄\n");scanf("%d", &arr.age);printf("请输入联系人电话\n");scanf("%s", arr.telephone);printf("请输入联系人地址\n");scanf("%s", arr.address);SLPushBack(con, arr);
}
int FindContact(contact* con)
{char name[100];scanf("%s", name);for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){printf("找到了,有此联系人\n");return i;}}printf("没有此联系人");return -1;
}
void DelContact(contact* con)
{printf("请输入要删除的联系人的姓名\n");int find=FindContact(con);if (find >= 0){SLErase(con, find);printf("删除成功\n");}
}
void ShowContact(contact* con)
{printf("姓名   性别   年龄   电话   地址\n");for (int i = 0; i < con->size; i++){printf("%5s %5s %5d %5s %6s\n", con->arr[i].name,con->arr[i].gender,con->arr[i].age, con->arr[i].telephone, con->arr[i].address);}
}
void ModifyContact(contact* con)
{printf("请输入要修改的联系人姓名\n");int find = FindContact(con);if (find >= 0){printf("请输入修改后姓名\n");scanf("%s", con->arr[find].name);printf("请输入修改后性别\n");scanf("%s", con->arr[find].gender);printf("请输入修改后年龄\n");scanf("%d", &con->arr[find].age);printf("请输入修改后电话\n");scanf("%s", con->arr[find].telephone);printf("请输入修改后地址\n");scanf("%s", con->arr[find].address);}
}
void DestroyContact(contact* con)
{SLDestroy(con);
}

 test.c

#include"contact.h"
void menu()
{printf("+-------------------------------------------+\n");printf("                   通讯录                    \n");printf("            1,添加        2,删除             \n");printf("            3,查找        4,修改             \n");printf("            5,展示        0,退出             \n");printf("+-------------------------------------------+\n");
}
void mycontact()
{personal p1;int c=1;InitContact(&p1);while (c){printf("请输入:");scanf("%d", &c);switch (c){case 0:break;case 1:AddContact(&p1);break;case 2:DelContact(&p1);break;case 3:FindContact(&p1);break;case 4:ModifyContact(&p1);break;case 5:ShowContact(&p1);break;default:printf("输入错误");}}printf("退出通讯录");DestroyContact(&p1);
}
int main()
{menu();mycontact();return 0;
}


     本篇内容就到这里了,希望对各位有帮助,如果有错误欢迎指出。

3e457ec2eddb4315adf84f8e71a42792.gif

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

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

相关文章

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段&#xff0c;一般都会涉及对于混淆电路的学习&#xff0c;这是因为混淆电路是多方安全计算中的基础密码原语&#xff0c;也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理&#xff0c;今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…

不同角色路由权限配置(六)

一、启用方式 配置开启config/config.ts。同时需要 src/access.ts 提供权限配置 export default {access: {},// access 插件依赖 initial State 所以需要同时开启initialState: {}, };这里以扩展的路由配置为例&#xff0c;配置只有admin权限才能查看的页面 1、在src/acces…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第3天

目录 一&#xff0c;列表-无序和有序的定义列表 二&#xff0c;表格-基本使用与表格结构标签 三&#xff0c;合并单元格 四&#xff0c;表单-input标签 五&#xff0c;表单-下拉菜单 六&#xff0c;表单-文本域 七&#xff0c;表单-label标签 八&#xff0c;表单-按钮 …

【已解决】页面操作系统功能,诡异报错500nginx错误

【已解决】页面操作系统功能&#xff0c;诡异报错500nginx错误&#xff0c;后台没有任何报错信息 不知道啥原因 清理了浏览器缓存 也没有效果 还有一个表现情况&#xff0c;同样的操作&#xff0c;有时可以又是不行 因为报错ng的代理问题&#xff0c;检查了ng配置 后续经过同…

【C/C++】C语言和C++实现Stack(栈)对比

我们初步了解了C&#xff0c;也用C语言实现过栈&#xff0c;就我们当前所更新过的有关C学习内容以栈为例子&#xff0c;来简单对比一下C语言和C。 1.C中栈的实现 栈的C语言实现在【数据结构】栈的概念、结构和实现详解-CSDN博客 &#xff0c;下面是C实现的栈&#xff0c; 在St…

OD C卷 - 多线段数据压缩

多段 线 数据压缩 &#xff08;200&#xff09; 如图中每个方格为一个像素&#xff08;i&#xff0c;j&#xff09;&#xff0c;线的走向只能水平、垂直、倾斜45度&#xff1b;图中线段表示为(2, 8)、&#xff08;3,7&#xff09;、&#xff08;3, 6&#xff09;、&#xff08…

学习STM32(2)--STM32单片机GPIO应用

目录 1 引 言 2 实验目的 3 实验内容 3.1掌握STM32F103的GPIO控制 3.1.1 GPIO的分组 3.1.2 GPIO的常用功能 3.1.3 STM32单片机GPIO位结构 3.1.4 STM32单片机GPIO工作模式 3.1.5 STM32的GPIO 输出-点亮LED编程要点 使用GPIO时&#xff0c;按下面步骤进行&#xff1…

部署服务器项目及发布

当技术总监直接丢给我一个服务器账号密码时&#xff0c;我该怎么完成映射本机&#xff1b;配置网关&#xff1b;配置代理和发布项目呢&#xff1f; 我使用的是putty远程登录到服务器 输入ip后&#xff0c;点open 输入账号密码 登录的账号如果不是root&#xff1b;使用sudo su…

sqllab靶场练习第1~15关

1、第一关 代码解析 if(isset($_GET[id]))//判断获取的id字段是否为空 { $id$_GET[id]; //logging the connection parameters to a file for analysis. $fpfopen(result.txt,a);//打开这个文件&#xff0c;记录操作的日志 fwrite($fp,ID:.$id."\n"); fclose($fp);…

【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Lambda表达式 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C异常 &#x1f4d2;1. C异常概念…

WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)

WrapPanel控件&#xff08;瀑布流布局&#xff09; WrapPanel控件表示将其子控件从左到右的顺序排列&#xff0c;如果第一行显示不了&#xff0c;则自动换至第二行&#xff0c;继续显示剩余的子控件。我们来看看它的结构定义&#xff1a; public class WrapPanel : Panel {pub…

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo原型图&#xff08;没错&#xff0c;就是它&#xff0c;童年回忆&#xff09; 遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想&#xff0c;想要在前端实现一个fc游戏手柄&#xff0c;然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单&…

【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取

解决移动硬盘无法访问文件或目录损坏且无法读取 只解决&#xff1a;移动硬盘无法访问文件或目录损坏且无法读取 问题 由于频繁下载数据&#xff0c;多次安装虚拟机导致磁盘无法被系统识别。磁盘本身是好的&#xff0c;只是不能被识别&#xff0c;如果将磁盘格式化&#xff0c…

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

概述 默认情况下&#xff0c;Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新&#xff0c;所有的聊天记录&#xff0c;页面上的所有聊天记录都会消失。但是&#xff0c;存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 一旦启用&#xff0c;数据持久性…

Unlikely argument type for equals(): int seems to be unrelated to Long

代码审查不规范&#xff1a; Unlikely argument type for equals(): int seems to be unrelated to Long check package code_check;public class Obj {public Obj(){}private Long mail;public Long getMail(){return mail;}public void setMail(Long mail){this.mail mail;…

【零基础实战】基于物联网的人工淡水湖养殖系统设计

文章目录 一、前言1.1 项目介绍1.1.1 开发背景1.1.2 项目实现的功能1.1.3 项目硬件模块组成1.1.4 ESP8266工作模式配置 1.2 系统设计方案1.2.1 关键技术与创新点1.2.2 功能需求分析1.2.3 现有技术与市场分析1.2.4 硬件架构设计1.2.5 软件架构设计1.2.6 上位机开发思路 1.3 系统…

Java | Leetcode Java题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution {Random random new Random();public void wiggleSort(int[] nums) {int n nums.length;int x (n 1) / 2;int mid x - 1;int target findKthLargest(nums, n - mid);for (int k 0, i 0, j n - 1; k < j; k) {if…

DAMA学习笔记(十)-数据仓库与商务智能

1.引言 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;的概念始于20世纪80年代。该技术赋能组织将不同来源的数据整合到公共的数据模型中去&#xff0c;整合后的数据能为业务运营提供洞察&#xff0c;为企业决策支持和创造组织价值开辟新的可能性。与商务智能&…

使用Go语言绘制柱状图教程

使用Go语言绘制柱状图教程 本文将介绍如何使用Go语言及gg包绘制柱状图&#xff0c;并将图表保存为PNG格式的图片。gg包是一个功能强大的2D图形库&#xff0c;适合用于绘制各种图表。 安装gg包 首先&#xff0c;确保你已经安装了gg包。如果还没有安装&#xff0c;可以使用以下…

【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证

Exchange双因素登录通过增加额外的安全验证层&#xff0c;可以有效提高企业邮箱系统的安全性&#xff0c;减少了数据泄露和账号被盗的风险&#xff0c;同时也符合了日益严格的安全合规要求。 其必要性主要体现在以下几个方面&#xff1a; 提高安全性&#xff1a;传统的用户名…