一、线性表

  1. 线性表:零个或多个数据元素的有限序列。
  2. 首先它是一个序列,也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最以后一个元素无后继,其他每个元素都有且一个前驱和后继。

二、线性表的顺序存储结构

  1. 线性表的顺序存储结构,指的是用一段地址连续的 存储单元依次存储线性表的数据元素。
  2. 简单说就是在内存中找了一块地方,通过占位的形式,把一定内存空间给占了。
  3. 顺序存储结构的三个属性:
    1. 存储空间的起始位置
    2. 线性表的最大存储空间
    3. 线性表当前长度(元素的个数)

三、顺序存储结构的实现

#include <stdio.h>
#include <stdlib.h>/** 定义宏* LIST_LENGTH :存放初始长度* LIST_CREMENT :存放每次申请空间的大小
*/
#define LIST_LENGTH 100
#define LIST_CREMENT 20// 类型重定义
typedef int tElem;      // 线性表元素的数据类型
typedef tElem * pElem;  // 元素指针
typedef struct List {pElem elem;         // 线性表存储元素int listLength;     // 线性表的长度int listSize;       // 线性表的空间大小
} List;
typedef enum Status     // 枚举数据
{ok = 1,Error = 0
} Status;/** 初始化线性表* 步骤:*  使用 malloc 为线性表申请空间*  判断是否申请成功*  对线性表的长度和空间进行初始化
*/
Status InitList(List * l)
{l->elem = (pElem) malloc(sizeof(tElem) * LIST_LENGTH);if(l->elem == 0){printf("空间申请失败!");return Error;}l->listLength = 0;l->listSize += LIST_LENGTH;
}/** 判断线性表长度* 步骤:*  长度为 0 输出线性表为空*  否则输出线性表的长度
*/
void ListEmpty(List * l)
{if(l->listLength == 0){printf("线性表为空 \n");}else{printf("线性表的长度为 %d\n",l->listLength);}
}/** 在线性表的第 i 个位置插入元素 e* 步骤:*  判断参数是否合法,若位置 i 小于 0 或大于线性表的长度,则参数不合法。*  判断空间是否充足,用线性表长度和空间作比较,若长度大于或等于线性表的空间则表示空间不足,使用 realloc 重新为线性表申请空间。*  判断空间是否申请成功,若成功则修改线性表的空间大小。*  遍历线性表,将元素插入线性表中。*  修改线性表的长度,长度自增*
*/
Status ListInsert(List * l,int i,tElem e)
{if(i < 0 || i > l->listLength){printf("ListInsert() 参数错误!\n");return Error;}if(l->listLength >= l->listSize){l->elem = (pElem) realloc(l,sizeof(tElem) * LIST_CREMENT);if(l->elem == 0){printf("空间申请失败!");return Error;}else{l->listSize += LIST_CREMENT;}}for(int j = l->listLength; j > i; j++){l->elem[j] = l->elem[j - 1];}l->elem[i] = e;l->listLength++;return ok;
}/** 获取第 i 个元素* 步骤:*  判断参数是否合法,若位置 i 小于 0 或大于线性表的长度,则参数不合法。*  打印第 i 个元素
*/
Status GetElem(List * l,int i)
{if(i < 0 || i > l->listLength){printf("ListInsert() 参数错误!\n");return Error;}printf("线性表第 %d 个元素是 %d\n",i,l->elem[i]);return ok;
}/** 获取元素 e 前一个元素* 步骤:*  初始化一个位置 i = -1,遍历线性表获取元素 e 的位置*  判断 i 的值:*      i = -1 表示元素 e 不在线性表中;*      i = 0 表示元素 e 是线性表的第一个元素,无前一个元素;*      否则打印元素 e 前一个元素
*/
Status PriorElem(List * l,tElem e)
{int i = -1;for(int j = 0; j < l->listLength; j++){if(l->elem[j] == e) i = j;}if(i == -1){printf("元素 %d 不在线性表中!\n",e);return Error;}else if (i == 0){printf("元素 %d 是线性表的第一个元素,无前一个元素!\n",e);return Error;}else{printf("元素 %d 的前一个元素是:%d\n",e,l->elem[i-1]);return ok;}
}/** 获取元素 e 的后一个元素* 步骤:*  初始化一个位置 i = -1,遍历线性表获取元素 e 的位置*  判断 i 的值:*      i = -1 表示元素 e 不在线性表中;*      i 等于线性表长度减 1 表示元素 e 是线性表的最后一个元素,无后一个元素;*      否则打印元素 e 后一个元素
*/
Status NextElem(List * l,tElem e)
{int i = -1;for(int j = 0; j < l->listLength; j++){if(l->elem[j] == e) i = j;}if(i == -1){printf("元素 %d 不在线性表中!\n",e);return Error;}else if (i == l->listLength - 1){printf("元素 %d 是线性表的最后一个元素,无后一个元素!\n",e);return Error;}else{printf("元素 %d 的后一个元素是:%d\n",e,l->elem[i+1]);return ok;}
}/** 遍历线性表* 步骤:*  判断线性表是否为空表。*  循环遍历,输出线性表索引和元素。
*/
void ListTraverse(List * l)
{if(l->listLength > 0){for(int i = 0; i < l->listLength; i++){printf("线性表的第 %d 个元素是:%d\n",i,l->elem[i]);}}else{printf("线性表为空!\n");}
}/** 删除第 i 个元素* 步骤:*  判断参数是否合法,若位置 i 小于 0 或大于线性表的长度,则参数不合法。*  遍历 i 后面线性表,用后一个元素替代前一个元素。*  修改线性表的长度。
*/
Status ListDelete(List * l,int i)
{if(i < 0 || i > l->listLength){printf("ListInsert() 参数错误!\n");return Error;}for(int j = i; j < l->listLength; j++){l->elem[j] = l->elem[j + 1];}l->listLength --;return ok;
}/** 清空线性表* 步骤:*  修改线性表的长度为 0
*/
void ClearList(List * l)
{l->listLength = 0;
}/** 销毁线性表* 步骤:*  释放线性表空间。*  修改线性表的长度为 0*  修改线性表空间大小为 0
*/
void DestroyList(List * l)
{free(l->elem);l->listLength = 0;l->listSize = 0;
}int main() {List plist;// 初始化线性表InitList(&plist);// 判断线性表的长度printf("第一次判断线性表的长度:");ListEmpty(&plist);printf("\n");// 插入元素ListInsert(&plist,0,12);ListInsert(&plist,1,23);ListInsert(&plist,2,34);printf("第二次判断线性表的长度:");ListEmpty(&plist);printf("\n");// 获取第 i 个元素GetElem(&plist,1);printf("\n");// 获取元素 e 的前一个元素PriorElem(&plist,10);PriorElem(&plist,12);PriorElem(&plist,34);printf("\n");// 获取元素 e 的后一个元素NextElem(&plist,10);NextElem(&plist,34);NextElem(&plist,12);printf("\n");// 遍历线性表ListTraverse(&plist);printf("\n");// 删除第 i 个元素ListDelete(&plist,0);ListTraverse(&plist);printf("\n");// 清空线性表ClearList(&plist);ListTraverse(&plist);printf("\n");DestroyList(&plist);ListTraverse(&plist);printf("\n");return 0;
}

数据结构—线性表的顺序存储相关推荐

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

    目录 定义 线性表的顺序存储的结构代码 所应具备的功能 1.初始化 2.插入新元素 (1)在开头插入新元素 (2)在结尾插入新元素 (3)在任意处插入新元素 2.删除元素 (1)开头删除 (2)尾部删 ...

  2. delphi7存储过程传入数组_数据结构线性表之顺序存储 类的封装

    自己编程也挺久的了,然而数据结构这块是很弱的部分,然而这个东西对编程又异常重要,虽然这么久我一直没感受到.所以最近集中学习一下.正好手里有一本大话数据结构,就按照该书的顺序往下学习. 开始学习之前,要 ...

  3. 数据结构-线性表的顺序存储结构逆置

    1.主要的操作是:对顺序存储的线性表进行逆置操作. 2.空表为0时,或超过100个元素时,不执行程序. 自学c语言,有任何问题,还望大佬们指教. 以下是代码: #include <stdio.h ...

  4. 【数据结构】之线性表(顺序存储结构)

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  5. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  6. 《数据结构》c语言版学习笔记——线性表的顺序存储结构

    线性表的顺序存储结构 第一章 线性表的顺序存储结构 文章目录 线性表的顺序存储结构 前言 一.顺序存储结构的建立 1.条件 2.代码 二.顺序存储结构的获得元素 1.条件 2.代码 三.顺序存储结构的 ...

  7. 实验一 线性表的顺序存储与实现_程序员:数据结构与算法,线性表介绍

    线性表 线性表(list):零个或多个数据元素的有限序列. 举个例子:一个班的小朋友,一个跟着一个排队,当中的每个小朋友都知道他前面的是谁,后面的是谁,如同一根线把他们串联起来.就可以称之为线性表. ...

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

    1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数 ...

  9. 第三章 数据结构 线性表的逻辑结构 和 线性表的顺序存储结构,链式存储结构

    文章目录 线性表的特点 引用 集合与线性表的区别在于元素是否可以重复. 线性表的顺序存储结构 顺序存储的优缺点: 一维数组来表示顺序表的数据存储区域. 线性表的链式存储结构 链式存储的优缺点 线性表的 ...

最新文章

  1. 收藏喜+1!值得使用的100个Python小技巧
  2. 一个web左侧菜单例子
  3. SpringBoot整合RabbitMQ-消息可靠性投递
  4. 使用faker生成测试数据
  5. dedecms织梦第三方登录插件-QQ登录、微博登录、微信登录
  6. drools规则拼接_Drools-规则层次结构和条件执行
  7. 学编程的人不能不看的好文章啊!!
  8. 安装mysql5.7数据库_使用MySQL的yum源安装MySQL5.7数据库的方法
  9. 详解浪潮与Odoo联手背后 双方将带来哪些化学反应?
  10. JELLY技术周刊 Vol.24 -- 技术周刊 · 实现 Recoil 只需百行代码?
  11. 微信小程序获取当前地址以及选择地址详解
  12. rowid会变化么_基情满满!美团amp;饿了么外卖小哥组CP出道
  13. 计算机动画 vr技术应用,三维动画与VR交互和虚拟现实性技术的结合
  14. jq滚动小插件superslide2,的确是很强悍的
  15. Linux-Ngrok内网穿透
  16. C语言(四):程序流程结构
  17. 用java生成一个简单的二维码
  18. cs进销存管理系统服务器,CS模式的进销存管理系统--非常好.doc
  19. UART 相关的概念
  20. 如何在WordPress主机上搭建网站?

热门文章

  1. 小米手机USB调试安装必须安装SIM卡
  2. 人才缺口达30万!程序员拿下这个证书有多吃香?!
  3. Linux如何查看目录大小
  4. 爬虫(8)-Scrapy爬取微博用户粉丝,关注和微博内容
  5. 信息与通信基础第3次小班讨论课
  6. 史上最全交叉熵损失函数详解
  7. 谷歌浏览器安装Postman插件(2020亲测)
  8. int转string的多种方式
  9. PC_app自动化程序测试(一)
  10. 抓取微信小程序源码并反编译(蓝叠模拟器)