线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
顺序存储方式不仅只用于存储线性结构。
线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
在上述定义中,数组指针elem指示线性表的基地址;length指示线性表的当前长度;listsize指示顺序表当前分配的存储空间的大小,一旦因插入元素而空间不足时,可进行再分配,即为顺序表增加一个大小为存储LISTINCREMENT个数据元素的空间。
顺序表初始化
顺序表的初始化操作就是为顺序表分配一个预定义大小的数组空间,并将线性表的当前长度设为“0”。
#include<stdio.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef struct{
int *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
int InitList_Sq(SqList *L)
{
L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));//构造一个空的线性表L
if(!L->elem)
{
return -1;//存储分配失败(申请失败)
}
L->length = 0;//空表长度为0
L->listsize = LIST_INIT_SIZE;//初始存储容量
return 1;
}
int main(){
SqList L;//声明一个顺序表
InitList_Sq(&L);//初始化
for(int i=0;i<10;i++)//将顺序表的前10个单元赋值为0-9,
{
L.elem[i]=i;
L.length++;
printf("%d",L.elem[i]);
}
}
顺序表插入元素
在顺序存储结构中,插入和删除元素,需要大量地移动元素,所有效率低。
在顺序表插入和删除元素,最主要的操作时移动元素。
要在第 i (1<=i<=n)个元素之前插入元素,共n-i+1个元素依次向后移一个位置。
若长度为n的线性表采用顺序存储结构,在其第 i 个位置插入一个新元素的算法时间复杂度为O(n)
若i = n,算法时间复杂度为O(1)
#include<