目录
线性表是具有相同特性的数据元素的一个有限序列
2.线性表的类型定义:
抽象数据类型线性表的定义:
ADT list{
数据对象:D={ai|ai属于elemset,(i=1,2……n,n>=0)}
数据关系:R={<ai-1,ai>|ai-1,ai属于D,(i=2,3,……n)}
基本操作:
Initlist(&L);Destroylist(&L);
Listlnsert(&L,i,e);ListDelete(&L,i,&e);
……
}ADT list
3.基本操作:
构造一个空的线性表L
需存在即可销毁
线性表要已存在,将线性表重置为空表
返回线性表L中的数据元素的个数
线性表L已存在,1<=i<=ListLength(L)
用e返回线性表L中第i个数据元素的值
⑦ 查找和定位: LocateElem(L,e,compare())
线性表L存在,compare()是数据元素判定函数(小于大于等于等等可能)
返回L中第一个与e满足compare()的数据元素的位序,这样的数据元素不存在则返回值为0
⑧找元素的直接前驱:PriorElem(L,cur_e,&pre_e)
线性表L 存在
若cur_e是L 的数据元素,且不是第一个,则用pre_e返回它的前驱,否则造作失败,pre_e无意义
⑨找元素的直接后继:NextElem(L,cur_e,&next_e)
若cur_e是L的数据元素,不是最后一个,则用next_e返回它的后继,否则操作失效,next
_e无意义
线性表L存在,1<=i<=ListLength(L)+1;
在L的第i个位置之前插入新的数据元素e,L的长度加1
⑪删除第i个位置上的元素:ListDelete(&L,i,&e)
1<=i<=ListLength(L)
删除L的第i个数据元素,并用e返回其值,L的长度减1;
⑫对线性表中的每个元素都遍历,访问:ListTraverse(&L,visited())
依次对线性表中的每个元素调用visited()
4.线性表的顺序表示
线性表顺序存储结构占用一片连续的存储空间
顺序表中的元素:地址连续、依次存放、随机存取、类型相同
一维数组定义方法:
类型说明符 数组名[常量表达式] (常量表达式中可以包含常量和符号常量,不能包含变量
Malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址
Sizeof(x)运算:计算变量x的长度
Free(p)函数:释放指针p所指变量的存储空间,彻底删除一个变量
函数调用:
按值传递:把实参的值传送给形参,修改的是形参的值,实参的值不改变(形参和实参各用个的空间)
传地址方式----指针变量作为参数(形参变化影响实参)
数组名作为参数
引用类型作为参数(给一个对象提供一个替代的名字)
5.顺序表基本操作的实现:
①线性表L 的初始化:
Status InitList_Sq(SqList &L){ //构造一个空的顺序表L;
- elem=new ElemType[MAXSIZE]; //为顺序表分配空间
If(!L.elem)exit(OVERFLOW); //存储分配失败
length=0; //空表长度为0
Return ok;
}
②销毁线性表L:
Void DestroyList(SqList &L){
If (L.elem)delete L.elem; //释放存储空间
}
③清空线性表L:
Void ClearList(SqList &L){
L.length=0; //将线性表的长度置为0;
}
④求线性表的长度:
Int GetLength(SqList L){
Return(L.length);
}
⑤判断线性表L是否为空
Int IsEmpty(SqList L){
If(L.length==0) return 1;
Else return 0;
}
⑥顺序表的取值(根据位置i获取相应位置数据元素的内容)(复杂度:o(1))随机存取
Int GetElem(SqList L,int i,ElemType &e)
{If(i<1||i>L.length)return ERROR; //判断i值是否合理,若不合理,返回error
e=L.elem[i-1]; //第i-1的单元存储着第i个元素
Return ok;
}
⑦顺序表的查找(查找与指定值e相同的数据元素的位置)返回其序号(复杂度:o(n))
Int LocateElem(SqList L,ElemType e){
For (i=0;i<L.length;i++)
If(L.elem[i]==e)return i+1; //查找成功,返回序号
Return 0; //查找失败,返回0
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){
If(i<1||i>L.length+1)return ERROR; //i值是否合法
If(L.length==MAXSIZE)return ERROR; //存储空间是否已满
For(j=L.length-1;j>=i-1;j--)
L.length[j+1]=L.length[j]; //插入位置及之后的元素后移
L.elem[i-1]=e; //将新元素e放入第i个位置
L.length++; //表长增1
Return ok;
}
Status ListDelete_Sq(SqList &L,int i){
If((i<1)||(i>L.length)) return ERROR; //i值是否合法
For(j=i;i<=L.length-1;j++)
L.elem[j-1]=L.elem[j]; // 被删除元素之后的元素前移
- length--; //表长减1
Return ok;
}
6.顺序表的优缺点:
优点:存储密度大;可以随机存取表中的任一个元素
缺点:插入删除时 需要移动大量的元素;浪费存储空间;属于静态存储形式,数据元素的个数不能自由扩充;