第26讲:顺序表的应用(通讯录)

news2024/11/17 21:32:38

好,现在我们来做通讯录

上代码

文件1:SeqList.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
typedef struct SLcdatatype
{
	char name[10];
	int age;
	char sex[10];
	char tele[15];
}SLc;
//typedef int SLdatatype;//顺序表
typedef SLc SLdatatype;//通讯录
typedef struct SeqList
{
	SLdatatype* pa;//数组首元素地址
	int size;//元素个数
	int capacity;//数组容量
}SL;

//初始化顺序表
void initSeqList(SL* pSL);

//判断空间是否足够
void cheak(SL* psl1);

//扩容
void expandSL(SL* pSL);

//打印顺序表
void printSL(SL* pSL);

//后增
void backaddSL(SL* pSL);

//前增
void frontaddSL(SL* pSL);

//后删
void backdel(SL* pSL);

//前删
void frontdel(SL* pSL);

//指定位置插入
void posaddSL(SL* pSL,  int pos);

//指定位置删除
void posdelSL(SL* pSL, int pos);

//元素查找
void SLfind(SL* pSL);

//元素修改
void SLalter(SL* pSL, int pos);

//销毁
void SLdesdroy(SL* pSL);

文件二:SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include "Seqlist.h"
void initSeqList(SL* pSL)//初始化顺序表
{
	pSL->pa = NULL;
	pSL->size = 0;
	pSL->capacity = 0;
}

void cheak(SL* psl1)//检查空间是否足够
{
	if (psl1->size == psl1->capacity)
		expandSL(psl1);
}

void expandSL(SL* pSL)//扩容
{
	int newcapacity = pSL->capacity == 0 ? 4 : 2 * pSL->capacity;
	SLdatatype* pSLm = realloc(pSL->pa, (size_t)newcapacity * sizeof(*(pSL->pa)));
	if (pSLm == NULL)
	{
		perror("relloc");
		exit(1);
	}
	else
		pSL->pa = pSLm;
	pSL->capacity = newcapacity;
}

void printSL(SL* pSL)//打印顺序表
{
	assert(pSL);
	int i;
	printf("年龄 名字 性别 电话\n");
	for (i = 0; i < pSL->size; i++)
	{
		printf("%d ", (pSL->pa)[i].age);
		printf("%s ", (pSL->pa)[i].name);
		printf("%s ", (pSL->pa)[i].sex);
		printf("%s \n", (pSL->pa)[i].tele);
	}
}

void backaddSL(SL* pSL)//后增
{
	assert(pSL);
	cheak(pSL);
	scanf("%d", &(pSL->pa)[pSL->size].age);
	scanf("%s", (pSL->pa)[pSL->size].name);
	scanf("%s", (pSL->pa)[pSL->size].sex);
	scanf("%s", (pSL->pa)[pSL->size].tele);
	pSL->size++;
}

void frontaddSL(SL* pSL)//前增
{
	assert(pSL);
	cheak(pSL);
	int i;
	for (i = 0; i < pSL->size; i++)
	{
		(pSL->pa)[pSL->size - i].age = (pSL->pa)[pSL->size - i - 1].age;
		strcpy((pSL->pa)[pSL->size - i].name, (pSL->pa)[pSL->size - i - 1].name);
		strcpy((pSL->pa)[pSL->size - i].sex, (pSL->pa)[pSL->size - i - 1].sex);
		strcpy((pSL->pa)[pSL->size - i].tele, (pSL->pa)[pSL->size - i - 1].tele);
	}
	scanf("%d", &(pSL->pa)->age);
	scanf("%s", (pSL->pa)->name);
	scanf("%s", (pSL->pa)->sex);
	scanf("%s", (pSL->pa)->tele);
	pSL->size++;
}

void backdel(SL* pSL)//后删
{
	assert(pSL != NULL);
	assert(pSL->size > 0);
	pSL->size--;
}

void frontdel(SL* pSL)//前删
{
	assert(pSL != NULL);
	assert(pSL->size > 0);
	int i;
	for (i = 0; i < pSL->size - 1; i++)
	{
		(pSL->pa)[i].age = (pSL->pa)[i + 1].age;
		strcpy(pSL->pa[i].name, pSL->pa[i + 1].name);
		strcpy(pSL->pa[i].sex, pSL->pa[i + 1].sex);
		strcpy(pSL->pa[i].tele, pSL->pa[i + 1].tele);
	}
	pSL->size--;
}

void posaddSL(SL* pSL,  int pos)//指定位置插入
{
	assert(pSL);
	int i = 0;
	for (i = 0; i < pSL->size - pos + 1; i++)
	{
		pSL->pa[pSL->size - i].age = pSL->pa[pSL->size - i - 1].age;
		strcpy(pSL->pa[pSL->size - i].name, pSL->pa[pSL->size - i - 1].name);
		strcpy(pSL->pa[pSL->size - i].sex, pSL->pa[pSL->size - i - 1].sex);
		strcpy(pSL->pa[pSL->size - i].tele, pSL->pa[pSL->size - i - 1].tele);
	}
	scanf("%d", &(pSL->pa)[pos-1].age);
	scanf("%s", (pSL->pa)[pos - 1].name);
	scanf("%s", (pSL->pa)[pos - 1].sex);
	scanf("%s", (pSL->pa)[pos - 1].tele);
	pSL->size++;
}

void posdelSL(SL* pSL, int pos)//指定位置删除
{
	assert(pSL);
	int i = 0;
	for (i = 0; i < pSL->size - pos + 1; i++)
	{
		pSL->pa[pos - 1 + i].age = pSL->pa[pos + i].age;
		strcpy(pSL->pa[pos - 1 + i].name, pSL->pa[pos + i].name);
		strcpy(pSL->pa[pos - 1 + i].sex, pSL->pa[pos + i].sex);
		strcpy(pSL->pa[pos - 1 + i].tele, pSL->pa[pos + i].tele);
	}
	pSL->size--;
}

void SLfind(SL* pSL)//元素查找
{
	int i = 0, flag = 1;
	char arr[10];
	scanf("%s", arr);
	for (i = 0; i < pSL->size; i++)
	{
		if (strcmp(pSL->pa[i].name, arr) == 0)
		{
			printf("元素下标为%d\n", i);
			flag = 0;
		}
	}
	if (flag)
		puts("没有该元素");
}

void SLalter(SL* pSL, int pos)//元素修改
{
	scanf("%d", &pSL->pa[pos - 1].age);
	scanf("%s", &pSL->pa[pos - 1].name);
	scanf("%s", &pSL->pa[pos - 1].sex);
	scanf("%s", &pSL->pa[pos - 1].tele);
}

void SLdesdroy(SL* pSL)//销毁
{
	assert(pSL);
	if (pSL->pa != NULL)
	{
		free(pSL->pa);
		pSL->pa = NULL;
	}
	pSL->size = 0;
	pSL->capacity = 0;
}

文件三:contact.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
int main()
{
	SL sl;
	printf("年龄 名字 性别 电话\n");
	initSeqList(&sl);
	backaddSL(&sl);
	backaddSL(&sl);
	backaddSL(&sl);
	backaddSL(&sl);
	backaddSL(&sl);
	//frontaddSL(&sl);
	//frontaddSL(&sl);
	//frontaddSL(&sl);
	//printSL(&sl);
	//backdel(&sl);
	//printSL(&sl);
	//frontdel(&sl);
	printSL(&sl);
	SLfind(&sl);
	//SLdesdroy(&sl);
	return 0;
}

我们讲讲通讯录和上一节顺序表的区别以及本代码的构思

首先,通讯录就是顺序表

本来,pa指向的是一个变量,现在让它指向结构体,使其储存的数据多样化

我们可以通过对pa下标访问,访问到每一个结构体,然后用  .  进行结构体成员访问

基本思路:略(第26讲有详解)

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

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

相关文章

过去AIGC赋能教育有了哪些成果?未来教育又会出现哪些新趋势?

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术已经在教育领域取得了显著的成果&#xff0c;AIGC技术正在以前所未有的速度推动教育领域的变革。 然而&#xff0c;这只是开始&#xff0c;未来AIGC技术将继续深入教育领域&#xff0c;带来更…

AI工具POE两个月付费体验

2023年12月1号,在半年前付费100美金购买了GitHub Copilot之后,我又付费200美金购买了一年的POE。 下一次续费的日期是今年的12月2日。 我是被洗脑了吗?为啥不断的掏钱买AI服务呢? 今天来说说,我都用poe来做了什么?有什么感受和收获。 依旧是这个流程,我会按照以下的问…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

Java项目:基于SSM框架实现的家纺用品销售管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm814基于SSM框架实现的家纺用品销售管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试…

农业植保无人机行业研究:预计2025年市场规模可达115亿元

农业植保无人机行业市场投资前景现状如何?农业植保无人机市场&#xff0c;包括无人机自身技术、性能标准和植保标准。农业植保无人机应用植保机喷洒农药对我国而言&#xff0c;不仅具有很大的经济价值&#xff0c;还具有社会价值&#xff1a;农业植保机作业不仅有超高的工作效…

Python中的递归函数是什么

Python 递归函数 递归的特性&#xff1a; 1.调用自身函数 2.有一个结束条件 3.递归效率不高&#xff0c;可能会导致栈溢出(函数调用是通过栈这种数据结构实现的&#xff0c;每进入一个函数调用&#xff0c;栈就会增加一层栈帧&#xff0c;函数每返回&#xff0c;栈就会减少…

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式&#xff1f; 单例模式&#xff08;Singleton&#xff09;&#xff0c;也叫单子模式&#xff0c;是一种常用的软件设计模式。在应用这个模式时&#xff0c;单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象&#xff0c;这样有利…

【C语言】探索数据结构:单链表和双链表

目录 &#x1f4a1;链表的概念和结构 &#x1f4a1;链表的分类 &#x1f4a1;无头单向非循环链表&#xff08;单链表&#xff09;的实现 定义节点结构 单链表的尾部插入 单链表的头部插入 单链表的尾部删除 单链表的头部删除 在指定位置插入前数据 在指定位置之后插入数…

如何发布一款移动 App?

如何发布一款移动 App&#xff1f; 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 今天来聊聊如何发布一款移动 App。 移动 App 的发布流程不同于传统方法。下图简化了这一过程&#xff0c;以帮助您理解。 移动应用程序发布流程的典…

基于simulink的模糊PID控制器建模与仿真,并对比PID控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器原理 4.2 模糊PID控制器原理 5.完整工程文件 1.课题概述 在simulink&#xff0c;分别建模实现一个模糊PID控制器和一个PID控制器&#xff0c;然后将PID控制器的控制输出和模糊PID的控制输出…

TCP四次握手

TCP 协议在关闭连接时&#xff0c;需要进行四次挥手的过程&#xff0c;主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下&#xff1a; 客户端发送 FIN 包&#xff1a;客户端发送一个 FIN 包&#xff0c;其中 FIN 标识位为 1&#xff0c…

x2openEuler 升级实操(centos7.8 to openEuler 20.03)

通过 x2openEuler 工具&#xff0c;将 centos 7.8 迁移至 OpenEuler 上&#xff0c;实际感受迁移过程。x2openEuler https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/x2openEuler/x2openEuler.html 环境准备 下载 x2openEuler 安装包 wget https://repo.oepkgs.net/o…

Spring AOP原理的常见面试题

Spring AOP原理的常见面试题 .Spring AOP是怎么实现的什么是代理模式静态代理动态代理怎么实现的JDK动态代理CGLIB动态代理引入依赖 JDK与CJLIB的区别什么时候使用JDK与CJLIB . Spring AOP是怎么实现的 答:Spring AOP是通过动态代理来实现AOP的 什么是代理模式 答:代理模式也…

C++数据结构与算法——链表

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

LeetCode 834. 树中距离之和

简单换根DP 其实就是看好变化量&#xff0c;然后让父亲更新儿子就好了&#xff5e; 上图2当根节点的时候&#xff0c;ans[2] ans[0] -sz[2]n-sz[2]; class Solution { public:vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) {v…

OCP NVME SSD规范解读-8.SMART日志要求-2

SMART-7&#xff1a; 软错误ECC计数可能是记录了被第一级ECC&#xff08;比如LDPC Hard Decode&#xff09;成功纠正过的读取错误次数。这意味着数据恢复成功&#xff0c;但依然表明存储介质出现了某种程度上的可靠性下降。 LDPC码是一种基于稀疏矩阵的纠错码&#xff0c;它由…

鸿蒙会取代Android吗?听风就是雨

现在说取代还谈不上&#xff0c;毕竟这需要时间。安卓作为全球第一的手机操作系统&#xff0c;短时间内还无法取代。持平iOS甚至超过iOS有很大可能&#xff0c;最终会呈现“三足鼎立”有望超过安卓基数。 作为全新的鸿蒙操作系统&#xff0c;其现在已经是全栈自研底座。按照鸿…

【前端工程化】环境搭建 nodejs npm

文章目录 前端工程化是什么&#xff1f;前端工程化实现技术栈前端工程化环境搭建 &#xff1a;什么是Nodejs如何安装nodejsnpm 配置和使用npm 介绍npm 安装和配置npm 常用命令 总结 前端工程化是什么&#xff1f; 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块…

模拟电路之运放

滞回比较器&#xff1a; 小幅度波动时候不受影响&#xff0c;除非超过一点范围 当输入信号慢慢增加到UT&#xff0c;就变成负电压 当输入信号慢慢减压到—UT&#xff0c;就变成正电压 电路反向接信号 正反馈&#xff0c;串联电阻接地 调整回差的方法 1.调整电阻的分压 2.…

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏&#xff0c;那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影&#xff0c;仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一&#xff0c;更是我们童年岁月中不可或缺的一部分&#xff0c;一个承载回…