线性表的定义
n(n>=0)个相同类型数据元素组成的有序序列。
n=0:空表
线性表的基本运算
1.InitList(L)
初始化,建立一个空表L。
算法:将顺序表L的length域置为0。
void InitList(SqList &L)
//由于L要回传给实参,所以用引用类型
{
L.length=0;
}
2.DestroyList(L)
销毁,释放线性表L的空间。
void DestroyList(SqList L)
{ }
3.GetLength(L)
求长度,返回线性表L的长度。
int GetLength(SqList L)
{
return L.length;
}
4.GetElem(L,i,e)
求第i个元素,返回第i个数据元素。
算法:有效时返回1(真),并用引用型形参e返回第i个元素的值。
int GetElem(SqList L,int i,ElemType &e)
{ if (i<1 || i>L.length) //无效的i值返回0
return 0;
else
{ e=L.data[i-1]; //取元素值并返回1
return 1;
}
}
5.Locate(L,x)
按值差找,返回第一个与x值相同元素的逻辑序号。
int Locate(SqList L,ElemType x)
{ int i=0;
while (i<L.length && L.data[i]!=x)
i++; //查找值为x的第1个元素,查找范围为0~L.length-1
if (i>=L.length) return(0); //未找到返回0
else return(i+1); //找到后返回其逻辑序号
}
6.InsElem(L,x,i)
插入元素,前插,n+1。
算法:InsElem()的平均时间复杂度为O(n)。
int InsElem(SqList &L,ElemType x,int i)
{ int j;
if (i<1 || i>L.length+1) //无效的参数i
return 0;
for (j=L.length;j>i;j--) //将位置为i的结点及之后的结点后移
L.data[j]=L.data[j-1];
L.data[i-1]=x; //在位置i处放入x
L.length++; //线性表长度增1
return 1;
}
7.DelElem(L,i)
删除元素,n。
int DelElem(SqList &L,int i)
{ int j;
if (i<1 || i>L.length) //无效的参数i
return 0;
for (j=i;j<L.length;j++) //将位置为i的结点之后的结点前移
L.data[j-1]=L.data[j];
L.length--; //线性表长度减1
return 1;
}
8.DispList(L)
输出元素值,按前后次序输出所有。
void DispList(SqList L)
{ int i;
for (i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
一般结构
线性表抽象数据类型List
= 线性表中元素的逻辑结构 + 基本运算定义
顺序表
定义:线性表在计算机内存中的存储方式
特性:随机存储特性
声明顺序表如下:
#define MaxSize 100
typedef int ElemType; //假设顺序表中所有元素为int类型
typedef struct
{ ElemType data[MaxSize]; //存放顺序表的元素
int length; //顺序表的实际长度
} SqList; //顺序表类型