1. 线性表的顺序表示和实现——顺序表
1.1 相关概念
①线性表:
- 存在唯一一个“第一个”元素
- 存在唯一一个“最后一个”元素
- 除第一个元素外,每一个元素都有且只有一个前驱
- 除最后一个元素外,每个元素都有且只有一个后继
②顺序表:顺序存储,随机存取,通常用数组描述,逻辑上相邻在物理上一定相邻
③线性表的动态分配顺序存储结构(类C语言):
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
1.2 相关算法(均采用类C语言分析)
1.2.1 构造一个空的线性表L(构造空表)
Status InitList_Sq(SqList &L)
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVWEFLOW); //存储分配失败
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}//InitList_Sq 时间复杂度为O(1)
1.2.2 在顺序表L中第i个位置之前插入新的元素e(插入元素:增)
Status ListInsert.Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1) return ERROR; //i的值不合法
if(L.length>=L.listsize){ //当前存储空间已满,增加分配
newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW); //存储分配失败
L.elem = newbase; //新基址
L.listsize += LISTINCREMENT; //增加存储容量
}
q = &(L.elem[i-1]); //q为插入位置
for(p = &(L.elem[L.length-1]);p>=q;--p) *(p+1) = *p; //插入位置及之后的元素右移
*q = e; //插入e
++L.length; //表长增1
return OK;
}//ListInsert_Sq 时间复杂度为O(n)
1.2.3 在顺序表L中删除第i个元素,并用e返回其值(删除元素:删)
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{
if(i<1||i>L.length+1) return ERROR; //i的值不合法
p = &(L.elem[i-1]); //p为被删除元素的位置
e = *p; //被删除元素的值赋给e
q = L.elem+L.length-1; //表尾元素的位置
for(++p;p<=q;++p) *(p-1)=*p; //被删除元素之后的元素左移
--L.len