线性表概念及顺序表的实现

文章目录

  • 前言
  • 一、线性表
    • 1.定义
    • 2.特点
    • 3.一般线性表的抽象数据类型定义
  • 二、线性表的顺序存储(顺序表)
    • 1.基本概念
    • 2.数组实现顺序表
    • 3.顺序表中基本操作的具体实现
    • 4.顺序表总结
  • 总结


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。有关线性结构和抽象数据类型的概念,见数据结构与算法的基本概念


一、线性表

1.定义

  线性表:由0个或多个具有相同属性的数据元素组成的有限序列,常用(A0,A1…An)形式表示。例如26个英文字母(A,B,C…Z)就是一个线性表。

2.特点

  1.线性表是一个序列,也就是说数据元素存在先来后到的关系。好比一个数列,a0总是第一个出现。
  2.满足线性结构要求。
  3.线性表中元素的个数n (n>=0)定义为线性表的长度,n=0时称为空表。如果表中无元素,则为空表,n=0。
  我们常用的一维数组就是一个线性表。

3.一般线性表的抽象数据类型定义

  线性表作为一个相当灵活的数据结构,其长度可根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,而且可以进行插入和删除等操作。下面给出一般线性表的抽象数据类型定义:

ADT List{
数据对象: D={ai | ai∈ElemSet, i=l, 2, …,n, n>=Q}
数据关系: R=(<ai-1,ai>| ai-1,ai∈D, i=2, …, n}
基本操作:
InitList (&L)
操作结果:构造一个空的线性表L。
DestroyList(&L)
初始条件:线性表L已存在。
操作结果:销毁线性表L。
ClearList (&L)
初始条件:线性表L已存在。
操作结果:将L重置为空表。
ListEmpty(L)
初始条件:线性表L已存在。
操作结果:若L为空表,则返回true, 否则返回false。
ListLength(L)
初始条件:线性表L已存在。
操作结果:返回L中数据元素个数。
GetElem(L,i,&e)
初始条件:线性表L已存在,且1<=i<=ListLength(L)。
操作结果:用e返回L中第i个数据元素的值。
LocateElem(L,e)
初始条件:线性表L已存在。
操作结果:返回L中第1个值与e相同的元素在L中的位置。若这样的数据元素不存在,则返回值为0。
PriorElem(L,cur_e,&pre_e)
初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回其前驱,否则操作失败,pre_e无定义。
NextElem(L,cur_e,&next_e)
初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回其后继,否则操作失败,next_e无定义。
ListInsert(&L,i,e)
初始条件:线性表L已存在,且1<=i<=ListLength(L)+1。
操作结果:在 L中第i个位置之前插入新的数据元素 e, L的长度加1。
ListDelete(&L,i)
初始条件:线性表L已存在且非空,且1<=i<=ListLength(L)。
操作结果:删除L的第i个数据元素,L的长度减1。
ListTraverse(&L,visited())
初始条件:线性表L已经存在
操作结果:对线性表L进行遍历,在遍历过程中对线性表中每个元素调用visited()
}ADT List

注:
(1)抽象数据类型仅是一个模型的定义,并不涉及模型的具体实现,因此这里描述中所涉及的参数不必考虑具体数据类型。在实际应用中,数据元素可能有多种类型,到时可根据具体需要选择使用不同的数据类型。
(2) 上述抽象数据类型中给出的操作只是基本操作,由这些基本操作可以构成其他较复杂的操作。
(3)对于不同的应用, 基本操作的接口可能不同。
(4)由抽象数据类型定义的线性表, 可以根据实际所采用的存储结构形式, 进行具体的表示和实现。

二、线性表的顺序存储(顺序表)

1.基本概念

  线性表的顺序表示(又称顺序表)指的是用一组地址连续的存储单元依次存储线性表的数据元素, 这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表(Sequential List)。其特点是,逻辑上相邻的数据元素, 其物理次序也是相邻的。
  假设线性表的每个元素需占用m个存储单元,并以所占的第一个单元的存储地址LOC(q)作为数据元素的存储起始位置。则线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系:
       LOC(ai+1)=LOC(ai)+m
  从而线性表第i个元素存储位置:
       LOC(ai)=LOC(q)+(i-1)*m.

2.数组实现顺序表

  在高级语言中,通常都用数组来描述数据结构中的顺序存储结构。由于线性表的长度可变,且所需最大存储空间随问题不同而不同,则在C语言中可用动态分配的一维数组表示线性表。
  下面给出一般实现过程:

#define MAXSIZE 100   //顺序表可能达到的最大长度
typedef struct 
{ElemType *elem;   //起始地址,即第一个元素存储地址;ElemType为某一数据类型或用户自定义的数据类型int length;       //当前顺序表长度
}SqList;
SqList L;//在c语言中,用malloc实现数组内存动态分配,需要头文件<stdlib.h>
L.data=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE); 
//malloc(n)用于创建一个可以存放n个字节的空间,并返回其首地址
//(ElemType *)用于指针类型强制,此处用于告诉编译器是如何分配的空间。
//以(int *)malloc(sizeof(int)*100)为例
//表示开辟了一个4*100=400字节的空间,其中空间分配为每4字节为一个数据元素,而不是每2字节。
free(p):释放指针p所指变量的存储空间,即彻底删除一个变量//在c++中,用new来实现数组内存动态分配
new 类型名T (初值列表):用于申请存放T类型对象的内存空间,并以初值列表赋初值,若成功则返回T类型指针,指向分配的内存,若失败则返回0(NULL): int *p=new int(10); //成功执行后,p中存放新分配的内存地址,且该地址空间存放值为10
delete 指针p:释放指针p指向的内存,p必须是new操作的返回值
例: delete p;

  考虑多项式:x³+0.5x+1的存储,从而既要存储其指数项,也要存储其对应的系数项:

#define MAXSIZE 100   //多项式可能达到的最大长度
typedef struct 
{
float coef;    //系数
int expn;      //指数
) Polynomial; 
typedef struct 
{ 
Polynomial *elem; 
int length; 
}SqList;
SqList L;
L.data=(Polynomial *)malloc(sizeof(Polynomial)*MAXSIZE); 

  将L定义为SqList类型的变量,便可以利用L.elem[i-1]访间表中位置序号为i的元素
在这里插入图片描述

3.顺序表中基本操作的具体实现

  下面给出一个实现案例:

#include <iostream>
#include <string.h>
using namespace std;#define maxsize 10  //顺序表最大长度
#define ok 1
#define fail 0
#define true 1
#define false 0
#define Not_Exist -1
#define overflow -2typedef int Status;
typedef int book;
typedef struct {book* start;int length;
}Sqlist;//初始化,创建顺序表
Status Creatlist(Sqlist &l)
{l.start = new book[maxsize];if (!l.start)return fail;l.length = 0;for (int i = 0; i < maxsize; i++){cin >> l.start[i];l.length++;}return ok;
}
//销毁顺序表
Status destoryList(Sqlist &l)
{if (!l.start)return Not_Exist;  //判断线性表是否存在delete[]l.start;l.start=NULL; //销毁后,指针仍然存在,指向随机,销毁的只是原来存储的值,计算机内存空间地址是无法销毁的,因此需要在delete后给指针赋NULLreturn ok;
}
//清空顺序表
Status clearList(Sqlist& l)
{if (!l.start)return Not_Exist;l.length = 0;return ok;
}
//检测顺序表是否空
Status Listempty(Sqlist l)
{if (!l.start)return Not_Exist;if (l.length == 0)return true;return	false;
}
//返回顺序表长度
Status Listlength(Sqlist l)
{if (!l.start)return Not_Exist;return l.length;
}
//得到顺序表中某个值
Status Getelem(Sqlist l, int i, book& e)
{if (!l.start)return Not_Exist;if (i<1 && i>l.length)return fail;e = l.start[i - 1];return ok;
}
//检查顺序表中是否存在某个值及其位置
Status Locateelem(Sqlist l,book e)
{if (!l.start)return Not_Exist;for (int i = 1; i <= l.length; i++)if (e == l.start[i-1])return i;return 0;
}
//返回顺序表中某个值的前序
book Priorelem(Sqlist l, book cur_e,book &pre_e)
{int i = Locateelem(l, cur_e);if (i == 1)return Not_Exist;pre_e=l.start[i - 2];return ok;
}
//返回顺序表中某个值的后序
book Nextelem(Sqlist l, book cur_e, book& next_e)
{int i = Locateelem(l, cur_e);if (i == l.length)return Not_Exist;next_e = l.start[i];return ok;
}
//插入一个数据元素
Status Listinsert(Sqlist &l, int pos, book e)
{if (!l.start)return Not_Exist;if (l.length == maxsize)return overflow;if (pos < 1 || pos > l.length + 1)return fail;for (int i=l.length-1; i >=pos-1; i--)l.start[i + 1] = l.start[i];l.start[pos - 1] = e;l.length++;return ok;
}
//删除一个数据元素
Status Listdelete(Sqlist& l, int pos)
{if (!l.start)return Not_Exist;if (l.length == 0)return overflow;if (pos < 1 || pos > l.length + 1)return fail;for (int i = pos - 1; i < l.length-1; i++)l.start[i] = l.start[i+1];l.length--;return ok;
}
//遍历顺序表
Status Traverselist(Sqlist &l)
{if (!l.start)return Not_Exist;for (int i = 0; i < l.length; i++)cout << l.start[i] << "  ";  //这里可以是任何合法操作return ok;
}Sqlist l;
book e1;
book e2 = 7;
book pre_e;
book next_e;
int main()
{//测试Creatlist(l);cout << "输入测试用例:" << endl;//这里以1-10作为测试用例cout << l.start << endl << l.length << endl;Traverselist(l); cout << endl;cout << Listlength(l) << endl;cout << Getelem(l, 5, e1) << " " << e1 << endl;cout << Priorelem(l, 5, pre_e) << " " << pre_e << endl;cout << Nextelem(l, 5, next_e) << " " << next_e << endl;cout << Locateelem(l, e2) << " " << e2 << endl;Listdelete(l, 1);cout << l.start[0] << endl;destoryList(l);cout << l.start << endl; return 0;
}

测试结果:
在这里插入图片描述

4.顺序表总结

  对于线性表的顺序存储,可以采用静态数组或动态数组实现,为了便于数据扩充,常采用动态数组的方式。
  顺序表可以随机存取表中任一元素(随机存取),其存储位置可用一个简单、直观的公式来表示。然而从另一方面来看,这个特点也造成了这种存储结构的缺点:在做插入或删除操作时,需移动大量元素。另外由于数组有长度相对固定的静态特性,当表中数据元素个数较多且变化较大时,操作过程相对复杂,必然导致存储空间的浪费。所有这些问题,都可以通过线性表的另一种表示方法——链式存储结构来解决。


总结

  路漫漫其修远兮,吾将上下而开摆。
  有任何疑问和补充,欢迎交流。(但我显然不会)

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

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

相关文章

MyBatis 源码分析系列文章导读

1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章。本篇文章从 MyBatis 是什么&#xff08;what&#xff09;&#xff0c;为什么要使用&#xff08;why&#xff09;&#xff0c;以及如何使用&#xff08;how&#xff09;等三个角度进行了说明和演…

记一次对某高校微信小程序的漏洞挖掘

挖掘目标的部署在微信的资产(减少信息的收集&#xff0c;毕竟一般web站点没有账号密码不好进入后台&#xff0c;挖掘功能点少) 寻找目标的微信小程序(非原图) 招生小程序打不开&#xff0c;只能挖掘管理系统 进入后发现存在上报安全隐患功能&#xff0c;可以上传图片 准备上传…

【面经】操作系统/Linux

1、计算机的五大单元 电脑的五大单元包括&#xff1a;输入单元、输出单元、控制单元、算数逻辑单元、存储单元五大部分。其中CPU占有控制、算术逻辑单元&#xff0c;存储单元又包含内存与辅助内存&#xff1b; 2、什么是操作系统 操作系统&#xff1a;负责管理协调我们计算机…

Qt QStyle详解

1.简介 QStyle类是 Qt 框架中用于控制应用程序界面元素外观的一个抽象基类。这个类提供了一种方式来定制窗口部件&#xff08;widgets&#xff09;的绘制和行为&#xff0c;可以通过改变主题或风格来更改应用程序的外观&#xff0c;而无需修改窗口部件本身的代码。 Qt包含一组…

python爬虫------- Selenium下篇(二十三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

CAN帧中的ACK位

1&#xff1a;先看官方文档对ACK的解释 All nodes that have received the matching CRC sequence (and, in FD Frames the matching stuff count) shall send an ACK within the ACK slot by overwriting the recessive bit of the transmitter by a dominant bit (they send…

求圆、圆球和圆柱的面积和体积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> //定义π常量的值&#xff1b; # define π 3.141526int main() {//初始化变量值&#xff1b;float r, h, S1, S2, P1, V1, V2;int judge 0;//提示用户&#x…

Python基于flask的豆瓣电影分析可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…

【数据结构】【C++】AVL树的模拟实现(插入、判断、旋转)

文章目录 1 概念2 实现2.1 AVL树结点的定义2.2 AVL树的插入2.2.1 AVL树的插入规则2.2.2 旋转2.2.2.1 左单旋2.2.2.2 右单旋2.2.2.3 左右双旋2.2.2.4 右左双旋 2.2.3 总结 3 平衡判断4 删除5 源码 1 概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二…

找不到api-ms-win-crt-runtime-l1-1-0.dll文件5种解决方法

在日常使用计算机的过程中&#xff0c;我们时常会遭遇各类意想不到的问题&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常…

1Panel官方出品丨MaxKB:基于LLM大模型的知识库问答系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

TensorFlow 1.x的学习

.为什么还有很多人都选择使用TensorFlow 1.x 兼容性问题: TensorFlow 1.x在一些旧项目中已经得到了广泛应用&#xff0c;这些项目可能依赖于1.x版本的特定API或行为。升级到2.x可能需要大量的代码修改和测试工作&#xff0c;对于一些已经稳定运行的项目&#xff0c;维护者可能…

实现iOS App代码混淆

简介 在开发iOS应用程序时&#xff0c;保护代码安全是至关重要的。代码混淆是一种常用的技术&#xff0c;可以增加逆向工程的难度&#xff0c;防止他人对代码的篡改和盗用。本文将介绍如何实现iOS App代码混淆的步骤和操作方法。 整体流程 下面是实现iOS App代码混淆的整体流…

创维:在博鳌论坛 叩响世界之门

出走半生&#xff0c;归来仍是少年。 2024年4月8日&#xff0c;一个离开海南近半个世纪的“少年”回到琼海博鳌&#xff0c;“下一站&#xff0c;1000亿&#xff01;”&#xff0c;他的承诺掷地有声。“1000亿”&#xff0c;意指创维集团在2025年前冲击千亿营收&#xff0c;这…

【JavaWeb】Day45.Mybatis——入门程序

什么是MyBatis? MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 &#xff08;持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。&#xff09; &#xff08;框架&#xff1a;是一个半成品软件&#xff0c;是一套可重用的、通用…

【企业动态】瑞芯微高级业务总监来访东胜物联,共探新能源汽车市场合作

近日&#xff0c;瑞芯微高级业务总监阙金珍一行来访东胜物联参观交流&#xff0c;并就深化合作进行讨论。 东胜物联与瑞芯微建有长期稳固的合作关系&#xff0c;基于RK3588、RK3399、RK3568等处理器&#xff0c;推出了多款嵌入式核心硬件产品&#xff0c;包括核心板、网关等&a…

工业物联网网关

在数字化浪潮席卷全球的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;作为连接物理世界与数字世界的桥梁&#xff0c;正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽&#xff0c;工业物联网网关发挥着至关重要的作用。今天&#xff0c;我们就来深入了解一下工业…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮&#xff0c;没有一个属于自己的组件库&#xff0c;那岂不是狮子没有了牙齿&#xff0c;士兵没有了武器&#xff0c;姑娘没有了大宝SOD蜜&#xff0c;你没有了我.... 言归正传&#xff0c;下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

【c 语言】声明了一个指针,会给指针分配内存吗?

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…