线性表的定义和特点
定义:
用数据元素的有限序列表示,例如:a1,a2,a3…
特点:
- 线性表中数据元素之间的关系是一对一的关系
- 除最后一个元素之外,均有唯一的后继(后件)
- 除第一个元素之外,均有唯一的前驱(前件)
线性表的类型
- 顺序存储
- 链式存储
顺序表的表示和实现
顺序存储定义
把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
顺序存储方法
用一组地址连续的存储单元依次存储线性表的元素,可通过数组V[n] 来实现
优缺点
存储密度大,可以随机存取表中任一元素,但是在做插入删除操作时,需要移动大量元素,且存储空间固定,会造成空间浪费或者不足。
顺序表的类型定义
//后面代码中出现的
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef struct{
int i;
float f;
char c;
...//结构体内数据元素类型根据实际改变
}ElemType;
typedef struct
{
ElemType *elem;//只想数据元素(可以是简单的数据类型,也可以是复杂的数据类型)的基地址
int length;//线性表的当前长度
} SqList;//顺序表的结构类型为SqList
顺序表的重要基本操作
- 初始化
//初始化(分配空间,长度设为0)
Status InitList(SqList &L)
{
//构造一个空的顺序表L
L.elem=new ElemType(MAXSIZE); //分配空间
if(!L.elem) exit(OVERFLOW); //分配失败退出
L.length=0;
return OK;
};
- 取值
//取值(取出第i个数据元素,存入e)
Status GetElem(SqList L,int i,ElemType &e)
{
if(i<1 || i>L.length) return ERROR; //i为正整数
e=L.elem[i-1];//数组从0开始存
return OK;
};
- 查找
//查找(在顺序表中查找值为e的数据元素,返回其序号)
Status LocateElem(SqList L,ElemType e)
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e) return i+1;
return 0;//查找失败,返回0
}
}
- 插入
//插入(在第i个位置插入e)
Status ListInsert(SqList &L,int i,ElemType e)
{
if((i<1) || (i>L.length+1)) return ERROR; //i不合法
if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];//从最后一个元素开始到插入位置的元素都后移
L.elem[i-1]=e;//插入新元素
++L.length;//表长加一
return OK;
}
- 删除
//删除 (删除第i个元素)
Status ListDelet(SqList &L,int i)
{
if((i<1) || (i>L.length)) return ERROR; //i不合法
for(int j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];//从被删除位置到最后一个元素全部前移
--L.length;//表长减一
return OK;
}
- 清空顺序表
//清空
void ClearList(SqList &L)
{
L.length=0;
}
- 销毁
//销毁
void DestroyList(SqList &L)
{
if(L.elem)
delete []L.elem;//释放存储空间
}