学习 线性表的顺序存储 总结一
2015-09-10 22:21
381 查看
学习 线性表的顺序存储 总结一
线性表是最简单的一种数据结构了,也是最常用的一种。线性表的逻辑结构简单,便于实现和操作。线性表有以下两个特点:1. 它首先是个序列,元素之前是有顺序的。
2. 数据元素之间的关系是一对一的,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
线性表的元素个数n定义为线性表的长度。
线性表的顺序存储定义
线性表的顺序存储:用一段地址连续的存储单元依次存储线性表的数据元素。线性表的顺序存储结构代码如下:#define MAXSIZE 20 typedef int ElemType typedef struct { ElemType data[MAXSIZE]; int length; }SqList;
由以上定义,可以发现线性表的顺序存储有下面三个属性:
1. 存储空间的起始位置—数组data
2. 线性表顺序存储的最大存储容量
3. 线性表顺序存储的当前长度length
下面把线性表的顺序存储记为顺序表。并学习顺序表的一些基本操作:顺序表的初始化、建立、查找、插入、删除等。
// 顺序表的初始化 SqList Init() { SqList L; L.length = 0; return L; }
// 顺序表的建立 SqList Create(SqList L) { int i; srand((unsigned)time(NULL); for (i = 0; i < 100; i++) { L.data[i] = rand() % 100; L.length++; } return L; }
// 顺序表的查找 int GetElem(SqList L, int i, ElemType* e) { if (L.length == 0 || i < 1 || i > L.length) { return ERROR; } *e = L.data[i - 1]; return OK; }
// 顺序表的插入 int ListInsert(SqList* L, int i, ElemType e) { int k; if (L->length == MAXSIZE) return ERROR; if (i < 1 || i > L->length + 1) return ERROR; if (i <= L->length) { for (k = L->length -1; k >= i - 1; k--) { L->data[k + 1] = L->data[k]; } } L->data[i - 1] = e; L->length++; return OK; }
// 顺序表的删除 int ListInsert(SqList* L, int i, ElemType* e) { int k; if (L->length == 0) return ERROR; if (i < 1 || i > L->length) return ERROR; *e = L->data[i - 1]; if (i < L->length) { for (k = i; k >= L->length; k++) { L->data[k - 1] = L->data[k]; } } L->length--; return OK; }
顺序表的插入或删除操作,时间复杂度都是O(n). 而存和读数据操作,不管是哪个位置,时间复杂度为O(1).
下面总结下顺序表的优缺点:
好吧,从优点开始说。当我们在使用线性表的时候,我们不需要为表中元素之间的逻辑关系而增加额外的存储空间,而且可以快速的存取表中任意位置的元素。接下来谈谈缺点。如我们所见,如果我们要插入或者删除的元素是在第一个位置,那么无疑的,我们需要移动大量的元素来完成这样的操作,而且限于线性表长度必须小于数组长度,如果我们需要插入大量数据,那么很难保证空间是否充足,而如果我们要删除大量数据的时候,无疑又会造成空间的浪费。
参考文档:
《数据结构》/article/1307886.html
相关文章推荐
- 探索大数据之如何挖掘社交网络
- MySQL常用命令总结(1)
- 初级程序员学习网址搜集(持续更新)
- 上下文菜单与上下文操作模式
- 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock
- 0909编译原理
- 软件架构设计---基于鲁棒图进行设计
- C++ list函数详解
- Java中使用BufferedReader读取文件的好处
- iframe
- Rendering with Vertex Lighting
- 移动出行大热 滴滴野心的背后
- .Net中webBrowser控件JS交互
- 使用WinSCP拖拽文件中文名乱码问题解决
- 线程生命周期
- IOS XMPP 学习笔记
- Angularjs Controller 间通信机制
- VMware 安装mac方法整理
- int main( int argc, char ** argv)在VS2008中的配置的一个实例
- 稀疏表示