Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Ограничение на количество узлов в дереве


Автор: lenarano 12.5.2015, 16:19
В задании по созданию бинарного дерева есть условие на то, что узлов в дереве должно быть не больше 10. Пробую поставить такое ограничение в функции add_node с помощью счетчика и условия, что добавлять новые звенья нужно только до 10. Ранее да того как начала работать над ограничением на размер выводилось все из файлов). Сейчас, если использую  while(count<=10), то выводится в файл только 1 ключ и строка. Если использую if(count<= 10), то выводится все из файлов без какого-либо ограничения и счетчик опять всегда равен 1. Что я делаю не так? Как правильно реализовать условие?

Код

//TreeNode.h
#pragma once
#ifndef __TREENODE_H__
#define __TREENODE_H__
#include <iomanip>
#include <string>


class TreeNode //Звено дерева
{  private:
    int key; //Ключ
    std::string polinom;//Строку записываем
    TreeNode *leftPtr,*rightPtr;
    public:
   void show(TreeNode *&Tree);
   void add_node(int x,std::string p,TreeNode *&MyTree);
   bool is_palindrome(const std::string &word);
};
#endif




Код

//TreeNode.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include <iomanip>
#include <cctype>
#include "TreeNode.h"




void TreeNode::show(TreeNode *&Tree) //Функция обхода
{  
    {if (Tree!=NULL) 
    {
        show(Tree->leftPtr);
        std::cout<<Tree->key; 
        std::cout<<" ";
        std::cout<<Tree->polinom;
        std::cout<<"\n"; 
        show(Tree->rightPtr); 
    }
    }
}
void TreeNode::add_node(int x,std::string p,TreeNode *&MyTree) //Функция добавления звена в дерево
{  
    int count=0;
    if(count<=10)
    {if (NULL==MyTree)  
    {
        MyTree=new TreeNode; 
        MyTree->key=x;
        MyTree->polinom=p;
        MyTree->leftPtr=MyTree->rightPtr=NULL;
        count++;
        std::cout <<count;
    }

    if (x<MyTree->key)   
    {
        if (MyTree->leftPtr!=NULL) add_node(x,p,MyTree->leftPtr); 
        else 
        {
            MyTree->leftPtr=new TreeNode;  
            MyTree->leftPtr->leftPtr=MyTree->leftPtr->rightPtr=NULL; 
            MyTree->leftPtr->key=x;
            MyTree->leftPtr->polinom=p;
            count++;
            std::cout <<count;
        }
    }

    if (x>MyTree->key)   
    {
        if (MyTree->rightPtr!=NULL) add_node(x,p,MyTree->rightPtr); 
        else 
        {
            MyTree->rightPtr=new TreeNode;  
            MyTree->rightPtr->leftPtr=MyTree->rightPtr->rightPtr=NULL; 
            MyTree->rightPtr->key=x; 
            MyTree->rightPtr->polinom=p; 
            count++;
            std::cout <<count;
        }
    }
    }
}

bool TreeNode::is_palindrome(const std::string &stroka) {
   for (size_t i = 0; i < stroka.length()/2; ++i) {
      if (tolower(stroka[i]) != tolower(stroka[stroka.length() - i - 1]))
         return false;
   }
   
   return true;
}







Код

//KodTreeNode.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include <iomanip>
#include "TreeNode.h"


int main()
{  SetConsoleCP(1251);
SetConsoleOutputCP(1251);

TreeNode *Tree=NULL;  
TreeNode Derevo;
std::ifstream imput_fail_key;
std::ifstream imput_fail_stroki;
imput_fail_key.open("key.txt", std::ios::in);
imput_fail_stroki.open("stroki.txt", std::ios::in);
if (!imput_fail_key.is_open()||!imput_fail_stroki.is_open()) // если файл не открыт
    std::cout << "Файл не может быть открыт!\n"; // сообщить об этом
std::cout << "Вывод содержимого файла key.txt и файла stroki.txt. \n";
while(!imput_fail_key.eof()&&!imput_fail_stroki.eof())
{   int k;
std::string line;
imput_fail_key>> k; // считали число из файла
getline(imput_fail_stroki, line);// считали строку из файла
std::cout << k << " " <<line<< std::endl;// напечатали это число и слово
Derevo.add_node(k, line.substr(0, 20), Tree);//возвращает 20 символов строки line начиная с позиции 0
}
std::cout << std::endl;
std::cout << "Исходное дерево:\n";
imput_fail_key.close();
imput_fail_stroki.close();
Derevo.show(Tree); 
std::cout << "Реализуем функцию, которая оставит в дереве только полиндромы:\n";
/*(до тех пор пока встречаются строки в TreeNode.polinom)
if(is_palindrome.polinom возвращает 1)
    оставляем в дереве
else (удаляем)
Вывод дерева.*/

std::cin.get();
return 0;
}  

Автор: feodorv 12.5.2015, 18:04
Цитата(lenarano @  12.5.2015,  16:19 Найти цитируемый пост)
с помощью счетчика

Счетчик-то у Вас локальный. Что толку объявить в функции добавления
Цитата(lenarano @  12.5.2015,  16:19 Найти цитируемый пост)
    int count=0;

При вызове add_node у Вас всегда будет count равняться 0, вне зависимости от предыдущих вызовов этой функции. Вы бы уж определили бы count как static, а ещё лучше ввели static переменную в самом классе TreeNode, http://alexandrsoldatkin.com/static-tchlen-i-metod-klassa/.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)