数据结构(1)--> 顺序表

news2024/12/25 23:38:21

定义:

顺序表存储定义: 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构,顺序表功能的实现借助于数组,通过对数组进行封装,从而实现增删查改的功能,严格意义上来说(数组无法实现删除数据的功能)。

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"

void initseqlist(SL* p) {
	assert(p);
	p->arr = NULL;
	p->capacity = p->size = 0;
}

void printseqlist(SL* p) {
	for (int i = 0; i < p->size; i++) {
		printf("%d ", p->arr[i]);
	}
	printf("\n");
}


void checkcapacity(SL* p) {
	assert(p);
	if (p->capacity == p->size) {
		int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;

		// if here use malloc,the origin data in this array might be missing 

		int* temp = (int*)realloc(p->arr,sizeof(int) * newcapacity);
		p->arr = temp;
		p->capacity = newcapacity;
	}
}



void pushFront(SL* p, int val) {
	assert(p);
	checkcapacity(p);
	int end = p->size - 1;
	while (end >= 0) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[0 ] = val;
	p->size++;
}

void pushback(SL* p,int val) {
	//assert(p);
	checkcapacity(p);
	p->arr[p->size] = val;
	p->size++;
}


void popfront(SL* p) {
	assert(p);
	int n = p->arr[0];
	printf("将要被pop元素=%d\n", n);
	for (int i = 1; i < p->size ; i++) {
		p->arr[i - 1] = p->arr[i];
	}
	p->size--;
}


void insertanyposition(SL* p, int pos, int val) {
	assert(p);
	assert(pos >= 0 && pos <= p->size);
	int end = p->size - 1;
	while (end>=pos) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[pos] = val;
	p->size++;
}

int findDataPos(SL* p, int val) {
	assert(p);
	for (int i = 0; i < p->size; i++) {
		if (p->arr[i] == val) {
			return i;
		}
	}
	return -1;
}

1、顺序表的初始化:

typedef struct seqlist {
	int* arr;
	int size;
	int capacity;
}SL,*PTR;



void initseqlist(SL* p) {
	assert(p);
	p->arr = NULL;
	p->capacity = p->size = 0;
}

 

2、顺序表容量检测:

当我们要对表里进行相关操作的时候,第一步检测当下该表中size 与 容量的关系,可以写一个checkcapacity函数。

void checkcapacity2(SL* p) {
	assert(p);
	if (p->capacity == p->size) {
		int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;
		int* temp = (int*)malloc(sizeof(int) * newcapacity);
		p->arr = temp;
		p->capacity = newcapacity;
	}
}


void test3() {
	PTR p;
	SL sl;
	p = &sl;
	initseqlist(p);
	pushback(p, 5);//first init  ---> size=4,capacity=4
	pushback(p, 15);
	pushback(p, 25);
	pushback(p, 35);
	pushback(p, 45);
	printseqlist(p);

}

这个时候来看一下打印结果:

为什么会这样呢,这个时候我们就需要借助调试工具来找出问题所在

所以我们该处可以用realloc 函数 来进行动态内存管理:

void checkcapacity(SL* p) {
	assert(p);
	if (p->capacity == p->size) {
		int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;

		// if here use malloc,the origin data in this array might be missing 

		int* temp = (int*)realloc(p->arr,sizeof(int) * newcapacity);
		p->arr = temp;
		p->capacity = newcapacity;
	}
}

 

 

3、顺序表插入数据:

3.1头插:

void pushFront(SL* p, int val) {
	assert(p);
	checkcapacity(p);
	int end = p->size - 1;
	while (end >= 0) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[0 ] = val;
	p->size++;
}

 

 

3.2尾插:

void pushback(SL* p,int val) {
	//assert(p);
	checkcapacity(p);
	p->arr[p->size] = val;
	p->size++;
}

4、顺序表删除数据:

4.1头删

void popfront(SL* p) {
	assert(p);
	int n = p->arr[0];
   // 可以起到记录作用

	printf("将要被pop元素=%d\n", n);
	for (int i = 1; i < p->size ; i++) {
		p->arr[i - 1] = p->arr[i];
	}
	p->size--;
}

 

4.2尾删

5、任意位置实现插入功能:

void insertanyposition(SL* p, int pos, int val) {
	assert(p);

	assert(pos >= 0 && pos <= p->size);

	int end = p->size - 1;
	while (end>=pos) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[pos] = val;
	p->size++;
}

6、顺序表中实现查找功能:

int findDataPos(SL* p, int val) {
	assert(p);
	for (int i = 0; i < p->size; i++) {
		if (p->arr[i] == val) {
			return i;
		}
	}
	return -1;
}

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

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

相关文章

python在线聊天室(带聊天保存)

python Socket在线聊天室(带聊天保存) 需求功能 1.聊天信息保存功能(服务端会把信息保存到一个txt里面) 2.使用pyqt5框架作为一个可视化界面 3.具备一个服务端和多个客户端的功能 4.具备离线加入黑名单(离线踢出) 5.具备在线加入黑名单(在线加入黑名单被踢出) 6.具备群聊功能…

JasperReports渲染报表文件时候,读取图片报错:Byte data not found at:xxx.png.\r\n\tat

目录【知识星球】 1.1、错误描述 1.2、解决方案 1.1、错误描述 最近在工作中&#xff0c;使用JasperReports报表比较多一些&#xff0c;有次线上环境里面运行报错&#xff0c;查看报错日志&#xff0c;如下所示&#xff1a; net.sf.jasperreports.engine.JRException: Byte…

批量数据之DataX数据同步

文章目录 1 DataX1.1 引言1.2 DataX 简介1.3 核心1.3.1 DataX3.0 框架设计1.3.2 DataX3.0 核心架构 1.4 使用 DataX 实现数据同步1.4.1 准备安装1.4.2 Linux 上安装 DataX 软件1.4.3 DataX 基本使用1.4.4 MySQL 数据库1.4.4.1 安装1.4.4.2 准备同步1.4.4.3 创建存储过程&#x…

第15次修改了可删除可持久保存的前端html备忘录:换了一个容器时钟,匹配背景主题:现代深色

第15次修改了可删除可持久保存的前端html备忘录&#xff1a;换了一个容器时钟&#xff0c;匹配背景主题&#xff1a;现代深色 备忘录代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv&qu…

适用于 Windows 的 10 个最佳数据恢复工具学习

在数字时代&#xff0c;数据就是一切。从珍贵的家庭照片和重要的工作文档到最喜欢的音乐和电影&#xff0c;我们的生活越来越多地存储在各种设备上。系统崩溃、意外删除或恶意病毒都可能使您的宝贵数据瞬间消失。这就是数据恢复工具的用武之地。 10 个最佳数据恢复工具 这些软…

【无标题】Gateway API 实践之(五)FSM Gateway 的会话保持功能

网关的会话保持功能是一种网络技术&#xff0c;旨在确保用户的连续请求在一段时间内被定向到同一台后端服务器。这种功能在需要保持用户状态或进行连续交互的场景中特别重要&#xff0c;例如在维护在线购物车、保持用户登录状态或处理多步骤事务时。 会话保持通过提供一致的用…

代码随想录算法刷题训练营day17

代码随想录算法刷题训练营day17&#xff1a;LeetCode(110)平衡二叉树 LeetCode(110)平衡二叉树 题目 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(…

关于AOP的@Around特殊处理RequestBody的使用小结

目录 1. 概述 1.1 背景 1.2 源码 2. 测试 2.1 Controller 2.2 SpecialName配置 2.3 RequestConverter 2.4 测试 最近项目上遇到一个这样的需求&#xff1a;用户请求的时候传过来A&#xff0c;在api处理过程中要把A当成B去处理&#xff0c;但是返回的标识中又必须是A作为…

vue2 事件总线

原图下载&#xff1a;https://download.csdn.net/download/weixin_47401101/88788636

【开源】基于JAVA语言的二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

数据结构和算法笔记5:堆和优先队列

今天来讲一下堆&#xff0c;在网上看到一个很好的文章&#xff0c;不过它实现堆是用Golang写的&#xff0c;我这里打算用C实现一下&#xff1a; Golang: Heap data structure 1. 基本概念 满二叉树&#xff08;二叉树每层节点都是满的&#xff09;&#xff1a; 完全二叉树&a…

java中aes加密解密工具类

java中aes加密解密工具类 字符串&#xff1a;{“DATA”:{“SJH”:“17600024168”,“DLZH”:“91510104MA67FPXR5T”,“DLMM”:“jhdz123456”,“DLSF”:“5”,“NSRSBH”:“91510104MA67FPXR5T”},“JRSF”:“23”} 加密后&#xff1a;y4mzmi3jta22aXeIPfEdzu8sgA9uy3OevaIY…

【Midjourney】内容展示风格关键词

1.几何排列(Geometric) "Geometric" 是一个与几何有关的词汇&#xff0c;通常用于描述与形状、结构或空间几何特征相关的事物。这个词可以涉及数学、艺术、工程、计算机图形学等多个领域。 使用该关键词后&#xff0c;图片中的内容会以平面图形拼接的方式展示&#…

优雅的python(二)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

【机器学习】强化学习(八)-深度确定性策略梯度(DDPG)算法及LunarLanderContinuous-v2环境训练示例...

训练效果 DDPG算法是一种基于演员-评论家&#xff08;Actor-Critic&#xff09;框架的深度强化学习&#xff08;Deep Reinforcement Learning&#xff09;算法&#xff0c;它可以处理连续动作空间的问题。DDPG算法描述如下&#xff1a; GPT-4 Turbo Copilot GPT-4 DDPG算法伪代…

Adobe ColdFusion 任意文件读取漏洞复现(CVE-2023-26361)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion平台 filemanager.cfc接口存在任意文件读取漏洞,攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配…

vue3框架基本使用

一、安装包管理工具 vite和vue-cli一样&#xff0c;都是脚手架。 1.node版本 PS E:\vuecode\vite1> node -v v18.12.12.安装yarn工具 2.1 yarn简单介绍 yarn是一个包管理工具&#xff0c;也是一个构建、打包工具 yarn需要借助npm进行安装&#xff1a;执行的命令行npm i…

React一学就会(3): 强化练习一

前言 兄弟们点个关注点点赞&#xff0c;有什么建议在评论里留言说一下&#xff0c;一定要和我多多互动啊&#xff0c;这样我才有动力创作出更有品质的文章。 这节课我们用前两节课的知识做一个实践&#xff0c;在实战中巩固我们所学。本来我想借用官方的示例翻译一下&#xf…

认识思维之熵

经常有读者问我&#xff0c;说&#xff1a; 为什么向您请教一个问题&#xff0c;您总能很快指出在哪篇文章里面提到过&#xff0c;是因为您的记忆力特别好吗&#xff1f; 其实不是的。更重要的原因是&#xff1a;如果你经过系统训练&#xff0c;有意识地去获取知识的话&#x…

JVM篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、分代收集算法二、新生代与复制算法三、老年代与标记复制算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、分代…