当前位置:   article > 正文

数据结构_数组与广义表_广义表的建立、遍历、复制、求深度_数组tcopyglist(t,l);未定义标识符

数组tcopyglist(t,l);未定义标识符
     由一个存储着广义表信息的字符串建立一个广义表,并对其进行复制,求深度。

递归真是奇妙无穷啊,有些看似很复杂的东西只要找到规律就能进行递归求解。让我不得不对那些发现规律利用规律创造新事物的人肃然起敬。其实在众多美丽的事物中,人的思想也是很美丽的,那些数学家,哲学家能在意识的世界创造出瑰丽的奇观,让无数后人敬仰不已,好多人不理解数学家和哲学家,认为他们太古板太疯狂,其实他们是被物质世界蒙蔽了双眼,看到各种现实世界的不完美,每天纠结于菜价油价和七大姑八大姨的琐事之中。相反倒是那些他们不理解的数学家和哲学家活在自己创造出的“完美世界”,其乐无穷。美丽的思想,美丽的心灵。为那些数学家和哲学家致敬!




“glists.h”




  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. typedef enum {ATOM,LIST} ElemTag;
  5. typedef char AtomType;
  6. typedef struct GLNode//GLNode是一个类型名
  7. {
  8. ElemTag tag;//标志域
  9. union
  10. {
  11. AtomType atom;
  12. struct{GLNode *hp,*tp;}ptr;
  13. //ptr是列表,hp,tp分别指向该列表的表头和表尾
  14. };
  15. GLNode()
  16. {
  17. ptr.hp=ptr.tp=NULL;
  18. }
  19. }*List;//List是指向GLNode类型变量的指针类型
  20. class GLists
  21. {
  22. public:
  23. void GetGList(List&);//得到广义表
  24. void CopyGList(List&,List&);//复制广义表
  25. void ListTraverse(List);
  26. int GListDepth(List&);//求广义表深度
  27. private:
  28. void CreatGList(List&,string&);//递归建立广义表
  29. void sever(string&,string&);//存储广义表的字符串处理
  30. };
  31. void GLists::GetGList(List& l)
  32. {
  33. cout<<"Please Input The Lists :"<<endl<<endl;
  34. string str;
  35. cin>>str;
  36. CreatGList(l,str);
  37. }
  38. void GLists::CreatGList(List& l,string& s)//根据给定字符串s,从l递归创建广义表
  39. {
  40. List p,q;//广义表节点类型变量
  41. string sub,hsub;//两个字符串
  42. if(s=="()")//空表
  43. l=NULL;//l置空
  44. else//非空表
  45. {
  46. l=new GLNode;//建立节点
  47. if(s.size()==1)//原子类型
  48. {
  49. l->tag=ATOM;//标志域
  50. l->atom=s[0];//原子
  51. }//if
  52. else//列表类型
  53. {
  54. l->tag=LIST;//标志域
  55. p=l;
  56. sub=s.substr(1,s.size()-2);//脱去括号
  57. do//根据得到的列表字符串建立新的广义表
  58. {
  59. sever(sub,hsub);//得到列表中“最小单位”hsub,然后把sub置成去掉最小单位的剩余字符串
  60. CreatGList(p->ptr.hp,hsub);//递归建立广义表
  61. q=p;//记录p
  62. if(!sub.empty())//为下一个节点提前开辟节点空间
  63. {
  64. p=new GLNode;
  65. p->tag=LIST;//更改标志域
  66. q->ptr.tp=p;//连接节点
  67. }
  68. }while(!sub.empty());
  69. }
  70. }//else
  71. }
  72. void GLists::CopyGList(List& t,List& l)//复制广义表l->t
  73. {
  74. if(!l) t=NULL;//l是空表
  75. else
  76. {
  77. t=new GLNode;//开辟节点
  78. t->tag=l->tag;//标志域
  79. if(l->tag==ATOM)//是原子节点
  80. t->atom=l->atom;//复制原子
  81. else//列表
  82. {
  83. CopyGList(t->ptr.hp,l->ptr.hp);//递归复制表头
  84. CopyGList(t->ptr.tp,l->ptr.tp);//递归复制表尾
  85. }
  86. }
  87. }
  88. int GLists::GListDepth(List& l)//求广义表深度
  89. {
  90. int max=0,dep;
  91. List p=l;
  92. if(l==NULL) return 1;//空表深度为1
  93. if(l->tag==ATOM) return 0;//原子深度为零
  94. //非空列表情况
  95. for(;p;p=p->ptr.tp)//遍历列表
  96. {
  97. dep=GListDepth(p->ptr.hp);//递归求深度
  98. if(dep>max)//更新max
  99. max=dep;
  100. }
  101. return max+1;//返回深度
  102. }
  103. void GLists::sever(string &str,string &hstr)//广义表字符串处理
  104. {//将非空字符串分割成两部分hstr为第一个','之前的部分,str为之后的部分
  105. int n=str.size(),i=0,k=0;
  106. do
  107. {
  108. if(str[i]=='(') k++;
  109. if(str[i]==')') k--;
  110. i++;
  111. }while(i<n&&(str[i]!=','||k!=0));
  112. if(i<n)
  113. {
  114. hstr=str.substr(0,i);
  115. str=str.substr(i+1,n-i-1);
  116. }
  117. else
  118. {
  119. hstr=str;
  120. str.clear();
  121. }
  122. }
  123. void GLists::ListTraverse(List L)//广义表遍历
  124. {
  125. if(L->tag==ATOM)
  126. {
  127. cout<<L->atom<<",";
  128. }
  129. else
  130. {
  131. cout<<"(";
  132. while(L!=NULL)
  133. {
  134. ListTraverse(L->ptr.hp);
  135. L=L->ptr.tp;
  136. }
  137. cout<<")";
  138. }
  139. }




"main.cpp"


  1. #include"glists.h"
  2. int main()
  3. {
  4. GLists gl;
  5. List l,t;
  6. gl.GetGList(l);
  7. gl.CopyGList(t,l);
  8. cout<<gl.GListDepth(l)<<endl;
  9. cout<<gl.GListDepth(t)<<endl;
  10. gl.ListTraverse(l);//遍历广义表
  11. system("pause");
  12. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/675114
推荐阅读
相关标签
  

闽ICP备14008679号