鱼C论坛

 找回密码
 立即注册
查看: 2689|回复: 8

[已解决]一个关于二叉树初始化调试无法读取内存的问题

[复制链接]
发表于 2018-3-31 20:44:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
捕获.PNG
这说明这个二叉树根本没有联系在一起吧,
  1. #pragma once
  2. #include<iostream>
  3. #include<string>
  4. template <class T>
  5. struct treenode
  6. {
  7.         T data;
  8.         bool ltag;
  9.         bool rtag;
  10.         treenode<T> *lchild;
  11.         treenode<T> *rchild;
  12. };
  13. template <class T>
  14. class BinaryTree
  15. {
  16. public:
  17.         BinaryTree();
  18.         ~BinaryTree();
  19.         void middle(treenode<T> *t);
  20.         void clue();
  21. private:
  22. void createtree(treenode<T> *t);
  23.         treenode<T> *head,*pre,*p,*t;
  24.         T c;
  25. };


  26. template<class T>
  27. BinaryTree<T>::BinaryTree()
  28. {
  29.         createtree(t);
  30.         clue();
  31. }
  32. template<class T>
  33. BinaryTree<T>::~BinaryTree()
  34. {
  35. }

  36. template<class T>
  37. void BinaryTree<T>::middle(treenode<T>* t)
  38. {
  39.         if (t)
  40.         {
  41.                 middle(t->lchild);
  42.                 if (!t->lchild)
  43.                 {
  44.                         t->ltag = 1;
  45.                         t->lchild = pre;
  46.                 }
  47.                 if (!pre->rchild)
  48.                 {
  49.                         pre->rtag = 1;
  50.                         pre->rchild = t;
  51.                 }
  52.                 pre = t;
  53.                 middle(t->rchild);
  54.         }
  55. }

  56. template<class T>
  57. void BinaryTree<T>::clue()
  58. {
  59.         treenode<T> *s = new treenode<T>;
  60.         s->ltag = 0;
  61.         s->rtag = 1;
  62.         s->rchild = head;
  63.         if (!head)
  64.         {
  65.                 s->lchild = s;
  66.         }
  67.         else
  68.         {
  69.                 s->lchild = head;
  70.                 pre = s;
  71.                 middle(head);
  72.                 pre->rchild = p;
  73.                 pre->rtag = 1;
  74.                 s->rchild = pre;
  75.         }
  76. }
  77. int mbf=1;//我是实在没办法才搞了这个东西,它存在的目的是为了让93行的if只在开始的时候执行一次
  78. template<class T>
  79. void BinaryTree<T>::createtree(treenode<T> *t)
  80. {
  81.         std::cin >> c;
  82.         if ('#' == c)
  83.         {
  84.                 t = NULL;
  85.         }
  86.         else
  87.         {
  88.                 t = new treenode<T>;
  89.                 if (mbf==1)
  90.                 {
  91.                         head = t;
  92.                         mbf--;
  93.                 }
  94.                 t->data = c;
  95.                 t->ltag = 0;
  96.                 t->rtag = 0;
  97.                 createtree(t->lchild);
  98.                 createtree(t->rchild);
  99.         }
  100. }
复制代码

还有main
  1. #include<iostream>
  2. #include"标头.h"
  3. #include<string>
  4. int main()
  5. {
  6.         BinaryTree<char> shu;
  7.        
  8.         return 0;
  9. }
复制代码
最佳答案
2018-4-1 23:01:13
这一次修改,去掉了
“int mbf = 1;//我是实在没办法才搞了这个东西,它存在的目的是为了让93行的if只在开始的时候执行一次”

  1. #include<iostream>
  2. #include<string>

  3. template <class T>
  4. struct treenode
  5. {
  6.         T data;
  7.         bool ltag;
  8.         bool rtag;
  9.         treenode<T> *lchild;
  10.         treenode<T> *rchild;
  11. };

  12. template <class T>
  13. class BinaryTree
  14. {
  15. public:
  16.         BinaryTree();
  17.         ~BinaryTree();
  18.         void middle(treenode<T> *t);
  19.         void clue();
  20. private:
  21.         void createtree(treenode<T> **t);
  22.         treenode<T> *head, *pre, *p, *t;
  23.         T c;
  24. };

  25. template<class T>
  26. BinaryTree<T>::BinaryTree()
  27. {
  28.         head = NULL;
  29.         createtree(&head);
  30.         clue();
  31. }

  32. template<class T>
  33. BinaryTree<T>::~BinaryTree()
  34. {
  35. }

  36. template<class T>
  37. void BinaryTree<T>::middle(treenode<T> *t)
  38. {
  39.         if(t)
  40.         {
  41.                 middle(t->lchild);
  42.                 if(!t->lchild)
  43.                 {
  44.                         t->ltag = 1;
  45.                         t->lchild = pre;
  46.                 }
  47.                 if(!pre->rchild)
  48.                 {
  49.                         pre->rtag = 1;
  50.                         pre->rchild = t;
  51.                 }
  52.                 pre = t;
  53.                 middle(t->rchild);
  54.         }
  55. }

  56. template<class T>
  57. void BinaryTree<T>::clue()
  58. {
  59.         treenode<T> *s = new treenode<T>;
  60.         s->ltag = 0;
  61.         s->rtag = 1;
  62.         s->rchild = head;
  63.         if(!head)
  64.         {
  65.                 s->lchild = s;
  66.         }
  67.         else
  68.         {
  69.                 s->lchild = head;
  70.                 pre = s;
  71.                 middle(head);
  72.                 pre->rchild = p;
  73.                 pre->rtag = 1;
  74.                 s->rchild = pre;
  75.         }
  76. }

  77. template<class T>
  78. void BinaryTree<T>::createtree(treenode<T> **t)
  79. {
  80.         std::cin >> c;
  81.         if('#' == c)
  82.         {
  83.                 *t = NULL;
  84.         }
  85.         else
  86.         {
  87.                 *t = new treenode<T>;
  88.                 (*t)->data = c;
  89.                 (*t)->ltag = 0;
  90.                 (*t)->rtag = 0;

  91.                 createtree(&(*t)->lchild);
  92.                 createtree(&(*t)->rchild);
  93.         }
  94. }

  95. int main(void)
  96. {
  97.         BinaryTree<char> shu;

  98.         return 0;
  99. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-31 20:48:54 | 显示全部楼层
在createtree方法里下了断点,在生成了左右孩子之后,head的左右孩子指针显示无法读取内存
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-1 13:34:43 | 显示全部楼层
很懵逼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-1 15:02:12 | 显示全部楼层
”在生成了左右孩子之后,head的左右孩子指针显示无法读取内存”
那是因为你没有修改了head的左右孩子指针

101和102行
createtree(t->lchild);
createtree(t->rchild);

告诉我,要修改一个变量的内容,如何做?
对,没错,要传地址

明白了的话自己改代码吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-1 15:08:55 | 显示全部楼层
  1. #include<iostream>
  2. #include<string>

  3. template <class T>
  4. struct treenode
  5. {
  6.         T data;
  7.         bool ltag;
  8.         bool rtag;
  9.         treenode<T> *lchild;
  10.         treenode<T> *rchild;
  11. };

  12. template <class T>
  13. class BinaryTree
  14. {
  15. public:
  16.         BinaryTree();
  17.         ~BinaryTree();
  18.         void middle(treenode<T> *t);
  19.         void clue();
  20. private:
  21.         void createtree(treenode<T> *t);
  22.         treenode<T> *head, *pre, *p, *t;
  23.         T c;
  24. };

  25. template<class T>
  26. BinaryTree<T>::BinaryTree()
  27. {
  28.         createtree(t);
  29.         clue();
  30. }

  31. template<class T>
  32. BinaryTree<T>::~BinaryTree()
  33. {
  34. }

  35. template<class T>
  36. void BinaryTree<T>::middle(treenode<T> *t)
  37. {
  38.         if(t)
  39.         {
  40.                 middle(t->lchild);
  41.                 if(!t->lchild)
  42.                 {
  43.                         t->ltag = 1;
  44.                         t->lchild = pre;
  45.                 }
  46.                 if(!pre->rchild)
  47.                 {
  48.                         pre->rtag = 1;
  49.                         pre->rchild = t;
  50.                 }
  51.                 pre = t;
  52.                 middle(t->rchild);
  53.         }
  54. }

  55. template<class T>
  56. void BinaryTree<T>::clue()
  57. {
  58.         treenode<T> *s = new treenode<T>;
  59.         s->ltag = 0;
  60.         s->rtag = 1;
  61.         s->rchild = head;
  62.         if(!head)
  63.         {
  64.                 s->lchild = s;
  65.         }
  66.         else
  67.         {
  68.                 s->lchild = head;
  69.                 pre = s;
  70.                 middle(head);
  71.                 pre->rchild = p;
  72.                 pre->rtag = 1;
  73.                 s->rchild = pre;
  74.         }
  75. }

  76. template<class T>
  77. void SetVal(treenode<T> *t)
  78. {
  79.         t = NULL;
  80. }

  81. template<class T>
  82. void SetVal(treenode<T> **t)
  83. {
  84.         *t = NULL;
  85. }


  86. int mbf = 1;//我是实在没办法才搞了这个东西,它存在的目的是为了让93行的if只在开始的时候执行一次
  87. template<class T>
  88. void BinaryTree<T>::createtree(treenode<T> *t)
  89. {
  90.         std::cin >> c;
  91.         if('#' == c)
  92.         {
  93.                 t = NULL;
  94.         }
  95.         else
  96.         {
  97.                 t = new treenode<T>;
  98.                 if(mbf == 1)
  99.                 {
  100.                         head = t;
  101.                         mbf--;
  102.                 }
  103.                 t->data = c;
  104.                 t->ltag = 0;
  105.                 t->rtag = 0;

  106.                 //debug
  107.                 std::cout << t->lchild << std::endl;
  108.                 SetVal(t->lchild);
  109.                 std::cout << t->lchild << std::endl;
  110.                 SetVal(&t->lchild);
  111.                 std::cout << t->lchild << std::endl;
  112.                 exit(1);

  113.                 createtree(t->lchild);
  114.                 createtree(t->rchild);
  115.         }
  116. }

  117. int main(void)
  118. {
  119.         BinaryTree<char> shu;

  120.         return 0;
  121. }

复制代码

  1. 0
  2. CDCDCDCD
  3. CDCDCDCD
  4. 00000000
  5. 请按任意键继续. . .
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-1 22:21:09 | 显示全部楼层

head和t是指向treenode结构的指针,声明一块treenode类型的内存让t指向他,让head也指向那块内存 捕获.PNG
然后把t->lchild传入递归,t->lchild就变成新的t了吧,然后声明一块treenode内存让t->lchild指向他 捕获1.PNG 我是这样想的,lchild是指针啊,不明白,我还想过t是指针,*t才是指向内存的本身,然后改成了createtree((*t)->lchild);createtree((*t)->rchild);然后报错了
               
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-1 22:55:06 | 显示全部楼层
未灭时间 发表于 2018-4-1 22:21
head和t是指向treenode结构的指针,声明一块treenode类型的内存让t指向他,让head也指向那块内存
然后把 ...

建议你深入学习C语言的指针部分



这样应该就可以了吧
  1. #include<iostream>
  2. #include<string>

  3. template <class T>
  4. struct treenode
  5. {
  6.         T data;
  7.         bool ltag;
  8.         bool rtag;
  9.         treenode<T> *lchild;
  10.         treenode<T> *rchild;
  11. };

  12. template <class T>
  13. class BinaryTree
  14. {
  15. public:
  16.         BinaryTree();
  17.         ~BinaryTree();
  18.         void middle(treenode<T> *t);
  19.         void clue();
  20. private:
  21.         void createtree(treenode<T> **t);
  22.         treenode<T> *head, *pre, *p, *t;
  23.         T c;
  24. };

  25. template<class T>
  26. BinaryTree<T>::BinaryTree()
  27. {
  28.         createtree(&t);
  29.         clue();
  30. }

  31. template<class T>
  32. BinaryTree<T>::~BinaryTree()
  33. {
  34. }

  35. template<class T>
  36. void BinaryTree<T>::middle(treenode<T> *t)
  37. {
  38.         if(t)
  39.         {
  40.                 middle(t->lchild);
  41.                 if(!t->lchild)
  42.                 {
  43.                         t->ltag = 1;
  44.                         t->lchild = pre;
  45.                 }
  46.                 if(!pre->rchild)
  47.                 {
  48.                         pre->rtag = 1;
  49.                         pre->rchild = t;
  50.                 }
  51.                 pre = t;
  52.                 middle(t->rchild);
  53.         }
  54. }

  55. template<class T>
  56. void BinaryTree<T>::clue()
  57. {
  58.         treenode<T> *s = new treenode<T>;
  59.         s->ltag = 0;
  60.         s->rtag = 1;
  61.         s->rchild = head;
  62.         if(!head)
  63.         {
  64.                 s->lchild = s;
  65.         }
  66.         else
  67.         {
  68.                 s->lchild = head;
  69.                 pre = s;
  70.                 middle(head);
  71.                 pre->rchild = p;
  72.                 pre->rtag = 1;
  73.                 s->rchild = pre;
  74.         }
  75. }

  76. int mbf = 1;//我是实在没办法才搞了这个东西,它存在的目的是为了让93行的if只在开始的时候执行一次
  77. template<class T>
  78. void BinaryTree<T>::createtree(treenode<T> **t)
  79. {
  80.         std::cin >> c;
  81.         if('#' == c)
  82.         {
  83.                 *t = NULL;
  84.         }
  85.         else
  86.         {
  87.                 *t = new treenode<T>;
  88.                 if(mbf == 1)
  89.                 {
  90.                         head = *t;
  91.                         mbf--;
  92.                 }
  93.                 (*t)->data = c;
  94.                 (*t)->ltag = 0;
  95.                 (*t)->rtag = 0;

  96.                 createtree(&(*t)->lchild);
  97.                 createtree(&(*t)->rchild);
  98.         }
  99. }

  100. int main(void)
  101. {
  102.         BinaryTree<char> shu;

  103.         return 0;
  104. }
复制代码



另外参考这个代码
这是百度的
  1. #include <cstdio>
  2. #include <cstdlib>

  3. #define ElemType char
  4. //节点声明,数据域、左孩子指针、右孩子指针
  5. typedef struct BiTNode {
  6.         char data;
  7.         struct BiTNode *lchild, *rchild;
  8. }BiTNode, *BiTree;
  9. //先序建立二叉树
  10. BiTree CreateBiTree() {
  11.         char ch;
  12.         BiTree T;
  13.         scanf("%c", &ch);
  14.         if(ch == '#')T = NULL;
  15.         else {
  16.                 T = (BiTree)malloc(sizeof(BiTNode));
  17.                 T->data = ch;
  18.                 T->lchild = CreateBiTree();
  19.                 T->rchild = CreateBiTree();
  20.         }
  21.         return T;//返回根节点
  22. }
  23. //先序遍历二叉树
  24. void PreOrderTraverse(BiTree T) {
  25.         if(T) {
  26.                 printf("%c", T->data);
  27.                 PreOrderTraverse(T->lchild);
  28.                 PreOrderTraverse(T->rchild);
  29.         }
  30. }

  31. //中序遍历
  32. void InOrderTraverse(BiTree T) {
  33.         if(T) {
  34.                 PreOrderTraverse(T->lchild);
  35.                 printf("%c", T->data);
  36.                 PreOrderTraverse(T->rchild);
  37.         }
  38. }
  39. //后序遍历
  40. void PostOrderTraverse(BiTree T) {
  41.         if(T) {
  42.                 PreOrderTraverse(T->lchild);
  43.                 PreOrderTraverse(T->rchild);
  44.                 printf("%c", T->data);
  45.         }
  46. }
  47. int main(void) {
  48.         BiTree T;
  49.         T = CreateBiTree();//建立
  50.         PreOrderTraverse(T);//输出
  51.        
  52.         return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-1 23:01:13 | 显示全部楼层    本楼为最佳答案   
这一次修改,去掉了
“int mbf = 1;//我是实在没办法才搞了这个东西,它存在的目的是为了让93行的if只在开始的时候执行一次”

  1. #include<iostream>
  2. #include<string>

  3. template <class T>
  4. struct treenode
  5. {
  6.         T data;
  7.         bool ltag;
  8.         bool rtag;
  9.         treenode<T> *lchild;
  10.         treenode<T> *rchild;
  11. };

  12. template <class T>
  13. class BinaryTree
  14. {
  15. public:
  16.         BinaryTree();
  17.         ~BinaryTree();
  18.         void middle(treenode<T> *t);
  19.         void clue();
  20. private:
  21.         void createtree(treenode<T> **t);
  22.         treenode<T> *head, *pre, *p, *t;
  23.         T c;
  24. };

  25. template<class T>
  26. BinaryTree<T>::BinaryTree()
  27. {
  28.         head = NULL;
  29.         createtree(&head);
  30.         clue();
  31. }

  32. template<class T>
  33. BinaryTree<T>::~BinaryTree()
  34. {
  35. }

  36. template<class T>
  37. void BinaryTree<T>::middle(treenode<T> *t)
  38. {
  39.         if(t)
  40.         {
  41.                 middle(t->lchild);
  42.                 if(!t->lchild)
  43.                 {
  44.                         t->ltag = 1;
  45.                         t->lchild = pre;
  46.                 }
  47.                 if(!pre->rchild)
  48.                 {
  49.                         pre->rtag = 1;
  50.                         pre->rchild = t;
  51.                 }
  52.                 pre = t;
  53.                 middle(t->rchild);
  54.         }
  55. }

  56. template<class T>
  57. void BinaryTree<T>::clue()
  58. {
  59.         treenode<T> *s = new treenode<T>;
  60.         s->ltag = 0;
  61.         s->rtag = 1;
  62.         s->rchild = head;
  63.         if(!head)
  64.         {
  65.                 s->lchild = s;
  66.         }
  67.         else
  68.         {
  69.                 s->lchild = head;
  70.                 pre = s;
  71.                 middle(head);
  72.                 pre->rchild = p;
  73.                 pre->rtag = 1;
  74.                 s->rchild = pre;
  75.         }
  76. }

  77. template<class T>
  78. void BinaryTree<T>::createtree(treenode<T> **t)
  79. {
  80.         std::cin >> c;
  81.         if('#' == c)
  82.         {
  83.                 *t = NULL;
  84.         }
  85.         else
  86.         {
  87.                 *t = new treenode<T>;
  88.                 (*t)->data = c;
  89.                 (*t)->ltag = 0;
  90.                 (*t)->rtag = 0;

  91.                 createtree(&(*t)->lchild);
  92.                 createtree(&(*t)->rchild);
  93.         }
  94. }

  95. int main(void)
  96. {
  97.         BinaryTree<char> shu;

  98.         return 0;
  99. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-2 17:11:27 | 显示全部楼层
人造人 发表于 2018-4-1 23:01
这一次修改,去掉了
“int mbf = 1;//我是实在没办法才搞了这个东西,它存在的目的是为了让93行的if只在开 ...

非常感谢,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 20:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表