数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点。

其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如

1、线性表是一个序列,它是有顺序的(排队)

2、第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个)

3、元素是有限的(小学生的个数是有限的)

4、数据类型都相同(都是小学生在排队)

说明白线性表示什么,下面我们直接看线性表的实现

线性表的实现分顺序存储结构链式存储结构


顺序存储结构:

#define LIST_INIT_SIZE  100 //存储空间的初始分配量
#define LISTINCREMENT 10 //分配增量
#define ElemType int //数据类型
typedef struct{
ElemType *elem; //基址
int length; //当前长度
int listsize; //当前分配的存储容量

}SqList;

顺序存储结构

上述只是顺序存储结构的一种写法,最后我还会贴一个用数组实现的写法,这不是主要的问题。

下面我们来看如何初始化一个线性表

1 int InitList(SqList &L){
2 L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//申请一块连续的内存
3 if(!L.elem){
4 return 0;
5 }
6 L.length = 0; //初始化为空表,长度为0
7 L.listsize = LIST_INIT_SIZE; //初始化存储容量
8 }

初始化线性表

我上课用的课本是严蔚敏的《数据结构》(C语言版),在上课听老师讲初始化线性表的代码的时候,当时没看明白,后来才知道,原来课本省略了几行宏定义的代码就是西面这些

1 #define OK 1
2 #define OVERFLOW 0
3 #define Status int

课本省略代码

我觉得加上上述三行代码,大家看起来就应该明白了。

到这里我们会发现,咦,还有一个变量没有使用,那就是分配增量LISTINCREMENT
,下面我们要介绍的操作就会用到它

这个操作就是线性表的插入

顺序结构的插入就好像我们日常在学校体育锻炼签到,我们正在排队,这时候舍友来了,队伍特别长呀,你就悄悄地把他拉到你的前面了,这时候队伍的位置就会发生改变,你和你身后的人都需要往后退一个人的位置

特意用黑体标注出来的就是插入的重点,插入之后的元素要往后移动一个位置。

下面看具体的代码实现

 1 //在i前插入元素e
2 int ListInsert(SqList &L,int i,ElemType e){
3 ElemType *newbase;
4 ElemType *q; //用来表示插入的位置
5 ElemType *p; //移动元素的辅助变量
6
7 if(i<1||i>L.length){
8 return 0;
9 } //判断插入位置的合理性
10
11 if(L.length >= L.listsize){
12 newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
13 //判断原先申请的内存大小是否还能插进元素,若不能,则申请增加内存
14 if(!newbase){
15 return 0;
16 } //申请内存失败
17
18 L.elem = newbase; //改变原来的存储空间基址
19 L.listsize = L.listsize + LISTINCREMENT;
20 //增加存储增量
21 }
22
23 //下面终于到了该插入新元素的时刻了 - -#
24 q = &(L.elem[i-1]); //插入元素之前要先找准位置,注意这边是-1
25 //接下来一步就是我们上面所说的重点了,插入位置之后的元素往后移一步
26 for(p = &(L.elem[L.length-1];p>=q;--p)){
27 *(p+1) = *p;
28 } //这里和我们的正常思维有一点区别,正常来说,我们都是从插队的位置一点一点移动的,
29 //但是,这里为了代码的简便性,我们选择从最后一个开始移动。
30 //这里大家一定要注意的就是,一定要好好理解-1 和+1
31 //循环过后,q以及q身后的元素都已经往后移动了一个位置,此时的q+1即为原先的q,我们只需将现在的q的值覆盖掉即可
32 *q = e;
33 ++L.length; //表长加1
34 return 1; //插入完成
35 }

插入操作

既然说到了插入操作,那么肯定要缺不了线性表的删除操作

这个的重点和插入的类似,不过恰好反了过来,删除之后的元素要往前移动一个位置。

下面看具体代码的实现

 1 int ListDelete(SqList &L,int i,ElemType &e){
2 //删除第i个元素,并赋值给e
3 ElemType *p;
4 ElemType *q;
5
6 if(i<1 || i>L.length){
7 return 0;
8 } //判断i是否在合理范围内
9 p = &(L.elem[i-1]); //要删除的位置
10 e = *p; //将要删除的元素的值赋值给e
11
12 q = L.elem + L.length -1; //获得表尾元素位置,这里要理解指针所指向的内存的操作
13
14 for(;p<=q;++p){
15 *p = *(p+1); //将删除之后的元素向后前移动一个位置
16 }
17
18 --L.length; //表长减1
19 return 1; //删除成功
20 }

删除操作

增删改查,4个操作,我们已经介绍了两个,另外两个我是在是不知道该讲点什么,就直接贴代码了。

这两个操作的代码相对于增删个人感觉要简单些

 1 int ListChange(SqList L,int i,ElemType e){
2 //将第i个元素的数据内容改为e
3 ElemType *p;
4
5 if(i<1 || i > L.length){
6 return 0;
7 } //老规矩,先判断i的合理性
8
9 p = &(L.elem[i-1]); //获得要改变的值得位置
10
11 *p = e; //将值进行修改
12
13 return 1; //修改成功
14 }

修改操作

 1 int ListSearch(SqList L,int i,ElemType &e){
2 //查找第i个元素赋值给e
3 ElemType *p;
4
5 if(i<1 || i > L.length){
6 return 0;
7 } //老规矩,先判断i的合理性
8
9 p = &(L.elem[i-1]); //获得要查找的值得位置
10
11 e = *p; //将值进行传递
12
13 return 1; //查找成功
14 }

查找方法

补充一点东西,就是两个函数,分别是malloc函数和realloc函数

malloc不是一个单词,而是一个缩写,原型是memory allocation,翻译过来意思就是动态分配内存的意思

它的原型应该是void *malloc(size)

void*表示未确定类型的指针,也就是这个函数我们在调用的时候一定要进行强转

失败的时候返回null

realloc函数

作用是改变原有内存的大小

原型void *malloc(要改变的内存的指针名,改变的大小)

使用的时候也一定要强转

失败的时候也是返回null

malloc 和realloc 使用的时候要记得加头文件 #include <stdib.h>
有的编译器是加别的,请百度 - -#

到这里,线性表的顺序存储结构就算是讲完了

最后我们总结下它的优缺点

优:

  • 可以快速的存取表中的任一位置的元素

缺:

  • 插入和删除操作需要移动大量元素

  • 如果线性表的长度变化较大的话,存储空间的容量的大小设置难以确定,同时也有可能造成一定的空间碎片

第一次这样系统的写一个知识点的博客,存在不少问题,大家多多见谅,若发现有问题,请第一时间帮忙给指出,谢谢。

解析来会贴线性表的链式存储结构。

数据结构之线性表(顺序存储结构)

时间: 2024-08-02 13:48:01

数据结构之线性表(顺序存储结构)的相关文章

数据结构之线性表——顺序存储结构(php代码实现)

<?php /**  *  * 线性表:即零个或多个数据元素的有限序列.  * 线性表的数据结构:即数据元素依此存储在一段地址连续的存储单元内.在高级语言中就表现为数组.  *  * 1. DestroyList: 销毁顺序线性表  * 2. ClearList: 将线性表重置为空  * 3. ListEmpty: 判断线性表是否为空  * 4. ListLength: 返回线性表的长度  * 5. GetElem: 返回线性表中第$index个数据元素  * 6. LocateElem: 返回

数据结构——线性表顺序存储结构

 关于线性表 线性表是零个或者多个数据元素的集合.它主要有以下三个特征: 1:线性表的数据元素之间是有顺序的. 2:线性表中数据元素个数是有限的. 3:线性表中数据元素数据类型是相同的. 关于线性表的操作,主要有 创建线性表.销毁线性表.清空线性表.将元素插入线性表.将元素从线性表中删除.获取线性表中某个位置的元素.获取线性表的长度. 线性表主要有两种存储结构: 1:线性表的顺序存储结构,c语言中的数组及采用这种方式. 2:线性表的链式存储结构. 关于顺序存储结构 定义: 是指用一段地址连续的内

数据结构与算法-线性表顺序存储结构删除操作的实现

这一章节我们来看一下线性表顺序存储结构删除操作的简单实现 package com.ray.testobject; public class Test { private Object[] list; public Object[] getList() { return list; } /** * 初始化list * * @param num * 元素个数 */ private void iniList(int num) { list = new Object[num]; for (int i =

数据结构与算法-总结线性表顺序存储结构的优缺点

这一章节主要总结线性表顺序存储结构的优缺点. 在总结之前,我们来讨论一下线性表顺序存储结构的执行方法的时间复杂度: 存储.读取:O(1) 插入.删除:O(n) 优点: 1.无需为表中的逻辑关系增加额外的存储空间 2.可以快速存取表中对象 缺点: 1.插入和删除需要移动大量的对象 2.存储设备的碎片化 3.当线性表过大的时候,很难确定长度 版权声明:本文为博主原创文章,未经博主允许不得转载.

线性表顺序存储结构的c语言实现

线性表顺序存储结构用C实现的操作 <1>声明一个线性表的顺序存储结构 <2> 初始化顺序线性表 <3>判断是否为空 <4>清空列表 <5>返回当前长度(线性表内元素个数) <6>返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 <7>返回L中第1个与e满足关系的数据元素的位序.若这样的数据元素不存在,则返回值为0 <8>在L中第i个位置之前插入新的数据元素e,L的长度加1 <9>

线性表—顺序存储结构

线性表——顺序存储结构 我理解的顺序存储就是 存储的一组元素在内存中呈线性排列,地址相邻,就像火车一样,每个车厢都可以看做是一个元素,元素门内首尾相连且地址相邻,书看的是高一凡老师的书,学完后自己写一下总结和体会,一来加深印象,二来可以方便自己复习. 顺序存储结构似乎都是用数组来实现的,也就是以数组为核心,外面加了许多很方便的操作(函数)进行封装,然后就说这叫[顺序存储结构]——数组的深加工之后的产品 顺序存储结构的基本功能有以下几个: name:     sqlist private: T *

线性表-顺序存储结构

线性表-顺序存储结构 顺序存储结构 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素 三个属性 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置 线性表的最大存储容量:数组的长度MaxSize 线性表的当前长度:length 数据长度和线性表长度的区别 数据长度就是数组的长度,存放线性表的存储空间的长度,存储分配后这个量一般是不变的 线性表长度是线性表中数据元素的个数,随着线性表的删除插入操作,这个长度是改变的 在任何时刻,数组的长度大于等于线性表

数据结构例程——线性表顺序存储的应用

本文是数据结构基础系列网络课程(2):线性表中第6课时线性表顺序存储的应用中所讲的例程. 例:删除元素 问题:已知长度为n的线性表A采用顺序存储结构,设计算法,删除线性表中所有值为x的数据元素. 要求:时间复杂度为O(n).空间复杂度为O(1)的算法 解法0:用基本运算实现,不满足复杂度要求 (注:本文中所需要的list.h和list.cpp见点击参照-) #include "list.h" #include <stdio.h> void delnode1(SqList *

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

本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述> 1.1 线性表简介 线性表是0个或多个元素的有限序列.即元素之间有顺序且有限.假设表中有元素A1,A2,A3,....,AN,若存在1<i<N,则 Ai 是 Ai-1的直接后继,Ai-1 是Ai的直接前驱.作为线性表,必须满足A1没有前驱,AN没有后继(有限性).N是线性表的长度.当N=0时,即表中没有任何元素也即空表. 1.2 线

数据结构与算法——线性表顺序存储结构

今天总结一下数据结构中的线性表中的顺序存储结构,这是一种比较简单的结构. 首先,看一下什么是线性表. 什么是线性表? 线性表是一种简单的数据结构,数据元素之间是一对一的关系,即除了第一个和最后一个元素外其余元素都是首尾相接的.元素的个数称为线性表的长度,长度为零则表示线性表为空. 什么是线性表的循序存储结构? 线性表中的顺序存储结构就是把线性表中的元素按逻辑次序依次存放在一组地址连续的存储空间中,也把这种线性表称为顺序表.根据顺序表的特点,通常是用数组来存储元素的. 下面就看具体的实现(C++)