为了账号安全,请及时绑定邮箱和手机立即绑定

请教大神该怎么写广义表的存储结构图 ?有图最好了

请教大神该怎么写广义表的存储结构图 ?有图最好了

慕村9548890 2023-04-01 13:14:10
麻烦问一下,写广义表的存储结构图的方法是什么,如((()),a,((b,c),(),d),谢谢!
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

广义表的存储结构代码:


  /* c5-5.h 广义表的头尾链表存储表示 */

  typedef enum{ATOM,LIST}ElemTag; /* ATOM==0:原子,LIST==1:子表 */

  typedef struct GLNode

  {

  ElemTag tag; /* 公共部分,用于区分原子结点和表结点 */

  union /* 原子结点和表结点的联合部分 */

  {

  AtomType atom; /* atom是原子结点的值域,AtomType由用户定义 */

  struct

  {

  struct GLNode *hp,*tp;

  }ptr; /* ptr是表结点的指针域,prt.hp和ptr.tp分别指向表头和表尾 */

  }a;

  }*GList,GLNode; /* 广义表类型 */

广义表的存储结构图:

  


查看完整回答
反对 回复 2023-04-05
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

广义表储存图

/*---------------------------------------------------------------------

广义表的存储结构 

---------------------------------------------------------------------*/ 

#include<stdio.h> 

#include<stdlib.h>

typedef char ElemType;//元素类型是字符型


//广义表的存储结构 

struct GNode 

{

int tag; //标志域  

union{  //值域或子表的表头指针域   

ElemType data;   

struct GNode *sublist;

};   

struct GNode *next; //指向后继结点的指针域 

};


/*----------------------函数声明----------------------*/ 

int LengthGList(struct GNode *GL); //求广义表的长度 

int DepthGList(struct GNode *GL); //求广义表的深度  

void CreateGList(struct GNode **GL);//建立广义表的存储结构 

void PrintGList(struct GNode *GL); //打印输出广义表  

int SearchGList(struct GNode *GL, ElemType e);//查找等于给定字符的单元素结点,查找成功则返回1,否则返回0


/*----------------------主函数----------------------*/ 

void main() 

{

struct GNode *GL;//带表头附加结点   

printf("输入一个广义表,以分号结束\n");  

CreateGList(&GL);   

printf("输出广义表:");  

PrintGList(GL);  

printf("\n");   

printf("广义表的长度:");   

printf("%d\n", LengthGList(GL->sublist));  

printf("广义表的深度:");   

printf("%d\n", DepthGList(GL->sublist));  

printf("搜索值d 的结果:");   

printf("%d\n", SearchGList(GL, 'd'));  } 

/*----------------------函数----------------------*/ 

//求广义表的长度  

int LengthGList(struct GNode *GL)

{  

if(GL!=NULL)   

return(1 + LengthGList(GL->next));  

else

return(0); 

}   

//求广义表的深度  

int DepthGList(struct GNode *GL)

{  

int max=0;//给max赋初值   

//遍历表中每一个结点,求出所有子表的最大深度  

while(GL!=NULL)  

{  

if(GL->tag==1){

int dep = DepthGList(GL->sublist);//递归调用求出一个子表的深度    

if(dep > max)      

max = dep;//让max始终为同一层所求过的子表中深度的最大值    

}    

GL = GL->next;//使GL指向同一层的下一个结点

}  

return(max + 1);//返回表的深度  

}   

//建立广义表的存储结构  

void CreateGList(struct GNode **GL) 

{

char ch;  

scanf("%c", &ch);//读入一个字符,此处只可能读入空格#、左括号或英文字母  

if(ch=='#')//若输入为空格,则置表头指针为空

*GL = NULL;  

else if(ch=='(')//若输入为左括号则建立由*GL所指向的子表结点并递归构造子表

{

*GL = malloc(sizeof(struct GNode)); 

(*GL)->tag = 1;   

CreateGList(&((*GL)->sublist));  

}  

else{ //若输入为字符则建立由*GL所指向的单元素结点   

*GL = malloc(sizeof(struct GNode));   

(*GL)->tag = 0;   

(*GL)->data =   

}   

scanf("%c", &ch);//此处读入的字符必为逗号、右括号或分号  

if(*GL==NULL); //若*GL为空,则什么都不做  

else if(ch==',')//若输入逗号则递归构造后继表   

CreateGList(&((*GL)->next));   

else if((ch==')') || (ch==';'))//若输入为右括号或分号则置*GL的后继指针域为空   

(*GL)->next = NULL;  

}   

//打印输出广义表  

void PrintGList(struct GNode *GL) 

{  

//对于表结点的处理情况  

if(GL->tag==1){ //存在子表,则输出左括号,作为开始符号   

printf("(");   

if(GL->sublist==NULL)//若子表为空则输出‘#’字符    

printf("#");   

else//若子表非空,则递归输出子表    

PrintGList(GL->sublist);   

printf(")");//当一个子表输出结束后,应输出一个右括号终止符

}   

else//对于单元素结点,则输出该结点的值   

printf("%c", GL->data);   

if(GL->next!=NULL)//输出结点的后继表  

{   

printf(",");//先输出逗号分隔符    

PrintGList(GL->next);//再递归输出后继表   

}

}   

//查找等于给定字符的单元素结点,查找成功则返回1,否则返回0 

int SearchGList(struct GNode *GL, ElemType e)

{  

while(GL!=NULL){   

if(GL->tag == 1)//存在子表,则递归搜索本层该子表   

{   

if(SearchGList(GL->sublist, e))

return(1);   

}   

else//存在单元素结点,则查询是否存在值e ,若存在则返回1   

{   

if(GL->data == e)    

return(1);  

}  

GL = GL->next;//使GL指向同一层的下一个结点      

}   

return(0);//剩下来的情况,GL值为NULL,代表搜索不到值e ,输出0  

}


查看完整回答
反对 回复 2023-04-05
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

按层次来,先看整体有多少个“子表”,从表头指针出来就有多少个表结点,然后从出来的表结点按次序在进行延展,对于第一个表结点代表的是第一个子表,那么第一个子表里有多少个子表或者原子节点,从这个表结点里就延伸出多少个  “二代”表结点,层层向下,直到表结点指示原子节点为止,然后回溯到最开始的表结点层,重复以上的过程即可,是一种递归的思想感觉

 


查看完整回答
反对 回复 2023-04-05
  • 3 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信