广义表:
#广义表及结点的表示法#
typedef enum{atom,list}NodeTag;
typedef struct GLNode{
NodeTag tag;
union{
DataType data;
GLNode *slink;
};
GLNode *next;
}* Glist; //为一个指针;
#广义表的基本操作实现#
#1.广义表元素的添加#
Glist CreatGlist(Glist GL){
char ch; scanf("%c",&ch);
if(ch != ' '){
if(ch == '('){
GL->tag = list;
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;
}
#2.广义表的打印输出#
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)
print(")");
if(GL->link != NULL){
printf(",");
PrintGlist(GL->link);
}
}
}
#3.查找广义表中的数据x#
void FindGlistX(Glist GL, DataType x, int *mask){
if(GL != NULL){
if(GL->tag == 0 && GL->data == x){
p = GL; //全部变量,标记x所在的结点;
*mask = 1; //标记是否找到包含x结点的元素;
}
if(GL->tag == 1)
FindGlistX(GL->slink, x, &mask);
FindGlistX(GL->link,x,&mask);
}
}
#4.求广义表的表头#
Glist head(Glist GL){
Glist p;
if(GL != NULL && GL->tag != 0){
p = GL->slink;
p->link = NULL;
return p;
}else{
return NULL;
}
}
#5.求广义表的表尾#
Glist tail(Glist GL){
Glist p;
if(GL != NULL && GL->tag != 0){ //表不为空且有表尾;
p = GL->slink;
p = p->link;
GL->slink = p; //删除广义表第一个元素
}
return p;
}
#6.求广义表的深度depth#
void depth(Glist GL, int *maxdh){
int h;
if(GL->tag == 0) *maxdh = 0;
else if(GL->tag != 0 && GL->slink == NULL)
*maxdh = 1;
else{
*maxdh = 0;
GL = GL->slink;
do{
depth(GL,&h)
if(h>*maxdh) maxdh = h;
GL = GL->link;
}while(GL !=NULL);
*maxdh = *maxdh + 1;
}
}