我是“计算机科学与技术”专业的一名在校本科生,这是我的第一篇博文,用词不当还请各位看官多多包涵。

这篇博文是关于西北工业大学NOJ数据结构习题中的“求广义表深度”的思路实现与调试心得,如有错误或纰漏欢迎各位大佬指正。

题目如下:

读题之后,第一反应是与之前做过的一道“表达式括号匹配”题目类似,似乎可以用“栈”的方法来解决,但题目明确要求要用广义表而且老师前两天也刚刚讲过关于广义表的递归运算,所以我决定使用递归来将数据存入广义表,再使用递归来计算出该广义表的深度。

构建广义表的思路是通过判断每次输入的字符来判断需要新生成什么样的节点,再通过上一节点信息来判断当前节点应连接在表的什么位置;计算广义表深度的思路是通过判断该节点的信息,计算出后面与下面所有节点深度最大一个,形成递归,最终返回改广义表的深度。

首先设计出节点的数据类型,“judge”用来判断此节点类型,1是“Data节点”,0是“Node节点”;“before”是指向上一个节点指针;“next”是指向右侧节点的指针;红框内是union型的数据,为“Data节点”时是存入的数据,为“Node节点”时是指向下面节点的指针。

由此可以将(a,(b,c))转变为所设计的广义表:同级的a与bc同行,同级的b与c同行,每个“Node节点”的down所在行的每一节点就是该括号内的所有数据,如下图:

而我计算深度的方法是不断将节点右侧和下方的深度计算出来,取其中最大的深度,如下图:

我的实现如下:

#include <stdio.h>
#include <stdlib.h>struct Node
{int judge;struct Node *before;struct Node *next;union{struct Node *down;char data;};
};void createGeneralNode (struct Node *pre);
void createGeneralList (struct Node *head);
void run ();
int getDepth (struct Node *node);int main()
{run ();return 0;
}void createGeneralNode (struct Node *pre)
{char s,ss=0;struct Node *cur;if ((s=getchar())==','){ss=s;s=getchar();}if (s>='a'&&s<='z'){cur =(struct Node *)malloc (sizeof(struct Node));if (ss==','){pre->next=cur;}else{pre->down=cur;}cur->before=pre;cur->data=s;cur->next=NULL;cur->judge=1;createGeneralNode (cur);}else{if (s=='('){cur =(struct Node *)malloc (sizeof(struct Node));if (ss==','){pre->next=cur;}else{pre->down=cur;}cur->before=pre;cur->down=NULL;cur->next=NULL;cur->judge=0;createGeneralNode (cur);}else{if (s==')'){while (pre->judge||pre->next){pre=pre->before;}createGeneralNode (pre);}}}
}void createGeneralList (struct Node *head)
{head->judge=0;head->down=NULL;head->next=NULL;head->before=NULL;createGeneralNode(head);
}void run ()
{struct Node head;int depth;createGeneralList(&head);depth=getDepth(head.down);printf ("%d\n%d",depth,depth);
}int getDepth (struct Node *node)
{int max=0,depth;struct Node *p;for (p=node->next;p;p=p->next){if (p->judge){depth=0;}else{if (p->down){depth=getDepth(p->down)+1;}else{depth=1;}}max=depth>max?depth:max;}if (node->judge){depth=0;}else{if (node->down){depth=getDepth(node->down)+1;}else{depth=1;}}return max=depth>max?depth:max;
}

其函数调用关系如下:

以下是各函数注释代码:

void run ()
{struct Node head;int depth;createGeneralList(&head);      //创建广义表并输入数据depth=getDepth(head.down);     //获得广义表深度printf ("%d\n%d",depth,depth); //输出
}
void createGeneralList (struct Node *head)
{head->judge=0;            //初始化head->down=NULL;          //初始化head->next=NULL;          //初始化head->before=NULL;        //初始化createGeneralNode(head);  //创建节点
}
void createGeneralNode (struct Node *pre)//输入值为上一个节点地址
{char s,ss=0;struct Node *cur;if ((s=getchar())==',')//若输入为",",记录{ss=s;               s=getchar();}if (s>='a'&&s<='z'){cur =(struct Node *)malloc (sizeof(struct Node));if (ss==',')       //如果与上一个节点同行{pre->next=cur;}else               //如果与上一个节点不同行{pre->down=cur;}cur->before=pre;   //该Date节点赋值cur->data=s;cur->next=NULL;cur->judge=1;createGeneralNode (cur);//递归,重新创建节点}else{if (s=='('){cur =(struct Node *)malloc (sizeof(struct Node));if (ss==',')         //如果与上一个节点同行{pre->next=cur;}else                //如果不同行{pre->down=cur;}cur->before=pre;    //Node节点赋值cur->down=NULL;cur->next=NULL;cur->judge=0;createGeneralNode (cur);//重新创建节点}else{if (s==')'){while (pre->judge||pre->next)//寻找前面第一个右侧为空的Node节点{pre=pre->before;}createGeneralNode (pre);//重新创建节点}}}
}
int getDepth (struct Node *node)
{int max=0,depth;struct Node *p;for (p=node->next;p;p=p->next)  //遍历节点右侧部分,寻找其中最大深度{if (p->judge){depth=0;}else{if (p->down){depth=getDepth(p->down)+1;}else{depth=1;}}max=depth>max?depth:max;}if (node->judge)               //遍历下方节点,寻找其中最大深度{depth=0;}else{if (node->down){depth=getDepth(node->down)+1;}else{depth=1;}}return max=depth>max?depth:max;//返回两侧深度较大的值
}

输入函数我重写了两次才完成,都是因为判断条件不完善导致无法得到正确的广义表,下次在设计时需要考虑周全,避免无意义的返工。

测深度的方法想了好久,也参考了老师的方法(其实是没看懂。。。),主要原因还是对递归的理解不够透彻,无法直接想出所需的递归算法。

第一次写的博文,写了很长时间,已经快三点了。。。下次我一定尽量在白天写,希望自己能坚持下来。

NOJ-求广义表深度-西工大数据结构相关推荐

  1. 数据结构14——求广义表深度(严5.30)

    Description 试按表头.表尾的分析方法编写求广义表的深度的递归程序. Input 输入一串以'('开始,以'('结束的字符串,并且输入的左右括号必须匹配,如:(),(())-- Output ...

  2. 【数据结构】NOJ014 求广义表深度

    //[数据结构]NOJ014 求广义表深度 //表头-表尾表示法#include <stdio.h> #include <stdlib.h> #include <stri ...

  3. 【数据结构】NOJ014—求广义表深度

    题目描述:  解析: 题目要求用递归做,当然这个题用栈也可以做. (1)栈 遇见一个"("就把它压入栈,遇见一个")"就出栈一个"(".最后 ...

  4. noj14求广义表深度

    广义表理论上很好理解,但是我感觉对我来说上手还有点困难(还是太菜). 先看广义表的一些定义吧 1 )什么是广义表 广义表,又称列表,也是一种线性存储结构,既可以存储不可再分的元素,也可以存储广义表,记 ...

  5. 广义表-求广义表深度,建立广义表,复制广义表

    广义表-求广义表深度,建立广义表,复制广义表 例: 广义表(a,(a,b),d,e,((i,j),k)) 求广义表的长度和深度 长度为5,深度为3 长度:有效逗号个数+1 深度:有效括号个数 求广义表 ...

  6. 求广义表深度(严5.30)

    Description 试按表头.表尾的分析方法编写求广义表的深度的递归程序. Input 输入一串以'('开始,以'('结束的字符串,并且输入的左右括号必须匹配,如:(),(())-- Output ...

  7. noj14 求广义表深度

    关键是创建广义表 //求广义表深度 #include <stdio.h> #include <stdlib.h> #include <string.h>typede ...

  8. 西工大NOJ数据结构理论——014.求广义表深度(严5.30)

    第一下拿到这道题,我的脑袋轰一下就大了.如果说用"括号匹配"来做的话,这其实很简单.但是如果要用广义表来做的话,难度哗哗哗的就涨上来了.为什么呢?首先,要把读入的字符串存到广义表里 ...

  9. 西北工业大学NOJ数据结构—014求广义表深度

    #include <stdio.h> #include <stdlib.h>typedef struct Node {int A_L;//使用枚举不熟练,A_T代表Atom或L ...

最新文章

  1. iOS webview 点击按钮返回上一页面或者返回首页
  2. platform_driver_register适配的两种方式及probe是否启动与硬件关系
  3. R语言ggplot2可视化使用facet_grid构建多个子图(facet、面图)并自定义每个子图(facet、面图)的文本实战
  4. 猫头鹰的深夜翻译:在JVM上根据合约编程
  5. 关于java继承中父类方法可见性探讨
  6. html左侧黑色梯形状线条,html – 使用纯css左,下,左边的线条绘制动画
  7. WPF中查看PDF文件 - 基于开源的MoonPdfPanel (无需安装任何PDF阅读器)问题汇总
  8. rnn stateful
  9. python学习:删除空白
  10. 2016京东编程题:年终奖
  11. 熟悉常规B/S、C/S系统开发实现原理
  12. 分享正在构想的开源门户/B2B框架理念 与现有流行的门户系统/B2B系统有很大不同...
  13. matlab鲍威尔法(Powell)
  14. ios yytext的使html,iOS 利用YYText 实现 展开全文 功能
  15. a4纸和ipad对比_我告诉你10.2寸ipad和9.7寸对比
  16. 《跨界杂谈》(信息)安全
  17. 联想台式计算机亮度怎么调,台式联想电脑亮度在哪里调(手把手教你调电脑亮度)...
  18. flink on yarn使用第三方jars的方法如何查看进程所持有jar包
  19. java 绑定mac地址_如何JAVA实现使用TrueLicense在证书中绑定PC的MAC地址,防止止拷贝应用...
  20. 图像分割的 U-Net 系列方法

热门文章

  1. 3D数学-C++Vector3类
  2. 同桌计划软件测试,同桌计划
  3. Reuired reowest part ‘fie‘ is not oresent
  4. [MySQL]约束(constraint)
  5. Source Insight 支持AUTOSAR风格的代码解析
  6. Mac、iPad 之间拖拽即可移动文件、iOS 15 来了,这届 WWDC21 精彩内容尽在这里!...
  7. Linux系统中修改用户名的两种方案整理
  8. 四川洪水,矿场被淹:大批显卡弃置街头
  9. 寻找“最好”(1)——函数的极值
  10. 说说多态是什么,多态的前提条件是什么?