数组和广义表
数组的抽象数据类型定义
ADT Array{
数据对象:ji=0,1,..,bi-1,1,2,…,n;D={aj1j2…jn|n>0称为数组的维数,bi是数据第i维的长度,ji是数组元素第i维的下标,aj1j2…jn∈ElemSet}
数据关系:R={R1,R2,…,Rn}Ri={<\aj1j2..ji…jn,aj1j2..ji+1…jn>|0 ≦j k ≦b k -1 ,1≦ k≦ n 且k≠i ,0≦ j i ≦ b i -2 , a j 1 j 2 … j i+1 … j n ∈D}
基本操作:
InitArray(&A,n,bound1,…,boundn)
操作结果:若维数n和各维长度合法,则构造相应的数据A,并返回OK.
DestroyArray(&A)
操作结果:销毁数组A.
Value(A,&e,index1,…,indexn)
初始条件:A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若各下标不超界,则将e的值赋给所指定的A的元素,并返回ok.
}ADT Array
数组的物理存储
- 顺序存储方式
- 行优先顺序
- 列优先顺序
广义表的抽象数据类型定义
ADT Glist{
数据对象:D={ei|1,2,…,n;n>=0;ei∈AtomSet,AtomSet为某个数据对象}
数据关系:R1={<\ei-1,ei>|ei-1,ei∈D,2<=i<=n}
基本操作:
InitGList(&L);
操作结果:创建空的广义表L.
CreateGList(&L,S);
初始条件:S是广义表的书写形式串;
操作结果:由S创建广义表L.
DestroyGList(&L)
初始条件:广义表L存在。
操作结果:销毁广义表L.
CopyGList(&T,L)
初始条件:广义表L存在。
操作结果:由广义表L复制得到广义表T.
GListLength(L)
初始条件:广义表L存在。
操作结果:求广义表L的长度,即元素个数。
GListDepth(L)
初始条件:广义表L存在。
操作结果:求广义表L的深度。
GListEmpty(L)
初始条件:广义表L存在。
操作结果:判定广义表L是否为空。
GetHead(L)
初始条件:广义表L存在。
操作结果:取广义表L的头。
GetTail(&T,L)
初始条件:广义表L存在。
操作结果:取广义表L的尾。
InsertFirst_GL(&L,e);
初始条件:广义表L存在。
操作结果:插入元素e作为广义表L的第一元素。
DeleteFirst_GL(&L,&e)
初始条件:广义表L存在。
操作结果:删除广义表L的第一元素,并用e返回。
Traverse_GL(L,visit());
初始条件:广义表L存在。
操作结果:遍历广义表L,用函数visit处理每个元素。
}
广义表的物理存储
- 用链式存储结构(由表节点和原子节点构成)
typedef struct GLNode
{
int tag;
union
{
elemtype value;
struct
{
struct GLNode *hp,*tp;
}ptr;
}Gdata;
} GLNode