主题:广义表用单链表表示法
/***************以下是广义表
//******单链表表示法***************
#define elemtype char
#include<stdio.h>
#include<malloc.h>
struct nodel
{
int atom; //标志域,0表示子表,1表示原子
struct nodel *link; //存放下一个元素的地址
union
{
struct nodel *slink; //用来存放子表的指针
char data; //用来存放原子值
}ds;
};
void creat(nodel **LS); //建立广义表的单链表
void print(nodel *LS); //输出广义单链表
int depth(nodel *LS); //求广义表的深度
main()
{
struct nodel *LS;
int dep; //广义表的深度
printf("创建广义表:\n");
printf("请输入要创建的广义表的形式:\n");
creat(&LS);
printf("广义表形成的情况:\n");
print(LS);
printf(";\n");
if(LS->ds.slink==NULL) //控制只有一个头结点时深度是1而不是2
dep=1;
else
dep=depth(LS); //求广义表的深度
printf("广义表的深度为:%d\n",dep);
}
void creat(nodel **LS) //建立广义表的单链表
{
char ch;
//printf("输入一个字符:");
scanf("%c",&ch);
if(ch=='#')
{
(*LS)=NULL;
}
else if(ch=='(')
{
(*LS)=(struct nodel *)malloc(sizeof(struct nodel));
(*LS)->atom=0;
//getchar();
creat(&((*LS)->ds.slink));
}
else
{
(*LS)=(struct nodel *)malloc(sizeof(struct nodel));
(*LS)->atom=1;
(*LS)->ds.data=ch;
}
//printf("输入一个字符:");
//getchar();
scanf("%c",&ch);
if((*LS)==NULL);
else if(ch==',')
{
//getchar();
creat(&((*LS)->link));
}
else if((ch==')')||(ch==';'))
(*LS)->link=NULL;
}
void print(nodel *LS) //输出广义单链表
{
int ok=1; //测试时,不能有输出或输入
if(LS->atom==0)
{
ok=1; //测试用
printf("(");
if(LS->ds.slink==NULL)
{
ok=1;
printf(" ");
}
else
print(LS->ds.slink);
}
else
{
ok=1;
printf("%c",LS->ds.data);
}
if(LS->atom==0)
{
ok=1;
printf(")");
}
if(LS->link!=NULL)
{
ok=1;
printf(",");
print(LS->link);
}
}
int depth(nodel *LS) //求广义表的深度
{
int max=0;
int t;
while(LS!=NULL)
{
if(LS->atom==0)
{
int dep=depth(LS->ds.slink);
if(dep>max)
max=dep;
t=0; //用于测试
}
LS=LS->link;
}
return max+1;
}
//******单链表表示法***************
//***************以上是广义表
[em10][em10][em10][em10][em10][em14][em14][em14][em14][em16][em16][em16][em16][em16]
//******单链表表示法***************
#define elemtype char
#include<stdio.h>
#include<malloc.h>
struct nodel
{
int atom; //标志域,0表示子表,1表示原子
struct nodel *link; //存放下一个元素的地址
union
{
struct nodel *slink; //用来存放子表的指针
char data; //用来存放原子值
}ds;
};
void creat(nodel **LS); //建立广义表的单链表
void print(nodel *LS); //输出广义单链表
int depth(nodel *LS); //求广义表的深度
main()
{
struct nodel *LS;
int dep; //广义表的深度
printf("创建广义表:\n");
printf("请输入要创建的广义表的形式:\n");
creat(&LS);
printf("广义表形成的情况:\n");
print(LS);
printf(";\n");
if(LS->ds.slink==NULL) //控制只有一个头结点时深度是1而不是2
dep=1;
else
dep=depth(LS); //求广义表的深度
printf("广义表的深度为:%d\n",dep);
}
void creat(nodel **LS) //建立广义表的单链表
{
char ch;
//printf("输入一个字符:");
scanf("%c",&ch);
if(ch=='#')
{
(*LS)=NULL;
}
else if(ch=='(')
{
(*LS)=(struct nodel *)malloc(sizeof(struct nodel));
(*LS)->atom=0;
//getchar();
creat(&((*LS)->ds.slink));
}
else
{
(*LS)=(struct nodel *)malloc(sizeof(struct nodel));
(*LS)->atom=1;
(*LS)->ds.data=ch;
}
//printf("输入一个字符:");
//getchar();
scanf("%c",&ch);
if((*LS)==NULL);
else if(ch==',')
{
//getchar();
creat(&((*LS)->link));
}
else if((ch==')')||(ch==';'))
(*LS)->link=NULL;
}
void print(nodel *LS) //输出广义单链表
{
int ok=1; //测试时,不能有输出或输入
if(LS->atom==0)
{
ok=1; //测试用
printf("(");
if(LS->ds.slink==NULL)
{
ok=1;
printf(" ");
}
else
print(LS->ds.slink);
}
else
{
ok=1;
printf("%c",LS->ds.data);
}
if(LS->atom==0)
{
ok=1;
printf(")");
}
if(LS->link!=NULL)
{
ok=1;
printf(",");
print(LS->link);
}
}
int depth(nodel *LS) //求广义表的深度
{
int max=0;
int t;
while(LS!=NULL)
{
if(LS->atom==0)
{
int dep=depth(LS->ds.slink);
if(dep>max)
max=dep;
t=0; //用于测试
}
LS=LS->link;
}
return max+1;
}
//******单链表表示法***************
//***************以上是广义表
[em10][em10][em10][em10][em10][em14][em14][em14][em14][em16][em16][em16][em16][em16]