线性表:零个或多个数据元素的有限序列。
在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
线性表抽象类型定义:
ADT 线性表(List)
Data:
Operation:
InitList(*L) //初始化线性表
ListEmpty(L) //线性表为空返回true,否则返回false
ClearList(*L) //清空线性表
GetElem(L,i,*e)//获得线性表L在i中的位置元素,并通过e返回。
LocateElem(L,e)//查找表中与e相等的,存在返回true,否则返回false
ListInsert(*L,i,e)//线性表L在i处插入e
ListDelete(*L,i,*e)//删除表L在i中的位置,并返回*e的值
ListLength(L)//返回线性表L的个数。
endADT
实现A与B的并集,就是把B中不在A中的部分插入A中。
//将线性表Lb中不在La中的数据全部插入到La中
void union(List *La,List Lb)
{
int La_len,Lb_len,i;
ElemType e; //声明La和Lb中相同的元素e
La_len = ListLength(La);//求线性表的长度
Lb_len = ListLength(Lb);
for(i = 1; i < Lb_len; i++)
{
GetElem(Lb,e); //获取Lb中e的元素
if(!LocateElem(La,e)) //如果La中的数和e不相等
ListInsert(La,++La_len,e) //把e插入La的i中
}
}
线性表的顺序存储结构:是指用一段地址连续的存储单元依次存储线性表的数据元素。
#define MAXSIZE 20 //存储空间初始化分配量
typedef int ElemType; //ElemType类型根据情况而定,
typedef struct
{
ElemType data[MAXSIZE]; //数组存储数据元素
int length; //线性表当前长度
}SqList;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
//Status是函数的类型,其值是函数结构状态代码,顺序线性表L已存在,用e返回L中第i个数据元素的值
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length == 0 || i < 1 || i > L.length)
{
return ERROR;
}
*e = L.data[i - 1];
return OK;
}
//线性表已经存在,进行插入操作
Status ListInsert(SqList *L, int i,ElemType e)
{
int k;
if(L->length == MAXSIZE)
return ERROR;
if(i < 1 || i > L->length + 1)
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;
}
//删除节点
Status ListDelete(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;i < L->length;k++)
{
L->data[k - 1] = L->data[k];
}
}
L->length--;
return OK;
}
//平均时间复杂度为O(n),最好时间复杂度为O(n),最坏时间复杂度为O(1)
平均时间复杂度为O(n),最好时间复杂度为O(n),最坏时间复杂度为O(1)。
线性表的顺序存储结构优点:
- 无需为表中的元素之间的逻辑关系增加额外的存储空间
- 可以快速的存取表中的任一位置元素
线性表的顺序存储结构缺点:
- 插入和删除需要移动大量的元素
- 当线性表的长度变化较大时难以确定存储空间的容量。
- 造成存储空间的“碎片”