广义表实验报告Word格式.docx
- 文档编号:15000932
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:15
- 大小:33.63KB
广义表实验报告Word格式.docx
《广义表实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《广义表实验报告Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
操作结果:
创建空的广义表L
CreateGList(&
L,S);
初始条件:
S是广义表的书写形式串
由S创建广义表L
DestroyGlist(&
广义表L存在
销毁广义表L
CopyGlist(&
T,L);
由广义表L复制得到广义表T
GListLength(L);
求广义表L的长度,即元素个数
GListDepth(L);
求广义表L的深度
GlistEmpty(L);
判断广义表L是否为空
GetHead(L);
取广义表L的头
GetTail(L)
取广义表L的尾
InsertFirst_GL(&
L,e)
插入元素e作为广义表L的第一元素
DeleteFirst_GL(GList&
L,&
e)
删除广义表L的第一元素,并用e返回其值
Traverse_GL(GListL,void(*v)(AtomType))
遍历广义表L,用函数Visit处理每个元素
}ADTGList
2.存储结构定义
由于广义表中的数据元素可以具有不同的结构(或是原子,或是列表),因此难以用顺序存储结构表示,通常采用链式存储结构,每个数据元素可用一个节点表示。
由于列表中的数据元素可能为原子或列表,由此需要两种结构的结点:
一种是表结点,用以表示列表;
一种是原子结点,用以表示原子。
一个表结点可以由3个域组成:
标志域,指示表头的指针域和指示表尾的指针域;
而原子结点只需两个域:
标志域和值域。
其形式定义说明如下:
-------广义表的扩展线性链表存储表示------
typedefenum{ATOM,LIST}ElemTag;
//ATOM==0:
原子,LIST==1:
子表
typedefstructGLNode{
ElemTagtag;
//公共部分,用于区分原子结点和表结点
union{//原子结点和表结点的联合部分
AtomTypeatom;
//atom是原子结点的值域AtomType由用户定义
struct{structGLNode*hp,*tp;
}ptr;
//ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
}*GList;
//广义表类型
voidvisit(GListL){//visit函数
printf("
%c"
L->
atom);
}
voidGetGList(chars[])
{//接收建表元素--书写形式串的函数
inti;
\nInputGListtocreat:
\n"
);
for(i=0;
i<
50;
i++)
{
scanf("
&
s[i]);
if(s[i]=='
\n'
)
break;
}
3.算法设计
intInitGList(GList&
L)//建空广义表
{
L=(GList)malloc(sizeof(structGLNode));
if(!
L)returnERROR;
L->
tag=LIST;
ptr.hp=NULL;
ptr.tp=NULL;
returnOK;
GListCreatGList(GList&
L,char*s){//由书写形式串建广义表
GListq;
charx;
x=*s;
s++;
if(x!
='
){
q=(GList)malloc(sizeof(structGLNode));
if(x=='
('
q->
ptr.hp=CreatGList(L,s);
elseif(x=='
)'
if(*s!
'
q=NULL;
x=*s;
s++;
if(x=='
q=(GList)malloc(sizeof(structGLNode));
ptr.tp=CreatGList(L,s);
}
else{
tag=ATOM;
atom=x;
}
}//if
elseq=NULL;
if(q!
=NULL)
if(x=='
q->
else
L=q;
returnL;
intDestroyGList(GList&
L)//销毁广义表
{
GListph,pt;
if(L)
{
if(L->
tag)
ph=L->
ptr.hp;
ph=NULL;
pt=L->
ptr.tp;
free(L);
L=NULL;
DestroyGList(ph);
DestroyGList(pt);
}
returnOK;
GListCopyGList(GList&
T,GListL)//复制广义表
{
if(!
L)T=NULL;
else{
T=(GList)malloc(sizeof(structGLNode));
T->
tag=L->
tag;
tag==ATOM)
T->
atom=L->
atom;
else
CopyGList(T->
ptr.hp,L->
ptr.hp);
ptr.tp,L->
ptr.tp);
returnT;
intGListLength(GListL)//求广义表长度
inti=0;
GListp;
p=L;
if(p->
tag==LIST&
&
!
p->
ptr.hp)
return0;
elseif(p->
return1;
p=L->
for(i=0;
p;
p=p->
ptr.tp,i++);
returni;
-
intGListDepth(GListL)//求广义表深度
intmax,dep;
GListp;
p=L;
L||p->
ptr.hp==NULL)
return1;
elseif(p->
return0;
else
for(max=0,p=L->
ptr.tp)
dep=GListDepth(p);
if(dep>
max)
max=dep;
returnmax+1;
intGListEmpty(GListL)//判断广义表是否为空
L||L->
return1;
return0;
GListGetHead(GListL)//取广义表表头
GListp,h;
\nEmptyGList-NoGListhead!
returnNULL;
p=(GList)malloc(sizeof(structGLNode));
h=L->
tag=h->
if(p->
ptr.hp->
CopyGList(p->
returnp;
GListGetTail(GListL)//取广义表表尾
L)
\nEmptyGList-NoGListtail!
returnNULL;
p=(GList)malloc(sizeof(structGLNode));
p->
CopyGList(p->
returnp;
intInsertFirst_GL(GListL,GListe)//插入一个元素作为广义表的第一元素
p=L->
L->
ptr.hp=e;
e->
ptr.tp=p;
intDeleteFirst_GL(GList&
L,GList&
e)//删除广义表的第一元素
if(L){
e=L->
L->
ptr.hp=e->
e->
e=L;
voidTraverse_GL(GList&
L,voidvisit(GListL))//遍历广义表
if(L!
=NULL){
if(L->
tag==LIST){
printf("
("
if(!
printf("
"
else
Traverse_GL(L->
ptr.hp,visit);
else
visit(L);
tag==LIST)
)"
ptr.tp!
=NULL){
"
Traverse_GL(L->
ptr.tp,visit);
printf("
\nEmptyGList!
4.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 广义 实验 报告