#include <stdio.h>
#include <stdlib.h>
typedef enum {atom, list} NodeTag; //atom = 0, 表示原子; list = 1, 表示子表
typedef char DataType;
typedef struct GLNode {
NodeTag tag; //区分原子结点和表结点
union {
DataType data; //存放原子结点值
struct GLNode *slink; //指向子表的指针
};
struct GLNode *link; //指向下一个结点
}GLNode, *Glist; //广义表类型
GLNode *p;
//建立广义表
Glist CreatGList(Glist GL)
{
char ch;
scanf("%c", &ch);
if(ch != ' ') {
GL = (GLNode *)malloc(sizeof(GLNode));
if(ch == '(') {
GL->tag = list;
GL->slink = CreatGList(GL->slink); //递归调用构造子表
}
else { //构造原子结点
GL->tag = atom;
GL->data = ch;
}
}
else
GL = NULL;
scanf("%c", &ch);
if(GL != NULL)
if(ch == ',')
GL->link = CreatGList(GL->link); //递归构造后续广义表
else
GL->link = NULL; //表示遇到')'时,无后续表
return GL;
}
//输出广义表
void PrintGList(Glist GL)
{
if(GL != NULL) {
if(GL->tag == list) {
printf("(");
if(GL->slink == NULL)
printf(" ");
else
PrintGList(GL->slink); //递归调用输出子表
}
else
printf("%c", GL->data); //输出原子结点数据值
if(GL->tag == list)
printf(")");
if(GL->link != NULL) {
printf(",");
PrintGList(GL->link); //递归调用输出下一结点
}
}
}
//广义表的查找
void FindGlistX(Glist GL, DataType x, int *mark)
{
if(GL != NULL) {
if(GL->tag == 0 && GL->data == x) {
p = GL;
*mark = 1;
}
else
if(GL->tag == 1)
FindGlistX(GL->slink, x, mark);
FindGlistX(GL->link, x, mark);
}
}
//求广义表表头
Glist head(Glist GL)
{
Glist p;
if(GL != NULL && GL->tag != 0) {
p = GL->slink;
p->link = NULL;
return p;
}
else
return NULL;
}
//求广义表表尾
Glist tail(Glist GL)
{
Glist p;
if(GL != NULL && GL->tag != 0) {
p = GL->slink;
p = p->link;
}
return p;
}
//求广义表的深度
void depth(Glist GL, int *maxdh)
{
int h;
if(GL->tag == 0)
*maxdh = 0;
else
if(GL->tag == 1 && GL->slink == NULL)
*maxdh = 1;
else {
GL = GL->slink;
*maxdh = 0;
do {
depth(GL, &h);
if(h > *maxdh)
*maxdh = h;
GL = GL->link;
}while(GL != NULL);
*maxdh = *maxdh + 1;
}
}
int main()
{
Glist G;
Glist s;
DataType x;
int mark = 0, maxdh;
printf("Input:");
G = CreatGList(G);
printf("Print:");
PrintGList(G);
printf("\n");
printf("Input Find x:");
scanf("%c", &x);
FindGlistX(G, x, &mark);
if(mark) {
printf("Find Yes\n");
printf("%c\n", p->data);
}
else
printf("Find No\n");
s = head(G);
PrintGList(s);
printf("\n");
s = tail(G);
PrintGList(s);
depth(G, &maxdh);
printf("Depth:%d", maxdh);
}
#include <stdlib.h>
typedef enum {atom, list} NodeTag; //atom = 0, 表示原子; list = 1, 表示子表
typedef char DataType;
typedef struct GLNode {
NodeTag tag; //区分原子结点和表结点
union {
DataType data; //存放原子结点值
struct GLNode *slink; //指向子表的指针
};
struct GLNode *link; //指向下一个结点
}GLNode, *Glist; //广义表类型
GLNode *p;
//建立广义表
Glist CreatGList(Glist GL)
{
char ch;
scanf("%c", &ch);
if(ch != ' ') {
GL = (GLNode *)malloc(sizeof(GLNode));
if(ch == '(') {
GL->tag = list;
GL->slink = CreatGList(GL->slink); //递归调用构造子表
}
else { //构造原子结点
GL->tag = atom;
GL->data = ch;
}
}
else
GL = NULL;
scanf("%c", &ch);
if(GL != NULL)
if(ch == ',')
GL->link = CreatGList(GL->link); //递归构造后续广义表
else
GL->link = NULL; //表示遇到')'时,无后续表
return GL;
}
//输出广义表
void PrintGList(Glist GL)
{
if(GL != NULL) {
if(GL->tag == list) {
printf("(");
if(GL->slink == NULL)
printf(" ");
else
PrintGList(GL->slink); //递归调用输出子表
}
else
printf("%c", GL->data); //输出原子结点数据值
if(GL->tag == list)
printf(")");
if(GL->link != NULL) {
printf(",");
PrintGList(GL->link); //递归调用输出下一结点
}
}
}
//广义表的查找
void FindGlistX(Glist GL, DataType x, int *mark)
{
if(GL != NULL) {
if(GL->tag == 0 && GL->data == x) {
p = GL;
*mark = 1;
}
else
if(GL->tag == 1)
FindGlistX(GL->slink, x, mark);
FindGlistX(GL->link, x, mark);
}
}
//求广义表表头
Glist head(Glist GL)
{
Glist p;
if(GL != NULL && GL->tag != 0) {
p = GL->slink;
p->link = NULL;
return p;
}
else
return NULL;
}
//求广义表表尾
Glist tail(Glist GL)
{
Glist p;
if(GL != NULL && GL->tag != 0) {
p = GL->slink;
p = p->link;
}
return p;
}
//求广义表的深度
void depth(Glist GL, int *maxdh)
{
int h;
if(GL->tag == 0)
*maxdh = 0;
else
if(GL->tag == 1 && GL->slink == NULL)
*maxdh = 1;
else {
GL = GL->slink;
*maxdh = 0;
do {
depth(GL, &h);
if(h > *maxdh)
*maxdh = h;
GL = GL->link;
}while(GL != NULL);
*maxdh = *maxdh + 1;
}
}
int main()
{
Glist G;
Glist s;
DataType x;
int mark = 0, maxdh;
printf("Input:");
G = CreatGList(G);
printf("Print:");
PrintGList(G);
printf("\n");
printf("Input Find x:");
scanf("%c", &x);
FindGlistX(G, x, &mark);
if(mark) {
printf("Find Yes\n");
printf("%c\n", p->data);
}
else
printf("Find No\n");
s = head(G);
PrintGList(s);
printf("\n");
s = tail(G);
PrintGList(s);
depth(G, &maxdh);
printf("Depth:%d", maxdh);
}