1.线性表的定义:零个或多个相同类型的数据元素的有限序列。若元素为多个,则第一个元素无前驱,最后一个元素无后继,其他的每个元素都有且只有一个前驱和后继。线性表中的每个数据元素可以由若干个数据项组成,这时,数据元素称为记录record,线性表称为文件file。
2.线性表的抽象数据类型:
线性表是一种数据结构,其元素之间存在一一对应的逻辑关系{D,S}。D表示数据元素,S表示数据元素之间的关系。
线性表的抽象数据类型{D,S,P},其中{D,S}表示数据结构,P表示数据结构上的一组操作。
ADT List
Data
/*一组带结构的数据元素*/
Operation
INITIATE(L)
LENGTH(L)
GET(L,i)
LOCATE(L,x)
INSERT(L,i,b)
3.线性表的物理结构
3.1顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素。C语言中用数组为例。
(1)描述线性表需要三个属性:存储空间的起始位置,线性表的最大存储容量(数组长度,即总的存储空间的长度),线性表的当前长度(线性表中数据元素的个数)。
(2)随机存取结构:LOC(ai)=LOC(a1)+(i-1)c;存取操作的时间复杂度为O(1)。
(3)插入:检验当前的list的长度是否超过定义的数组最大长度,检验插入的位置是否合理(插入第i个之前,因此i可以取length+1),移位(若插入的不在表尾),插入,表长加1。
(4)删除:检验list是否为空表,检验删除的位置是否合理,赋值,(若删除的不在表尾)移位,表长-1。
(5)时间复杂度:存取操作O(1),插入删除O(n)。插入平均移动次数为n/2,删除平均移动次数为(n-1)/2。
(6)顺序存储优点:无需表示元素之间的逻辑关系而额外增加存储空间。可以快速存取。
顺序存储缺点:删除插入操作需要大量移动元素。当线性表长度变化较大时,难以确定存储空间的容量。造成存储空间的碎片。
适用:元素个数不太变化,更多是存取数据的应用。
#include <iostream>
using namespace std;
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
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 PrintList(SqList *L)
{
for(int i=1; i!=L->length;i++)
cout<<L->data[i-1]<<" ";
cout<<L->data[L->length-1]<<endl;
return OK;
}
Status ListInsert(SqList *L, int i, ElemType e) //在第i个位置之前插入新的数据元素e,L的长度加1
{
if( L->length == MAXSIZE) return ERROR;
if( i<1 || i>L->length+1 ) return ERROR;
if( i<=L->length )
{
for(int k=L->length;k>=i;k--)
L->data[k]=L->data[k-1];
}
L->data[i-1]=e;
L->length++;
return OK;
}
Status ListDelet(SqList *L, int i, ElemType *e)//删除第L个元素,并返回它的值
{
if(L->length==0) return ERROR;
if(i<1 || i>L->length) return ERROR;
*e = L->data[i-1];
if(i<L->length)
{
for(int k=i+1;k!=L->length+1;k++)
L->data[k-2] = L->data[k-1];
}
L->length--;
return OK;
}
int main()
{
SqList List1;
ElemType find_num;
ElemType is_num=18;
ElemType dl_num;
List1.length = 0;
cout<<"The original list: ";
for(int i=1; i!=10; ++i)
{
List1.data[i-1]=i;
List1.length ++;
cout<<List1.data[i-1]<<" ";
}
cout<<endl;
cout<<"The find number: ";
if(GetElem(List1,5,&find_num))
cout<<find_num<<endl;
cout<<"The list after insert: ";
ListInsert(&List1,6,is_num);
PrintList(&List1);
cout<<"The list after deleat: ";
ListDelet(&List1,3,&dl_num);
PrintList(&List1);
system("pause");
return 0;
}