数据结构—线性表的顺序存储
一、线性表
- 线性表:零个或多个数据元素的有限序列。
- 首先它是一个序列,也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最以后一个元素无后继,其他每个元素都有且一个前驱和后继。
二、线性表的顺序存储结构
- 线性表的顺序存储结构,指的是用一段地址连续的 存储单元依次存储线性表的数据元素。
- 简单说就是在内存中找了一块地方,通过占位的形式,把一定内存空间给占了。
- 顺序存储结构的三个属性:
- 存储空间的起始位置
- 线性表的最大存储空间
- 线性表当前长度(元素的个数)
三、顺序存储结构的实现
#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.初始化 2.插入新元素 (1)在开头插入新元素 (2)在结尾插入新元素 (3)在任意处插入新元素 2.删除元素 (1)开头删除 (2)尾部删 ...
- delphi7存储过程传入数组_数据结构线性表之顺序存储 类的封装
自己编程也挺久的了,然而数据结构这块是很弱的部分,然而这个东西对编程又异常重要,虽然这么久我一直没感受到.所以最近集中学习一下.正好手里有一本大话数据结构,就按照该书的顺序往下学习. 开始学习之前,要 ...
- 数据结构-线性表的顺序存储结构逆置
1.主要的操作是:对顺序存储的线性表进行逆置操作. 2.空表为0时,或超过100个元素时,不执行程序. 自学c语言,有任何问题,还望大佬们指教. 以下是代码: #include <stdio.h ...
- 【数据结构】之线性表(顺序存储结构)
博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/ ...
- 数据结构和算法:(3)3.1线性表的顺序存储结构
-----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...
- 《数据结构》c语言版学习笔记——线性表的顺序存储结构
线性表的顺序存储结构 第一章 线性表的顺序存储结构 文章目录 线性表的顺序存储结构 前言 一.顺序存储结构的建立 1.条件 2.代码 二.顺序存储结构的获得元素 1.条件 2.代码 三.顺序存储结构的 ...
- 实验一 线性表的顺序存储与实现_程序员:数据结构与算法,线性表介绍
线性表 线性表(list):零个或多个数据元素的有限序列. 举个例子:一个班的小朋友,一个跟着一个排队,当中的每个小朋友都知道他前面的是谁,后面的是谁,如同一根线把他们串联起来.就可以称之为线性表. ...
- 数据结构之线性表之顺序存储结构(3)
1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数 ...
- 第三章 数据结构 线性表的逻辑结构 和 线性表的顺序存储结构,链式存储结构
文章目录 线性表的特点 引用 集合与线性表的区别在于元素是否可以重复. 线性表的顺序存储结构 顺序存储的优缺点: 一维数组来表示顺序表的数据存储区域. 线性表的链式存储结构 链式存储的优缺点 线性表的 ...
最新文章
- 收藏喜+1!值得使用的100个Python小技巧
- 一个web左侧菜单例子
- SpringBoot整合RabbitMQ-消息可靠性投递
- 使用faker生成测试数据
- dedecms织梦第三方登录插件-QQ登录、微博登录、微信登录
- drools规则拼接_Drools-规则层次结构和条件执行
- 学编程的人不能不看的好文章啊!!
- 安装mysql5.7数据库_使用MySQL的yum源安装MySQL5.7数据库的方法
- 详解浪潮与Odoo联手背后 双方将带来哪些化学反应?
- JELLY技术周刊 Vol.24 -- 技术周刊 · 实现 Recoil 只需百行代码?
- 微信小程序获取当前地址以及选择地址详解
- rowid会变化么_基情满满!美团amp;饿了么外卖小哥组CP出道
- 计算机动画 vr技术应用,三维动画与VR交互和虚拟现实性技术的结合
- jq滚动小插件superslide2,的确是很强悍的
- Linux-Ngrok内网穿透
- C语言(四):程序流程结构
- 用java生成一个简单的二维码
- cs进销存管理系统服务器,CS模式的进销存管理系统--非常好.doc
- UART 相关的概念
- 如何在WordPress主机上搭建网站?