一、什么是线性表?
线性表(Linear List)是一种由同类型数据元素构成的有序序列的线性结构。
表中元素个数称为长度;无元素时称为空表;表的起始位置为表头,结束位置为表尾。
二、线性表的抽象数据类型描述
类型名称:线性表(List)
数据对象集:线性表是n个元素构成的有序序列(a1,a2,a3,…,an)
操作集:线性表L,整数i表示位置,元素X是一个ElementType的数据类型,ElementType可以是整型,可以是结构等。
1.List MakeEmpty();
初始化空线性表L
2.ElementType FIndKth(int K, LIst L);
返回位序为K的元素
3.int FInd(ElementType X, LIst L);
在线性表中查找X的第一次出现位置
4.void Insert(ElementType X, int i, LIst L);
在位序i前插入一个元素X
5.void Delete(int i, LIst L);
删除线性表中位序为i的元素
6.int Length(List L)
返回线性表L长度n
三、线性表的存储结构
对于一种数据结构有不同的表示方法(存储方法),一般在数据结构中最常见的两种存储方法:数组和链表。
1.顺序存储全部信息
数组顺序存放线性表的各个元素,就是用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表也称为顺序表。这样的存储方法,数据在逻辑上和物理(内存)上都是相邻的。
1)存储实现方法:
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i]
或 PtrL->Data[i]
访问线性表的长度:L.Last+1
或 PtrL->Last+1
下面这样也可以,其实是一样的,但是涉及到结构体定义和初始化时的一些区别。
typedef struct
{
ElementType *elem; //储存空间的基地址
int length; //数据结构的长度
}LNode;
下面的操作都做了测试,测试中存的int型,可以是任意的ElementType类型。
2)初始化:
List MakeEmptyList(){
List PtrL;
PtrL = (List)malloc(sizeof(LNode));
PtrL->Last = -1;
return PtrL;
}
3)查找:
int Find(int X, List PtrL){
int i = 0;
for (i = 0; i < PtrL->Last + 1; i++){
if (PtrL->Data[i]==X)
break;
}
return i;
}
4)插入:
void Insert(int X,int i,List PtrL){
int j;
if (PtrL->Last + 1 == MAXSIZE){
cout << "List full!" << endl; /* 表空间已满,不能插入*/
return;
}
if (i < 1 || i > PtrL->Last+2){
/*检查插入位置的合法性*/
cout << "Illegal location!" << endl;
return;
}
for (j =