线性表概述:
特点:
一种逻辑结构,
元素具有相同数据类型,
元素具有逻辑上的顺序性,
元素具有抽象性,
有限序列
第一个元素叫表头元素,最有一个元素叫表尾元素。
除表尾元素都有一个后继节点。
线性表九种基本操作:
InitList(&L);初始化表(空的)
DestroyList(&L);销毁操作
LocateElem(L,e);按值查找
GetElem(L,i);按位查找
ListInsert(&L,i,e);插入操作(前插)
ListDelete(&L,i,&e);删除操作(返回删除的元素e)
PrintList(L);输出操作
Empty(L);判空操作
Length(L);求表长
顺序表概述:
特点:
逻辑结构相邻,物理结构也相邻
通常数组实现。
但是数组不可以增加,顺序表可以增加
数组可多维,顺序表不可以
sizeof(ElemType)求该顺序表所存放的数据元素类型的存储空间有多大
n代表顺序表中的最后一个元素
MaxSize代表数组中的最有一个存储单元
设顺序表中第一个元素的内存地址为LOC(A),
则第二个元素内存地址是LOC(A)+sizeof(ElemType)
【sizeof(ElemType)是第一个元素所占用的空间】
//数组静态分配
#define MaxSize 50
typedef struct{
ElemType data[MaxSize]; //数组大小
int length; //顺序表长度
}SqList;
//数组动态分配
#define MaxSize 50
typedef struct{
ElemType *data;//指针
//【存放一个存储单元的地址,需要不断分配空间】
int length;
}SqList;
//动态分配空间语句
//C
L.data=(Elemtype*)malloc(sizeof(ElemType)*InitSize);
//C++
L.data=new ElemType[InitSize];
顺序表基本操作
1.插入操作:(前插法)
bool ListInsert(SqList &L,int i,ElemType e)
//使用引用类型L是因为在函数体内操作是作用到局部变量上,如果不用引用类型,不能把插入操作真正作用到传入的顺序表上
{
if(i<1||i>L.length+1)
return false;
if(L.length>=MaxSize)//查看数组是否满
return false;
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return true;
}
2.删除操作:
bool ListDelete(SqList &L,int i,ElemType &e){
if(i<1||i>L.length)
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
3.按值查找:
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
小结:三种操作的最好时间复杂度都为O(1),最坏时间复杂度都为O(n).