一.定义:具有相同特性数据元素的一个有限序列。
1.元素个数即线性表长度用n表示,n>=0.
n=0表示线性表是一个空表(没有任何元素),线性表一般表示为:
(a1,a2,.....,ai,ai+1,an)
a1为表头元素,an为表尾元素。
顺序表
定义MaxSize表示线性表预估计不会超过的长度
#define MaxSize 50
struct ElemType
{
int address;
int quNum;
string cityName;
string shuoming;
};
采用结构体类型表示,元素类型为通用类型标识符ElemType的线性表的顺序存储结构类型描述如下:
typedef struct
{
ElemType data[MaxSize];//存放顺序表中的元素
int length;//存放顺序表的实际占用长度
}SqList;//顺序表的类型定义
1.建立顺序表
将给定的n个元素的数组的每个元素依次放入到顺序表中,并将n赋值给顺序表的长度。
void CreateList(SqList *&l,ElemType a[],int n)//由a中的n个元素建立顺序表
{
int i;
L=(SqList*)malloc(sizeof(SqList));//分配存放线性表的空间
for(i=0;i<n;i++)//放置数据元素
L->data[i]=a[i];
L->length=n;//设置长度
}
2.顺序表的基本运算算法
(1)初始化线性表InitList(L).
该运算的结果是构造一个空的线性表L。实际上只需分配线性表的存储空间,并将length域设置为0即可。
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间
L->length=0;//置空线性表长度为0
}
时间复杂度为O(1)
(2)销毁线性表DestoryList(L)
void DestoryList(Sqlist *&L)
{
free(L);
}
本算法的时间复杂度为O(1)
(3)判线性表是否为空表ListEmpty(L)
bool ListEmpty(SqList*L)
{
return (L->length==0);
}
(4)求线性表的长度ListLength(L)
该运算返回顺序表L的长度。实际上只需要返回length域的值即可。
int ListLength(SqList*L)
{
return (L->length);
}
算法时间复杂度为O(1)
(5)输出线性表DispList(SqList *L)
该运算顺序显示L中各元素的值。
void DispList(SqList *L)
{
int I;
for(i=0;i<L->length;i++)//扫描顺序表输出各元素的值
printf(“%d”,L->data[i]);
printf(“\n”);
}
时间复杂度O(L->length)
(6)求线性表中某个数据元素值GetElem(L,i,e)
该运算用e返回L中第i ( 1<=i<=length(L) )个元素的值。
bool GetElem(SqList *L,int I ,ElemType &e)
{
if(i<1||i>L->length)
return false;//参数错误时返回false
e=L->data[i-1];//取元素值
return true;//成功找到元素时返回true
}
本算法时间复杂度为O(1)
(7)按元素值查找LocateElem(L,e)
该运算顺序查找第一个值域与e相等的元素的逻辑序号。若这样的元素不存在,则返回值为0
int LocateElem(SqList*L,ElemType e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++; //查找元素e
if(i>=L->length) //未找到时返回0;
return 0;
else
return i+1; //找到后返回其逻辑序号
}
本算法中基本运算为while循环中i++语句,故时间复杂度为O(L->length)
(8)插入数据元素ListInsert(L,i,e)
bool ListInsert(SqList *&L,int i,Elemtype e)
{
int j;
if(i<1||i>L->length+1)
return false; // 参数错误时返回false
i--; //将顺序表逻辑序号转换为物理序号
for(j=L->length;j>I;j--) // 将data[i]及后面元素后移一个位置
L->data[j]= L->data[j-1];
L->data[i]=e; //插入元素e
L-length++; //顺序表长度增1
return true; //成功插入返回true
}
本算法时间复杂度与插入位置有关,平均时间复杂度为O(n),n为单链表中数据节点的个数。
(9)删除数据元素ListDelete(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if(i<1||i>length)
return false; //参数错误时返回false
i--; //将顺序表逻辑序号转换为物理序号
e=L->data[i];
for(j=I;j<L->length-1;j++) //data[i]之后的元素前移一个位置
L->data[j]=L->data[j+1];
L->length--; //顺序表长度减1
return true; //成功删除后返回true
}