线性表-顺序存储结构

线性表基本概念:

线性结构的基本特征为:

集合中必存在唯一的一个“第一元素”;

集合中必存在唯一的一个 “最后元素” ;

除最后元素在外,均有 唯一的后继;

除第一元素之外,均有 唯一的前驱。

用ADT表示:

ADT List {数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n,  n≥0 }数据关系:R1={ <ai-1, ai > | ai-1, ai∈D,  i=2,...,n }基本操作:包括结构初始化操作、结构销毁操作、引用型操作、加工型操作
} ADT List

线性表之顺序存储结构操作

通常用数组来描述顺序存储结构,由于线性表的长度可变,所以必须动态分配一维数组。

先用结构体对其进行封装:


//线性表空间的初始存储量
#define LIST_INIT_SIZE 80
//线性表存储空间的分配增量
#define LISTINCREMENT 10typedef int ElemType;typedef struct
{ElemType* elem; //基地址int length;     //当前长度int listsize;   //当前分配的存储容量(sizeof(ElemType)为单位)
}SqList;

然后声明SqList这一数据类型的操作:

void InitList(SqList &L);   //构造空的线性表
void ExtendList(SqList &L); //扩展线性表的容量->增加LISTINCREMENT
int LocateElem(SqList L,ElemType e, bool (*compare)(ElemType, ElemType));   //寻找符合条件的线性表元素
void InsertList(SqList &L, ElemType e, int i);  //插入元素到线性表的某个位置,弟i个位置前
void DeleteList(SqList &L, ElemType &e, int i); //删除线性表元素,并将删除的元素赋给e
void MergeList(SqList a, SqList b, SqList &c);  //将两个增序线性表增序合并

下面进行实现,注意动态内存的分配,要有错误判断:


void InitList(SqList &L)
{L.elem = (ElemType*)malloc( LIST_INIT_SIZE * sizeof(ElemType));if(!L.elem){exit(OVERFLOW);}L.length = 0;L.listsize = LIST_INIT_SIZE;
}void ExtendList(SqList &L)
{ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof (ElemType));if(!newbase){exit(OVERFLOW);}L.elem = newbase;L.listsize += LISTINCREMENT;
}int LocateElem(SqList L, ElemType e,bool (*compare)(ElemType, ElemType))
{int i = 1;  //初始indexElemType *p = L.elem;while(i <= L.length && !compare(*p++, e)){i++;}if(i <= L.length){return i;}else{return 0;}
}void InsertList(SqList &L, ElemType e, int i)
{if(i < 1 || i > L.length + 1){exit(0);}if(L.length + 1 > L.listsize)   //增加一位后超出内存限制{ElemType* newbase = (ElemType*)realloc(L.elem,(L.listsize + LISTINCREMENT)*sizeof(ElemType));if(!newbase){exit(OVERFLOW);}L.elem = newbase;L.listsize += LISTINCREMENT;}ElemType* p = &(L.elem[i-1]);   //插入的位置for(ElemType* q = &(L.elem[L.length - 1]);q >= p;q--){*(q + 1) = *q;}*p = e;L.length++;
}void DeleteList(SqList &L, ElemType &e, int i)
{if(i < 1 || i > L.length){exit(0);}ElemType *p = &(L.elem[i - 1]);e = *p;ElemType *q = &(L.elem[L.length - 1]);p++;for(;p <= q;p++){*(p - 1) = *p;}L.length--;
}void MergeList(SqList a, SqList b, SqList &c)
{ElemType *pa = a.elem;ElemType *pb = b.elem;c.length = a.length + b.length;c.listsize = a.length + b.length;c.elem = (ElemType*)malloc(c.listsize * sizeof (ElemType));ElemType *pc = c.elem;if(!c.elem){exit(OVERFLOW);}ElemType *pa_last = &(a.elem[a.length - 1]);ElemType *pb_last = &(b.elem[b.length - 1]);while(pa <= pa_last && pb <= pb_last){if(*pa >= *pb){*pc++ = *pa++;}else{*pc++ = *pb++;}}while(pa <= pa_last){*pc++ = *pa++;}while(pb <= pb_last){*pc++ = *pb++;}
}

线性表-顺序存储结构相关推荐

  1. 第三章 线性表---顺序存储结构

    线性表(List):零个或多个数据元素的有限序列. 若将线性表记为(a1, ..., ai-1, ai , ai+1 , ..., an),则表中 ai-1 领先于ai , ai领先于ai+1,称ai ...

  2. 使用Java模拟线性表顺序存储结构

    在数据结构中,线性表分两种结构 顺序结构和链表结构 下面使用Java模拟一下顺序结构 主要难点在顺序结构的插入和删除 import java.util.ArrayList;//线性表顺序存储结构 pu ...

  3. 线性表 :: 顺序存储结构的实现

    线性表 :: 顺序存储结构的实现 说明:本文属于读书笔记.笔者将以讲述的方式表达全片文章.故文中提到的某些字词是非正式术语,只是笔者本人的理解性词语. 线性表简介:想要了解点击此处 目录 顺序存储结构 ...

  4. 线性表定义 线性表顺序存储结构

    写在前面:本文章来自于在学习过程中的总结,供大家参考.因水平有限,博客中难免会有不足,恳请大佬们不吝赐教! 文章目录 线性表的定义 线性表的顺序存储结构 线性表顺序存储结构的优缺点 线性表的基本操作 ...

  5. 线性表顺序存储结构操作算法

    线性表顺序存储结构操作算法 ** 顺序表的初始化 线性表的插入算法 线性表的删除算法 线性表的查找算法** 根据书本的知识线性表顺序存储结构的操作算法其实是我们刚进入数据结构与算法的必修课 其实算法无 ...

  6. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  7. 数据结构线性表顺序存储结构和主要算法实现

    (1) 线性表的定义. 零个或多个数据元素的有限序列 序列线性表中有直接后继元素,有且仅有一个直接后继,有且仅有一个直接前驱,数据元素之间的关系是一对一的关系 常用的List操作: Operation ...

  8. 线性表顺序存储结构图书管理

    线性表顺序存储结构图书管理 一开始看书里面的线性表的顺序存储结构,感觉简单,觉得动态链表才能做出一点东西,但是顺序存储不仅于此,也能做出来.顺序结构相比链式结构,内容上有较大差异,各有难点 文章目录 ...

  9. 《数据结构与算法》——线性表顺序存储结构的插入与删除

    什么是线性表? 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之间的关系是一对 ...

最新文章

  1. C/C++ 头文件作用
  2. 修改/etc/sudoers权限后的补救方法
  3. php stock 资料地址
  4. 7.10 枚举——最大公约数和最小公倍数问题
  5. VS2010自定义新建文件模版
  6. uboot中的mmc命令
  7. 前端学习(3345):设计模式之工厂模式2
  8. html列表的三种形式 1128
  9. golang mysql封装_使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)
  10. linux mate桌面主题下载_5个适用于Linux的最佳图标主题
  11. pubmed显示服务器不稳定,你的pubmed又不能显示影响因子了,因为 ……
  12. Win11到底意味着什么
  13. pla3d打印材料密度_FDM 3D打印机最常用的耗材PLA的密度 创想三维
  14. 【IoT】加密与安全:动态密码 OTP 算法详解
  15. 关于使用媒体查询@meda失效原因的总结
  16. 雷电3菊链功能_简单说说雷电接口有哪些用途?
  17. 回溯法,子集选择合集
  18. GKB字符集转UTF-8
  19. 任天堂服务器维护2021,《怪物猎人:崛起》太火爆 任天堂服务器紧急维护
  20. 速卖通自定义html模板,速卖通运费模版如何设置?

热门文章

  1. 虚拟机ping不通本地_虚拟机ping不通主机怎么解决
  2. 详解支持向量机(Support Vector Machine, SVM)
  3. 美国医疗领域IT的9个发展趋势(2005年)
  4. 论程序猿与相声演员的10个共同点
  5. 招商银行2022 FinTech训练营
  6. 利达光电002189中签号公布;002189中签率公布
  7. mysql_不区分大小写
  8. python——PYTHONPATH环境变量设置
  9. 用百度智能小程序SEO获得大量自然流量  站长告诉你如何做优化
  10. websocket实现用户在线管理与心跳检测