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

news2024/12/30 4:06:45

目录

一、前言

二、各个功能的实现

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.coloradmin.cn/o/1984402.html

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

相关文章

ROS智能移动机器人实训

0.前言 1.任务 1.1.任务实训任务 1.使用/voice_aiui等语音服务完成基本的语音聊天(需唤醒词“元宝”)。 2.语音多点导航 3.语音单点导航 1.2.智能机器人仿真任务 1.3.智能机器人实物操作任务 2.目的 3&#xff0e;使用环境 4.综合项目实验 任务实训 问题 解决办法…

LinuxIO之文件系统的实现

Ext2/3/4 的layout文件系统的一致性&#xff1a; append一个文件的全流程掉电与文件系统的一致性fsck文件系统的日志ext4 mount选项文件系统的debug和dumpCopy On Write 文件系统&#xff1a; btrfs 预备知识&#xff1a;数据库里的transaction(事务)有什么特性&#xff1f; …

前端高薪岗位之大模型端上部署及训练

自2022年ChatGPT发布以来&#xff0c;以大模型为依托的AIGC相关的应用产品&#xff0c;比如ChatGPT、Midjourney、Stable Diffusion等&#xff0c;在社交网站的讨论热度持续攀升&#xff0c;引发了较大范围的好奇与关注。 目前&#xff0c;国内外各个科技大厂在大模型的端侧部…

手机k歌麦克风哪种好,口碑最好的k歌麦克风是哪款,麦克风推荐

​当我们谈论到演讲、表演或者录制视频时&#xff0c;一个高质量的无线麦克风能够使得整个体验提升至一个全新的水平。它不仅能够保证声音的清晰度和真实度&#xff0c;还能够让使用者在演讲或者表演时更加自信和舒适。基于对市场的深入研究和用户体验的考量&#xff0c;我挑选…

Langchain-Chatchat+Xinference集成部署

Langchain-ChatchatXinference集成部署 安装环境&#xff1a; 系统&#xff1a;Anolis OS 8.9 python版本&#xff1a;Python 3.9.19 Langchain-Chatchat版本&#xff1a;0.3.1.3 Xinference版本&#xff1a;v0.13.3 模型选择&#xff08;下载时需要科学上网&#xff09;&#…

一些常见的中间件漏洞

Tomcat 之CVE-2017-12615 靶场搭建使用vulhub-master/tomcat/CVE-2017-12615 第一步、访问网站 第二步、首页抓包改为put方式提交 网上找一个jsp的一句话木马 使用webshell工具链接即可 Tomcat 之tomcat8 vulhub-master/tomcat/tomcat8 继续访问页面 这次我们点击登录&…

ES6中的Promise、async、await,超详细讲解!

Promise是es6引入的异步编程新解决方案&#xff0c;Promise实例和原型上有reject、resolve、all、then、catch、finally等多个方法&#xff0c;语法上promise就是一个构造函数&#xff0c;用来封装异步操作并可以获取其成功或失败的结果&#xff0c;本篇文章主要介绍了ES6中的P…

spring原理(第十天)

jdk 和 cglib 在 Spring 中的统一 Spring 中对切点、通知、切面的抽象如下 切点&#xff1a;接口 Pointcut&#xff0c;典型实现 AspectJExpressionPointcut 通知&#xff1a;典型接口为 MethodInterceptor 代表环绕通知 切面&#xff1a;Advisor&#xff0c;包含一个 Advic…

政务服务技能竞赛规则流程方案

此次政务服务技能竞赛以“强服务、优素质、促提升、共发展”为目标&#xff0c;通过以赛代练、以赛促建、比学赶超、全面提升&#xff0c;激发各级政务服务工作人员学政策、钻业务、练技能的热情和积极性&#xff0c;全面推动行政效能提升与营商环境建设&#xff0c;铸造新时代…

pytorch和deep learning技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题&#xff0c;小虎单独收集到这里。 torch.hub.load how does it work 下载预训练模型再载入&#xff0c;用程序下载链接可能失效。 model torch.hub.load(ultralytics/yolov5, yolov5s)model torch.hub.load(ultralytics/y…

IROS2024 | DarkGS:学习神经照明和3D高斯重新照明,用于黑暗中机器人探索

DarkGS&#xff1a;学习神经照明和3D高斯重新照明&#xff0c;用于黑暗中机器人探索 论文标题&#xff1a;DarkGS: Learning Neural Illumination and 3D Gaussians Relighting for Robotic Exploration in the Dark 论文地址&#xff1a;https://arxiv.org/abs/2403.10814 研…

数据开发/数仓工程师上手指南(七)CDM-DWS层搭建规范及流程

前言 进入到了CMD公共数据层的结尾最后一层-DWS层了&#xff0c;该层基本就是直接与业务强关联&#xff0c;也就是说产品提出的需求&#xff0c;或是报表、用户画像统计好还是数据大屏都是在这一层给处理好数据&#xff0c;再放入ADS层&#xff0c;然后我们只需要在BI里面配备…

【数据结构】——堆的实现(赋源码)

堆的概念与结构 堆(Heap)是计算机科学中一类特殊的数据结构&#xff0c;是最高效的优先级队列。堆通常是一个可以被看作一棵完全二叉树的数组对象。 堆的性质: 堆中某个结点的值总是不大于或不小于其父结点的值&#xff1b; 堆总是一棵完全二叉树。 堆的物理结构本质上是顺序…

PDF怎么转Word?分享二个简单的方法

很多小伙伴在工作学习的时候&#xff0c;经常会遇到别人发来的PDF文件。PDF 文件用于查看资料非常方便&#xff0c;因为它们的布局稳定&#xff0c;在大多数设备上都可以显示相同的布局。 如果我们需要将其转换为Word&#xff0c;如何转换呢&#xff1f;许多人不知道如何转换。…

怎么录制视频?简单步骤教你如何录制高质量视频

视频是我们生活、工作和学校中不可或缺的一部分&#xff0c;但对于初学者来说&#xff0c;面对琳琅满目的录屏工具&#xff0c;往往感到无从下手&#xff0c;今天我们就给大家分享几种简单又高效的电脑录屏方法&#xff0c;让你轻松掌握高质量视频录制的技巧。 录制技巧1&#…

工厂人员定位系统原理

工厂人员定位系统是一种通过现代无线通讯技术和定位技术实现对工厂内人员位置进行实时监测的系统。其具体原理是通过安装在员工身上的定位标签产生无线电信号&#xff0c;并通过无线通讯网络传输给基站&#xff0c;再由基站将数据传输到服务器进行处理&#xff0c;最终在监控中…

《藏文驾考》App:支持藏汉双语切换的驾考题库,方便不熟汉语的藏族学员考驾照,中文藏文语音读题!

藏文驾考&#xff0c;是一款支持藏汉双语切换的驾照考试在线刷题学习软件。服务于涉藏地区的藏文驾驶理论考试&#xff0c;同步西藏、四川、青海、甘南等涉藏地区的驾考新规题库。提供科目一、科目四藏文交规理论学习&#xff0c;科目二、科目三视频技巧讲解。支持汉语、卫藏、…

Power功效分析之广义模型原理及案例实操

Power功效分析常用于实验研究时样本量的计算&#xff08;或功效值计算&#xff09;&#xff0c;如果是涉及广义模型时的回归系数差异计算时&#xff0c;SPSSAU共提供二元logit回归和Poisson回归情况时的Power功效分析&#xff0c;具体如下表格所述&#xff1a; 比如二元Logit回…

监听器Listener + 过滤器Filter

监听器Listener 介绍 Listener是JavaEE的规范&#xff0c;就是接口 监听器的作用是&#xff0c;监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成相应的任务 ServletContextListener监听器&#xff08;最常用&#xff09; 作用&#xff1a; 监听S…

javase综合案例4 -- 考试系统

文章目录 一&#xff0c;项目要求二&#xff0c;创建实体类ExamItem三&#xff0c;创建考试服务类ExamService3.1 全局变量 考题列表itemList(List< ExamItem >类型)&#xff0c;答案数组answerArr (String[]类型)&#xff0c;得分score3.2 初始化方法init()3.3 打印菜单…