顺序表定义
用顺序存储的方式实现线性表的顺序存储。
顺序存储:把逻辑上相邻的元素存储在物理位置也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
顺序表的实现--静态分配
#include<stdio.h>
#define MaxSize 10 //定义最大长度
typedef struct
{
int data[MaxSize];//用静态的“数组”存放数据元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
//基本操作--初始化一个顺序表
void InitList(SqList &L)
{
for(int i=0;i<MaxSize;i++)
{
L.data[i]=0;
L.length=0;
}
}
int main()
{
SqList L; //声明一个顺序表
InitList(L); //初始化顺序表
//...
return 0;
}
Q:如果“数组”存储了怎么办?可以放弃治疗,顺序表的表长刚开始确定后就无法更改(存储空间是静态的)
思考:如果刚开始就声明一个很大的内存空间,存在什么问题?
顺序表的实现--动态分配
#define InitSize 10 //顺序表的初始长度
typedef struct
{
ElemType * data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义(动态分配方式)
void InitList(SeqList& L)
{
//用malloc函数申请一片连续的存储空间
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize=InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList& L,int len)
{
int* p=L.data;
L.data=(int *)malloc(L.MaxSize+len)*sizeof(int));
for(int i=0;i<L.length;i++)
{
L.data[i]=p[i]; //将数据复制到新区域
}
L.MaxSize=L.MaxSize+len; //顺序表最大长度增加len
free(p); //释放原来的内存空间
}
int main()
{
SeqList L;//声明一个顺序表
InitList(L);//初始化顺序表
IncreaseSize(L,5);
return 0;
}
顺序表特点
- 随机访问:能在O(1)时间内找到第i个元素
- 存储密度高
- 拓展容量不方便
- 插入、删除数据元素不方便