一、线性表的定义

线性表(Linear List)是由同一类型元素构成的有序序列的线性结构。线性表中元素的个数称为线性表的长度;线性表内没有元素(长度为0)时,称为空表;表的起始位置称为表头,表的结束位置称为表尾。

线性表的抽象数据类型描述为:

类型名称:线性表(List)

数据对象集:线性表是由n个元素构成的有序序列(a1到an),其中a1是表的第一个元素(表头),an是表的最后一个元素(表尾)。ai+1称为ai的直接后继,ai称为ai+1的直接前驱,直接后继和直接前驱反映了元素之间一对一的邻接逻辑关系。

操作集:对于一个具体的线性表L,其内部有表示位序的整数i以及和其对应的元素x。

二、线性表的顺序存储实现

线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素。在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续的存储区域,因此,用一维数组来表示顺序存储的数据区域是再适合不过了。

考虑到线性表的操作有插入、删除等,及表的长度是动态可变的,因此,数组的容量需设计得足够大。假设用Data[MAXSIZE]表示,其中MAXSIZE是一个根据实际问题定义的足够大的整数,线性表中的数据从Data[0]开始顺序存放。由于当前线性表中的实际元素可能未达到MAXSIZE多个,因此需要用一个变量Last来记录当前线性表中最后一个元素在数组中的位置。即Last起一个指针(实际是数组下标)的作用,始终指向线性表的最后一个元素。表空时Last = -1。

如下图所示,若当前表长为Last +1,数据元素a0,a1......an分别存储在Data[0]到Data[Last]之间。

typedef struct LNode* List;
struct LNode
{
int Data[20];
int lastPosition;//最后一个元素下标值
};

三、线性表的基本操作

3.1 List MakeEmpty():初始化一个新的空线性表

//创建线性表并初始化为空
List MakeEmpty()
{
List L;
L = (List)malloc(sizeof(struct LNode));//申请内存空间
L->lastPosition = -1;//lastPosition置为-1,说明表空
return L;
}

3.2 int FindKth(List L, int P):根据制定的位序P,返回L中相应的元素

//返回指定位置的元素值
int FindKth(List L, int P)
{
if (P > L->lastPosition)
return -1;
else
return L->Data[P];
}

3.3 int Find(List L, int X):返回L中第一个X元素的下标值

//寻找线性表中第一个X的下标
int Find(List L, int X)
{
for (int i = 0; i <= L->lastPosition+1; i++)
{
if (i == L->lastPosition+1)
return -1;//未找到
else if (L->Data[i] == X)
return i;//返回对应下标
}
}

3.4 bool Insert(List L, int P, int X):在L中下标为P的位置插入X

插入元素时,先将线性表长度向后扩展1个元素长,之后将要插入位置及其后面的所有元素均向后移动一位,空出位置后再将新元素插入。

//在下标为P的位置插入X
bool Insert(List L, int P, int X)
{
if (L->lastPosition == 20 || P > L->lastPosition)//如果线性表已满或所插位置不在线性表内,返回false
return false;
L->lastPosition++;//若能插入,线性表长度加1
//从P位置到最后,所有元素均向后移一位
for (int i = L->lastPosition; i > P; i--)
{
L->Data[i] = L->Data[i-1];
}
L->Data[P] = X;//在空出的P位置插入新的元素
return true;
}

3.5 bool Delete(List L, int P):删除L中下标为P的元素

将相应位置元素删除后,原来在其后面的元素均向前移动一位,空出最后一个位置,最后将线性表长度减去1个元素长,删去线性表空余的位置。

//删除下标为P的元素
bool Delete(List L, int P)
{
if (P > L->lastPosition)//如果所删元素位置不在线性表内,返回false
return false;
//将位置P后的元素均向前移一位
for (int i = P; i < L->lastPosition; i++)
{
L->Data[i] = L->Data[i + 1];
}
L->lastPosition--;//成功删除原位置为P的元素,线性表长度减1
return true;
}

3.6 int Length(List L):返回线性表L长度

//返回线性表L长度
int Length(List L)
{
return L->lastPosition + 1;
}

C 线性表的顺序存储实现及插入、删除等操作示例的更多相关文章

  1. 2.2_线性表的顺序存储结构_参考集合ArrayList

    [线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码 C语言版] #define MAXSIZE 20 /*存储空间初始分配量*/ typed ...

  2. 线性表的顺序存储结构——java

    线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素.为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问.java中ArrayL ...

  3. C++编程练习(1)----“实现简单的线性表的顺序存储结构“

    线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...

  4. 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...

  5. C 线性表的链式存储实现及插入、删除等操作示例

    一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...

  6. 【Java】 大话数据结构(1) 线性表之顺序存储结构

     本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...

  7. 线性表的顺序存储结构之顺序表类的实现_Java

    在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...

  8. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  9. 线性表的顺序存储和链式存储的实现(C)

    //线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...

随机推荐

  1. c#pc上测试微信端企业公众商城个人中心链接的工具JMeter

    工具 Apache JMeter  抓包工具,支持回放功能 安装JMeter http://jmeter.apache.org/download_jmeter.cgi    下载页 下边是下载链接 h ...

  2. scrapy Mongodb 储存

    pipelines.py # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your ...

  3. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  4. 解决ubuntu 图标消失问题(ubuntu 16)

    如题,我的ubuntu 16 在安装了新内核并重启之后,所有的图标都消失了. (可能和新内核没有多大关系,我切回旧内核也那样) 是什么bug我不清楚,但是图标原有的位置还是可以点击的,仔细看图标还在, ...

  5. C++重载Level蓝图

    一.从ALevelScriptActor派生自己的类,添加功能并编译. 二.在编辑器中打开level blueprint,然后class default选项卡中,在细节面板中Parent class选 ...

  6. 【Selenium】【BugList10】smtp发送邮件问题汇总:550/535/554

    [场景] 通过126邮箱向QQ邮箱发送HTML格式邮件 [代码1] from email.mime.text import MIMEText from email.header import Head ...

  7. 用angular制作简单的选项卡

    现在angular变得挺火热的,自己也去简单的学习了一下,学了几天下来觉得angular果然好用,但是现在只是停留在比较浅的层面上,要想学好angular还是得下一番功夫的.学了一点新知识就想和大家分 ...

  8. 20175316盛茂淞 2018-2019-2 《Java程序设计》第9周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 下载安装MySQL数据库管理系统. 学习<Java程序设计>第十一章MyS ...

  9. ABP的确认框

    使用之前,是需要添加对abp.sweet-alert.js的引用,否则就无法正常使用. 确认框 abp.message.info('some info message', 'some optional ...

  10. 在香港用什么软件可以唱歌?香港K歌app推荐

    KTV的源头来自于日本,KTV是Karaok TV的缩写.随着互联网时代越来越发达,手机K歌成了很多人会选择的方式,那么在香港有什么好用的K歌软件呢?这里qt6小编给大家推荐几款好用的,让你足不出户即 ...