数据结构和算法-学习笔记4
2014-12-17 10:16
375 查看
线性表两种存储结构-顺序存储
顺序存储结构代码:
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
结构封装需要三个属性:
存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置
线性表的最大存储容量:数组长度MAXSIZE
线性表的当前长度:length
地址计算方法:
假设ElemType占用的是C个存储单元,你们线性表中第i+1个数据元素和第i个数据元素的关系是
LOC(ai+1)=LOC(ai)+c
代码段:
插入操作:
思路:
①插入位置不合理,抛出异常
②线性表长度大于等于数组长度,则跑出异常或动态增加数组容量
③从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
④将要插入元素填入位置i处
⑤线性表长+1
实现代码:
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) //若插入数据不在表尾
{
//将要插入位置后数据元素向后移动一位
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;
}
删除操作:
思路:
①如果删除位置不合理,抛出异常
②取出删除元素
③从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
④表长-1
代码实现:
Status 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--;//线性表长度-1
return OK;
}
时间复杂度:O(n)
线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n),说明,它比较适合元素个数稳定,不经常插入和删除元素。
优点:
①无须为表示表中元素之间的逻辑关系而增加额外的存储空间
②可以快速地存取表中任意位置的元素
缺点:
①插入和删除操作需要移动大量元素
②当线性表长度变化较大时,难以确定存储空间的容量
顺序存储结构代码:
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
结构封装需要三个属性:
存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置
线性表的最大存储容量:数组长度MAXSIZE
线性表的当前长度:length
地址计算方法:
假设ElemType占用的是C个存储单元,你们线性表中第i+1个数据元素和第i个数据元素的关系是
LOC(ai+1)=LOC(ai)+c
代码段:
插入操作:
思路:
①插入位置不合理,抛出异常
②线性表长度大于等于数组长度,则跑出异常或动态增加数组容量
③从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
④将要插入元素填入位置i处
⑤线性表长+1
实现代码:
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) //若插入数据不在表尾
{
//将要插入位置后数据元素向后移动一位
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;
}
删除操作:
思路:
①如果删除位置不合理,抛出异常
②取出删除元素
③从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
④表长-1
代码实现:
Status 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--;//线性表长度-1
return OK;
}
时间复杂度:O(n)
线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n),说明,它比较适合元素个数稳定,不经常插入和删除元素。
优点:
①无须为表示表中元素之间的逻辑关系而增加额外的存储空间
②可以快速地存取表中任意位置的元素
缺点:
①插入和删除操作需要移动大量元素
②当线性表长度变化较大时,难以确定存储空间的容量
相关文章推荐
- 数据结构与算法 学习笔记
- 【算法零基础入门】 学习笔记一 什么是数据结构
- 数据结构和算法-学习笔记1
- 数据结构 学习笔记 模拟算法2
- 数据结构与算法学习笔记02_3(线性表)
- 数据结构和算法学习笔记-1
- 数据结构和算法分析学习笔记(三)--二叉查找树的懒惰删除(lazy deletion)
- 数据结构和算法-学习笔记3
- 数据结构学习笔记0——算法分析
- 数据结构与算法学习笔记
- 算法导论学习笔记(15)——用于不相交集合的数据结构
- 算法与数据结构-诸论-学习笔记
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 数据结构学习笔记一:简单排序与查询算法
- 数据结构和算法_学习笔记1
- 《数据结构与算法——C语言实现》学习笔记——归并排序
- 数据结构与算法学习笔记——堆排序
- 数据结构 试探法算法学习笔记
- 数据结构学习笔记 模拟算法1
- 数据结构和算法学习笔记(1)