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

麻烦问一下,写广义表的存储结构图的方法是什么,如((()),a,((b,c),(),d),谢谢!

慕村9548890
浏览 181回答 3
3回答

慕哥6287543

广义表的存储结构代码:  /* 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; /* 广义表类型 */广义表的存储结构图:  

慕雪6442864

广义表储存图/*---------------------------------------------------------------------广义表的存储结构 ---------------------------------------------------------------------*/ #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); //求广义表的深度 &nbsp;void CreateGList(struct GNode **GL);//建立广义表的存储结构 void PrintGList(struct GNode *GL); //打印输出广义表 &nbsp;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'));  }&nbsp;/*----------------------函数----------------------*/ //求广义表的长度 &nbsp;int LengthGList(struct GNode *GL){  if(GL!=NULL)   return(1 + LengthGList(GL->next));  elsereturn(0); }  &nbsp;//求广义表的深度 &nbsp;int DepthGList(struct GNode *GL){  int max=0;//给max赋初值   //遍历表中每一个结点,求出所有子表的最大深度  while(GL!=NULL)  {  if(GL->tag==1){int dep = DepthGList(GL->sublist);//递归调用求出一个子表的深度    if(dep > max)     &nbsp;max = dep;//让max始终为同一层所求过的子表中深度的最大值    }    GL = GL->next;//使GL指向同一层的下一个结点} &nbsp;return(max + 1);//返回表的深度 &nbsp;}  &nbsp;//建立广义表的存储结构 &nbsp;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 = &nbsp;&nbsp;}   scanf("%c", &ch);//此处读入的字符必为逗号、右括号或分号  if(*GL==NULL); //若*GL为空,则什么都不做  else if(ch==',')//若输入逗号则递归构造后继表   CreateGList(&((*GL)->next));   else if((ch==')') || (ch==';'))//若输入为右括号或分号则置*GL的后继指针域为空   (*GL)->next = NULL; &nbsp;}  &nbsp;//打印输出广义表 &nbsp;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);//再递归输出后继表   }}  &nbsp;//查找等于给定字符的单元素结点,查找成功则返回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);  } &nbsp;GL = GL->next;//使GL指向同一层的下一个结点  &nbsp; &nbsp;&nbsp;}   return(0);//剩下来的情况,GL值为NULL,代表搜索不到值e ,输出0 &nbsp;}

人到中年有点甜

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