线性表->顺序表
来源:互联网 发布:dota2最新比赛数据 编辑:程序博客网 时间:2024/05/01 01:59
线性表
线性表是具有相同数据类型的n(n>=0)个数据元素的有序序列。当n=0shi ,该线性表为空表。
对于线性表内元素,除了第一个元素外,每个元素有且只有一个直接前驱;除了最后一个元素外,每个元素有且仅有一个直接后继。
线性表具有三个特性:
- 线性表中的所有数据元素类型都相同;
- 线性表是由有限个数据元素构成;
- 线性表中的数据元素是与位置相关的,每个元素都有一个对应的序号。
注;线性表是逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是存储结构。
顺序表:
顺序存储的线性表称之为顺序表,他是用一组地址连续的存储单元,一次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻,即表中元素的逻辑顺序和物理顺序相同;
对于数组可以静态分配,也可以动态分配。
在静态分配时,由于数组的大小和空间已经固定,一旦空间占满,再加入新的数据将产生溢出,便会导致程序崩溃;
在动态分配时,数组的空间是在程序执行过程中通过动态存储分配语句进行分配,一旦空间占满,便可以另外再开辟一块更大的存储空间,用一替换原来的空间,从而达到扩充数组空间的目的。
顺序表的特点是可以进行随机存取。即可以通过首地址和元素序号,在O(1)的时间内找到指定的元素。顺序表的密度相对较高,每个节点只存储数据元素。但是由于顺序表逻辑上元素相邻,所以插入和删除操作需要移动大量的元素。
/************************************************************************************************优点: 1,无须为表中元素之间的逻辑关系而增加额外的空间 2,可以随意的存取表中任意位置的元素缺点: 1,插入和删除操作需要移动大量的元素 2,当线性表长度变化较大时,难以确定存储空间的容量 3,容易造成存储空间的“碎片”************************************************************************************************/#define MAXSIZE 20 //存储空间初始分配量#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int ElemType; //ElemType 数据类型typedef int Status;typedef struct{ ElemType data[MAXSIZE]; //数组存储数据元素,最大值MAXSIZE int length; //线性表当前长度}SqList;// 线性表 获得元素操作 O(1)Status 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;}//线性表 插入元素操作 O(n)/************************************************************************************************错误处理:1,如果插入位置不合理,抛出异常2,如果线性表长度大于等于数组长度,抛出异常或者动态增加容量开始插入:3,从最后一个元素开始向前遍历到第i个位置,分别把他们向后移动一个位置4,将要插入的元素插入第i个位置5,表的长度增加一个最好情况:表尾插入,元素后移不执行,时间复杂度O(1);最坏情况:表头插入,元素语句将执行n次,时间复杂度O(n);************************************************************************************************/Status ListInsert(SqList *L, int i, ElemType e){ int k; if(L->length == MAXSIZE) //顺序表已经满 return ERROR; if(i<1 || i>L->length+1) //当i不在范围内 return ERROR; if(i<=L->length) //i的位置合理,并且不在表尾 { for(k=L->length - 1; k>=i-1; k--) //将插入位置后的元素向后移动(包括i位置原有的元素) L->data[k+1] = L->data[k]; } L->data[i-1] = e; //插入新的元素 L->length++; //表长增加 return OK;}//线性表 删除元素操作 O(n)/************************************************************************************************1,如果删除位置不合理,抛出异常2,去除要删除的元素;3,从要删除的元素位置开始向后一直遍历到最后一个元素,分别将他们都向前移动一个位置4,表长减1最好情况:表尾删除,无需移动元素,时间复杂度O(1);最坏情况:表头删除,需要移动除第一个元素外的所有元素。时间复杂度O(n);************************************************************************************************/Status ListDelete(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;}
- 线性表-顺序表
- 线性表--- 顺序表
- 线性表顺序表
- 线性表->顺序表
- 线性表- 顺序表
- 线性表--顺序表
- 线性表---顺序表
- 线性表--顺序表
- 线性表---顺序表
- 【线性表】顺序表
- 线性表--顺序表
- 线性表(顺序表)
- 线性表---顺序表
- 线性表--顺序表
- 线性表-顺序表
- 线性表-顺序表
- 数据结构--顺序线性表
- 线性表顺序存贮
- Linux入门学习-ubuntu基本命令_第一章
- iOS: NSNotificationCenter的方法addObserver:selector:name:object:
- 嵌入式系统简介
- hdu 1016 DFS
- Build String
- 线性表->顺序表
- Hadoop集群下线节点
- poj 1018
- 推荐系统实践
- 学习Java虚拟机
- HDOJ1730[SG博弈]
- vs2010 未能将脚本调试器附加到计算机上的进程。已附加了一个调试器
- 双指针移动
- Tomcat学习笔记(一)