数据结构--线性表之顺序表

news2024/10/7 14:33:07

1.线性表定义

线性表(List):零个或多个数据元素的有限序列。

线性表的数据集合为{a1,a2,…,an},假设每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

 

在较复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件。

2.顺序表

线性表的顺序存储结构

1.概念

用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

2.特点

逻辑上相邻的数据元素,物理次序也是相邻的。

只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。

3.代码

1: .h

#pragma once
//预防头文件被重复引用
//定义与声明

//定长顺序表
typedef struct SQList
{
	int elem[10];//存放数据,固定长度为10
	int length;//有效数据的个数
}SQList,*PSQList;

//初始化
void InitSqlist(PSQList ps);

//插入数据,在ps顺序表的pos位置插入val
bool Insert(PSQList ps, int pos, int val);

//判空
bool IsEmpty(PSQList ps);

//在ps中查找第一个val.找到返回下标,没有找到返回-1
int Search(PSQList ps, int key);

//删除pos位置的值
bool DelPos(PSQList ps, int pos);

//删除第一个val的值
bool DelVal(PSQList ps, int val);

//返回key的前驱下标,如果不存在返回-1
int GetPrio(PSQList ps, int key);

//返回key的后继下标,如果不存在返回-1
int GetNext(PSQList ps, int key);

//输出
void Show(PSQList ps);

//清空数据
void Clear(PSQList ps);

//销毁整个内存
void Destroy(PSQList ps);

2: .cpp

1.头文件

#include<stdio.h>
#include<assert.h>
#include"sqlist.h"

2.初始化,为了让程序正确运行

void InitSQList(PSQList ps)
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return;
	}
	ps->length = 0;
}

static bool IsFull(PSQList ps)
{
	return ps->length == 10;
}

3.插入数据,在ps顺序表的pos位置插入val

bool Insert(PSQList ps, int pos, int val)
{
	//判空
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	//判断是不是满的表
	if(pos<0||IsFull(ps)||pos> ps->length)
	{
	return false;
	}
	//把数据移动到后
	for(int i=ps->length-1;i>=pos;i--)
	{
		ps->elem[i+1] = ps->elem[i];
	}
	//插入数据
	ps->elem[pos] = val;
	//有效数据++
	ps->length++;
}

4.判空

bool IsEmpty(PSQList ps)
{
	return ps->length == 0;
}

5.查找,找到返回下标,没找到返回-1

int Search(PSQList ps, int key)
{
	//判空
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	for (int i = 0; i < ps->length; i++)
	{
		if (ps->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}

6.删除pos位置的值

bool Delpos(PSQList ps, int pos)
{
	//判空
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	if (pos < 0 || pos >= ps->length)
	{
		return false;
	}
	for (int i = pos; i < ps->length-1; i++)
	{
		ps->elem[i] = ps->elem[i + 1];
	}
	ps->length--;
}

7.删除第一个val的值

bool Delval(PSQList ps, int val)
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	int i = Search(ps, val);
	if (i < 0)
	{
		return false;
	}
	return Delpos(ps, i);

}

8.返回key的前驱下标,如果不存在返回-1

int GetPrio(PSQList ps, int key)
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	int i = Search(ps, key);
	if (i <= 0)//头无前驱
		return false;
	else
		return i-1;
}

9.返回key的后继下标,如果不存在返回-1

int GetNext(PSQList ps, int key)
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return false;
	}
	int i = Search(ps, key);
	if (i < 0||i==ps->length-1)//尾无后继
		return false;
	else
		return i+1;
}

10.输出

void Show(PSQList ps)
{
	//判空
	assert(ps != NULL);
	if (ps == NULL)
	{
		return ;
	}
	for (int i = 0; i < ps->length; i++)
	{
		printf("%d ", ps->elem[i]);
	}
	printf("\n");
}

11.清空数据

void Clear(PSQList ps)
{
	ps->length = 0;
}

12.销毁 

void Destroy(PSQList ps)
{
	Clear(ps);
}

3. .test

#include <stdio.h>
#include "sqlist.h"
int main()
{
	SQList sq;
	printf("%d\n", sizeof(sq));
	InitSQList(&sq);
	for (int i = -1; i < 20; i++)
	{
		Insert(&sq, i, i);
	}
	Show(&sq);
	int i = Search(&sq, 2);
	if (i >= 0)
	{
		printf("该值位于%d号下标\n", i);
	}
	else
	{
		printf("没有找到\n");
	}
	int index;
	for (int i = -1; i < 11; i++)
	{
		index = Search(&sq, i);
		if (index >= 0)
		{
			printf("%d位于%d号下标\n", i, index);
		}
		else
		{
			printf("没有找到%d\n",i);
		}
	}
	Delpos(&sq, 5);
	Show(&sq);
	Delval(&sq, 0);
	Show(&sq);
	return 0;
}v

4.测试结果

 44                                        顺序表的大小
0 1 2 3 4 5 6 7 8 9                插入数据,只存10个(表的大小为10)
该值位于2号下标                  查找val=2的下标
没有找到-1                           查询不到-1
0位于0号下标                       
1位于1号下标
2位于2号下标
3位于3号下标
4位于4号下标
5位于5号下标
6位于6号下标
7位于7号下标
8位于8号下标
9位于9号下标
没有找到10                       查询不到10
0 1 2 3 4 6 7 8 9               删除5
1 2 3 4 6 7 8 9                  删除0

 

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

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

相关文章

第三十三篇 transition-group 列表过渡

上一篇内容讲到的是transiotion&#xff0c;其中还记得有一个报错吗&#xff1f;如下&#xff1a; 先来回顾一下&#xff0c;<transition> 只能用于单个元素&#xff0c;如果在<transition>单中并列两个<p>标签&#xff0c;那么这样一来就会报以上这个错误&a…

六、表空间管理

六、表空间管理 1、查看表空间 使用DM Manager工具&#xff1a; 代码&#xff1a; -- 1、查看表空间名 select tablespace_name FROM SYS.DBA_TABLESPACES;-- 2、查看表空间名、表空间对应的数据文件地址、状态 select tablespace_name,file_name,status FROM dba_data_files;…

软件定义汽车产业生态创新白皮书

1 什么是软件定义汽车 1.1 驱动因素 汽车“新四化”的发展需要软件的加持 据大众汽车公开披露信息&#xff0c;未来平均每辆普通汽车软件代码量超 1 亿行。在电动化、智能化和网联化等的发展推动下&#xff0c;汽车将加速向高度数字化、信息化、智能化的移动终端发展。座舱娱…

CM311-1_YST_S905L3(B)_安卓9.0_设置无密码_默认打开adb_完美AI语音_线刷固件包

CM311-1_YST_S905L3(B)_安卓9.0_设置无密码_默认打开adb_完美AI语音_线刷固件包 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升…

LX12864P1屏幕使用介绍(ST7567驱动),显示横线、字符、图形

LX12864P1屏幕显示&#xff08;ST7567驱动&#xff09; 可编辑12864液晶模组&#xff0c;也就是液晶显示屏是有128*64个点阵组成。12864是一种图形点阵液晶显示器&#xff0c;它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了128(列)64(行)的全点阵液晶显示此显…

全国地级市城镇化和协调发展指数测算数据(2005-2019)六份数据

全国地级市城镇化和协调发展指数测算数据&#xff08;2005-2019&#xff09;六份数据 1、范围&#xff1a;受数据限制&#xff0c;剔除了新疆和西藏的城市共包括287个地级市 2、时间区间为&#xff1a;2005-2019年 3、六分数据包括&#xff1a; 地级市城镇化发展水平&#…

多线程入门

多线程简介 1. 进程/线程 # 进程 - 进程由指令和数据组成&#xff0c;指令要运行&#xff0c;数据要读写&#xff0c;必须将指令加载到CPU&#xff0c;数据加载到内存。指令运行过程中还需要用到磁盘&#xff0c;网络等IO设备 - 进程用来加载指令&#xff0c;管理内存&#x…

CentOS7 安装rabbitMQ步骤

全程使用root权限 1、修改主机名称 hostnamectl set-hostname rmq158 2、输入命令&#xff1a;vi /etc/hosts修改hosts文件 3、重启 4、WINSCP传输两个包到/usr/local下面 5、tar -xvf otp_src_21.3.tar.gz cd otp_src_21.3 ./configure --prefix/usr/local/erlang 6、yum i…

教学:制作 GitHub 同步近期博客卡片

这几天看到有小伙伴将自己近期更新的博客同步显示到了 GitHub 主页&#xff0c;这么有趣的小卡片我是一定要尝试一把的&#xff0c;完整的教程我已经整理好了&#xff0c;一起搞起来吧~ 2. 开始教程 2.1 实现流程&#xff1a; Github 的主页装修主要讲的就是主页的 Markdown 文…

Spring Security自定义验证码登录

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 验证码登录也是项目中一个常见的需求&#xff0c;但是Spring Security并未提供自动化配置方案。所以需要开发者自行定义。这里…

Spring的创建和使用

1. 创建Spring项目 1.1 创建一个 Maven 项目 不需要使用任何模板, 点击下一步.注:所有的名称都不能包含中文.Maven仓库中的结构: 1.2 添加 Spring 框架支持 在Spring 的 配置文件 中添加依赖 spring-context: Spring的上下文spring-beans: 管理Spring对象(bean) <depende…

36、异常(Exception)

一、 引入: 不应该出现了一个不算致命的问题就导致整个系统崩溃&#xff0c;所以java设计者提供了一个异常处理机制来解决问题 快速入门&#xff1a; package exception_;public class Exception01 {public static void main(String[] args) {int num110;int num20;//异常处…

软件工程复习

文章目录&#xff08;一&#xff09;软件软件发展三阶段软件的概念什么是软件危机&#xff1f;内容包括&#xff1a;软件危机的表现&#xff1a;软件危机的原因(4)消除软件危机的途径&#xff1a;软件工程软件工程定义&#xff08;要背&#xff09;简称&#xff1a;软件工程的基…

【Java基础】第六章 | IO流

目录 | 总框架 | 文件路径相关知识 | Peoperties类与IO流、配置文件* | 1.文件流 文件字节输入流&#xff08;标准输入流&#xff09; FileInputStream 文件字节输出流 FileOutputStream 文件字符输入流 FileReader 文件字符输出流 FileWriter 应用&#xff1a;使用字…

MMDetection库中的一些模块介绍

本文目前仅包含1个主干网络和1个颈部网络。如果有机会&#xff0c;会继续补充更多模型。 若发现内容有误&#xff0c;欢迎指出。 MMDetection的图像数据一般会经历如下步骤/模块&#xff1a; #mermaid-svg-XxM18Ychr9OSpdV6 {font-family:"trebuchet ms",verdana,ari…

JavaScript 防抖与节流

目录1 函数1.1 调用函数1.2 闭包2 防抖与节流2.1 定义2.2 区别2.3 应用场景3 防抖3.1 非立即执行3.1.1 一般写法3.1.2 Vue2 中写法3.1.3 过程3.2 立即执行3.2.1 一般写法3.2.2 Vue2 中写法3.2.3 过程1 函数 应用防抖节流首先需理解以下知识 1.1 调用函数 js 函数内部 return…

电影售票系统

项目介绍 基于SpringBoot &#xff0c;Mybatis&#xff0c; Vue 的电影售票及影院管理系统&#xff08;前后端分离&#xff09;&#xff0c;具体功能见 下面演示截图 需要安装的软件 Java8 MySQL5.7或以上 Navicat或者其他管理工具 IDEA或者Eclipse Node.js 14或以上 运行项…

PLC学习笔记(三):PLC结构(2)

目录&#xff1a; PLC学习笔记&#xff08;一&#xff09;&#xff1a;概述 PLC学习笔记&#xff08;二&#xff09;&#xff1a;PLC结构&#xff08;1&#xff09; PLC学习笔记&#xff08;三&#xff09;&#xff1a;PLC结构&#xff08;2&#xff09; &#x1f981;&…

SpringBoot+Mybaits搭建通用管理系统实例八:系统权限控制实现

一、本章内容 实现自定义权限控制,通过自定义PermissionEvaluator实现操作权限的检测及控制,关于权限控制模型有ACL, DAC, MAC, RBAC, ABAC等,具体原理可参考:【权限系统设计】ACL, DAC, MAC, RBAC, ABAC 模型的不同应用场景 完整课程地址 二、开发视频 SpringBoot+Mybaits…

《操作系统-真象还原》12. 进一步完善内核

文章目录Linux 的系统调用系统调用的实现 —— 图解系统调用的实现 —— 代码触发中断寻找 IDT 中断描述符执行对应的中断例程中断例程中通过用户传入的功能号去执行对应的功能函数关于 printf你需要知道可变参数的原理Linux 中的可变参数原理Linux 中的可变参数实现printf 只是…