线性表的顺序存储结构

第一章 线性表的顺序存储结构


文章目录

  • 线性表的顺序存储结构
  • 前言
  • 一、顺序存储结构的建立
    • 1.条件
    • 2.代码
  • 二、顺序存储结构的获得元素
    • 1.条件
    • 2.代码
  • 三、顺序存储结构的插入
    • 1.条件
    • 2.代码
  • 四、顺序存储结构的删除
    • 1.条件
    • 2.代码
  • 五、总代码
  • 总结

前言

数据结构是大学里计算机专业类必掌握的一门课程,它很重要,尤其是对一些考研的计算机类学生来说,通常为专业课。数据结构并不是哪种编程语言所设定的,它可以用c语言来写,也可以用c++、java、python等等,学会了一门编程语言,仅仅只是掌握一些,而学会了数据结构可以掌握很多技巧和算法并不断提高编程能力,这对将来很重要。


提示:本系列文章均使用Visual Studio 2019编程,编程语言为c语言。

一、顺序存储结构的建立

1.条件

设顺序线性表L,n为数据元素,则1 ≦ n ≦ ListLength(L),这里解释一下这个闭区间,首先我们知道线性表是从1开始的,而不是像数组从0开始,这点要知道,所以n的值不能小于1,并且不能大于该线性表的长度。
我们设该线性表的存储空间为20,即#define MAXSIZE 20,然后假设ElemType为int类型,使用一个结构体,定义一个data数组来存储数据元素,length为当前长度。
即,我们可知道建立一个顺序线性表有三个要点:
①首先要定义其最大存储量
②存储空间
③线性表的当前长度

2.代码

#include <stdio.h>
#define MAXSIZE 20            //设定存储空间初始分配量
//顺序存储结构的建立
typedef int ElemType;
typedef struct
{ElemType data[MAXSIZE];   //数组存储数据元素,最大值为MAXSIZEint length;               //线性表当前长度
}SqList;

二、顺序存储结构的获得元素

1.条件

首先这里返回值类型Status是一个int整型,返回OK代表1,返回ERROR代表0。我们要实行GetElem操作,即将顺序线性表L的第i个元素值返回,因为数组是从0开始的,代码中只要n的数值在所定义的数组下标的范围内,把数组n-1下标的值返回。
即,我们可知道顺序线性表获得元素有两个要点:
①判断语句
②返回值

2.代码

#include <stdio.h>
#define MAXSIZE 20            //设定存储空间初始分配量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
//顺序结构的获得元素操作
Status GetElem(SqList L, int n, ElemType* e)    //Status是函数类型,其值是函数结果状态代码,例OK等;
{                                               //SqList L为该线性表;int n为索引位置;ElemType*e为指针直接访问地址if (L.length == 0 || n<1 || n>L.length)     //线性表的长度不为0;线性表是从1访问的,而不是0;索引位置不能大于线性表的长度return ERROR;        //以上均返回错误*e = L.data[n-1];        //若满足以上条件,则将线性表L中的第n个位置元素值返回,即只要n的数值在数组下标范围内,就将数组第n-1下标的值返回return OK;
}

三、顺序存储结构的插入

1.条件

设k为当前位置,首先判断线性表是否已满,再对插入位置进行判断,然后判断插入位置是否在表尾,从而执行不同操作,若不在表尾,通过for语句遍历,将要插入的位置后的数据元素向后移动一位;若在表尾,则直接插入新元素,当前长度++。
即,顺序线性表插入元素有五个要点:
①若插入位置不合理,抛出异常
②判断语句
③从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
④将要插入元素插入位置i处
⑤表长加1

2.代码

//顺序结构的插入操作
typedef int Status;
Status ListInsert(SqList* L, int n, ElemType e)
{int k;                          //k为当前位置if (L->length == MAXSIZE)       //当顺序线性表存储已满返回错误  return ERROR;    if (n<1 || n>L->length + 1)    //插入位置小于1、大于当前长度加一则返回错误return ERROR;if (n <= L->length)            //若插入位置不在线性表表尾,执行以下操作,将要插入的位置后数据元素向后移动一位{for (k = L->length - 1; k >= n - 1; k--)    //遍历从i索引位置到线性表长度的每个数据元素,将其全部向后移动一位L->data[k + 1] = L->data[k];           }//若插入位置在表尾,执行插入新元素操作L->data[n - 1] = e;             //[i-1]是因为顺序表位置-1=数组下标,数组从0开始,顺序表从1开始L->length++;return OK;
}

四、顺序存储结构的删除

1.条件

设k为当前位置,首先判断线性表是否为空表,再判断删除元素长度,用指针取出所要删除的数据元素,然后再判断删除位置是否在表尾,若不在表尾,通过for语句遍历,将要删除的位置后数据元素向前移动一位;若在表尾,则删除该元素,当前长度- -。
顺序线性表删除元素有四个要点:
①若删除位置不合理,抛出异常
②取出删除元素
③从删除元素位置开始遍历到最后一个元素位置,将它们向前移动一位
④表长减1

2.代码

//顺序结构的删除操作
typedef int Status;
Status ListDelete(SqList* L, int n, ElemType* e)
{int k;                    //k为当前位置if (L->length == 0)       //若线性表为空,即空表,则返回错误return ERROR;if (n<1 || n>L->length)   //当删除元素小于1,大于当前长度,删除位置不正确返回错误return ERROR;*e = L->data[n - 1];      //e相当于回收站,将要删除的元素位置放到e中;*e表示取指针e所指地址存储的值;线性表中第n个值相当于数组data[n-1]if (n < L->length)        //若删除操作不是最后位置,执行以下操作,将要删除的位置后数据元素向前移动一位{for (k = n; k < L->length; k++)    //遍历从n索引位置到线性表长度的每个数据元素,将其全部向后移动一位L->data[k - 1] = L->data[k];}L->length--;             return OK;
}

五、总代码

//线性表顺序存储结构
#include <stdio.h>
#define MAXSIZE 20            //设定存储空间初始分配量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0//顺序存储结构的建立
typedef int Status;
typedef int ElemType;
typedef struct
{ElemType data[MAXSIZE];   //数组存储数据元素,最大值为MAXSIZEint length;               //线性表当前长度
}SqList;//顺序结构的获得元素操作
Status GetElem(SqList L, int n, ElemType* e)    //Status是函数类型,其值是函数结果状态代码,例OK等;
{                                               //SqList L为该线性表;int n为索引位置;ElemType*e为指针直接访问地址if (L.length == 0 || n<1 || n>L.length)     //线性表的长度不为0;线性表是从1访问的,而不是0;索引位置不能大于线性表的长度return ERROR;        //以上均返回错误*e = L.data[n-1];        //若满足以上条件,则将线性表L中的第n个位置元素值返回,即只要n的数值在数组下标范围内,就将数组第n-1下标的值返回return OK;
}//顺序结构的插入操作
Status ListInsert(SqList* L, int n, ElemType e)
{int k;                          //k为当前位置if (L->length == MAXSIZE)       //当顺序线性表存储已满返回错误  return ERROR;    if (n<1 || n>L->length + 1)    //插入位置小于1、大于当前长度加一则返回错误return ERROR;if (n <= L->length)            //若插入位置不在线性表表尾,执行以下操作,将要插入的位置后数据元素向后移动一位{for (k = L->length - 1; k >= n - 1; k--)    //遍历从i索引位置到线性表长度的每个数据元素,将其全部向后移动一位L->data[k + 1] = L->data[k];           }//若插入位置在表尾,执行插入新元素操作L->data[n - 1] = e;             //[i-1]是因为顺序表位置-1=数组下标,数组从0开始,顺序表从1开始L->length++;return OK;
}//顺序结构的删除操作
Status ListDelete(SqList* L, int n, ElemType* e)
{int k;               //k为当前位置if (L->length == 0)       //若线性表为空,即空表,则返回错误return ERROR;if (n<1 || n>L->length)   //当删除元素小于1,大于当前长度,删除位置不正确返回错误return ERROR;*e = L->data[n - 1];      //e相当于回收站,将要删除的元素位置放到e中;*e表示取指针e所指地址存储的值;线性表中第n个值相当于数组data[n-1]if (n < L->length)        //若删除操作不是最后位置,执行以下操作,将要删除的位置后数据元素向前移动一位{for (k = n; k < L->length; k++)    //遍历从n索引位置到线性表长度的每个数据元素,将其全部向后移动一位L->data[k - 1] = L->data[k];}L->length--;             return OK;
}

总结

以上就是本次的笔记内容,本文仅仅通过文字和代码简单介绍了顺序存储结构的各项操作,建议自己分析总结其各个操作并结合自己的编程能力选择编程语言再写一遍代码从而加深印象。


附:在下一文章会介绍线性表链式存储结构的各项操作,持续更新ing……

《数据结构》c语言版学习笔记——线性表的顺序存储结构相关推荐

  1. 邓公数据结构C++语言版学习笔记1

    1. 对于计算幂2n2^n2n的算法优化 暴力算法时间复杂度O(n)O(n)O(n) __int64 power2BF_I(int n) //幂函数2^n算法(蛮力迭代版),n >= 0{ __ ...

  2. c语言实现顺序存储程序,线性表的顺序存储结构动态态分配C语言实现

    线性表的顺序存储结构动态态分配C语言实现 线性表的顺序存储结构动态态分配C语言实现 初始化执行期间通过malloc函数为数组申请空间,程序运行期间若空间不够可通过realloc函数在保留原存储值的前提 ...

  3. 邓公数据结构C++语言版学习笔记——二叉树

    二叉树的遍历 一. preorder--先序遍历VLR 1. 递归先序遍历 2. 迭代先序遍历 3.先序遍历图解 二. inorder--先序遍历LVR 1. 递归中序遍历 2.迭代中序遍历 3.迭代 ...

  4. 数据结构与算法:一、线性表的顺序存储结构SeqList和链式存储结构LinkList

    实现了线性表的链式存储结构和线性存储结构,能进行插入元素O(n),删除元素O(n),查找元素O(n)和返回线性表长度O(1)的操作.其中链式存储结构使用了C++11的智能指针进行内存管理. 要点:链式 ...

  5. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  6. 数据结构学习笔记——线性表逻辑结构和顺序存储结构

    2.1线性表的逻辑结构  线性表的数据元素的特点:同一数据类型 一.线性表的逻辑定义 线性表是由n个数据元素(结点)a1,a2,-,an组成的有限序列. 二.线性表的基本运算 2.2线性表的顺序存储结 ...

  7. 【数据结构】线性表的顺序存储结构及实现——C语言版

    文章目录 顺序表 1. 顺序表的存储结构定义 2. 顺序表的实现 2.1 初始化顺序表 2.2 建立顺序表 2.3 销毁顺序表 2.4 判空操作 2.5 求顺序表的长度 2.6 遍历操作 2.7 按值 ...

  8. 线性表的顺序存储结构(C语言版)

    #include <stdio.h> #include <stdlib.h>#define OK 0 #define ERROR -1 // 分配存储空间的初始长度 #defi ...

  9. 线性表之顺序存储结构相关算法学习

    作为一名准备干一辈子的程序员,学习算法还是很有必要的.所以从基础开始了.学习教材 是大话数据结构. 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素.代码 参照教材 采用c ...

最新文章

  1. mysql 安装 注意点
  2. gzip android,怎么在Android系统中使用gzip进行数据传递
  3. jQuery.extend() 使用语法详解
  4. 如何看待阿里巴巴推荐的Python400集视频?零基础入门学习Python
  5. 华为取代苹果 手机销量再创新高
  6. element el-upload上传图片完成后隐藏上传
  7. flash 与javascrip的t交互和注意事项
  8. MYSQL 用户的操作
  9. 外设适配-TI954 记录
  10. 张雨石:关于深度学习中的dropout的两种理解
  11. 机器人技术之Simulink仿真基础
  12. Springboot结合ESAPI——配置XSS防御过滤
  13. B站 郝斌C语言 课件+笔记 (全)
  14. fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
  15. linux下玩三国志游戏,三国志威力无双手游官网版
  16. 【JSP笔记02】JSP注释、脚本、表达式、JSP三大指令、JSP七大动作的介绍及使用
  17. c语言编计分秒时的程序,用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。...
  18. 你应该会喜欢的5个自定义 Hook
  19. element table 表格实现上移、下移
  20. 基于LBS任务式旅游APP

热门文章

  1. 干货!Elasticsearch性能优化实战指南
  2. 深度解密Go语言之pprof
  3. 来自技术人的呐喊:回归本心,远离内卷
  4. 音视频技术开发周刊 | 180
  5. 用AI击破传统行业痛点 “百度大脑行业创新论坛”将提7大行业解决方案
  6. RealNetworks创始人Rob Glaser:为什么我们在中国取得成功?
  7. concurrent map使用
  8. 自动化运维之 部署Saltstack 并批量部署 Nginx
  9. Google深度揭秘TPU:一文看懂内部原理,以及为何碾压GPU
  10. java小编程----给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。