Перевод программы с языка C++ на язык C - C (СИ)
Формулировка задачи:
#include <iostream>
#include <set>
#include <cmath>
struct BNode
{
int key;
BNode* left;
BNode* right;
BNode* parent;
};
BNode* global_root = 0;
bool state = false;
std::set<int> table;
static double curr_node = 0;
static double curr_line = 1;
unsigned get_line()
{
++curr_node;
if ((pow(curr_node, 1/(curr_line))) == 2.0)
{
++curr_line;
}
return curr_line;
}
void put_node(BNode* root, int key, int depth)
{
if (!state)
{
state = true;
get_line();
}
if (curr_line == 1)
{
global_root = new BNode;
global_root->left = global_root->right = 0;
global_root->parent = global_root;
global_root->key = key;
return;
}
if (depth >= curr_line)
{
return;
}
if (!root->left)
{
std::set<int>::iterator i = table.find(key);
if (i == table.end())
{
root->left = new BNode;
root->left->left = root->left->right = 0;
root->left->parent = root;
root->left->key = key;
table.insert(key);
return;
}
}
if (!root->right)
{
std::set<int>::iterator i = table.find(key);
if (i == table.end() && depth < curr_line)
{
root->right = new BNode;
root->right->left = root->right->right = 0;
root->right->parent = root;
root->right->key = key;
table.insert(key);
return;
}
}
if (root->left)
{
put_node(root->left, key, depth+1);
}
if (root->right)
{
put_node(root->right, key, depth+1);
}
}
void show_tree(BNode* root, int lvl)
{
if (!root)
{
return;
}
std::cout << "lvl: " << lvl << "; key: " << root->key << std::endl;
show_tree(root->left, lvl + 1);
show_tree(root->right, lvl + 1);
}
int main()
{
put_node(global_root, 4, 1); state = false;
put_node(global_root, 2, 1); state = false;
put_node(global_root, 6, 1); state = false;
put_node(global_root, 1, 1); state = false;
put_node(global_root, 3, 1); state = false;
put_node(global_root, 5, 1); state = false;
put_node(global_root, 7, 1); state = false;
show_tree(global_root, 1);
}#include <stdio.h>
#include<malloc.h>
typedef enum{false,true}bool;
typedef struct BNode
{
int key;
struct BNode* left;
struct BNode* right;
struct BNode* parent;
}BNode;
BNode* global_root = 0;
bool state = false;
set <int> table;
static double curr_node = 0;
static double curr_line = 1;
unsigned get_line()
{
++curr_node;
if ((pow(curr_node, 1/(curr_line))) == 2.0)
{
++curr_line;
}
return curr_line;
}
void put_node(BNode* root, int key, int depth)
{
int i;
if (!state)
{
state = true;
get_line();
}
if (curr_line == 1)
{
global_root = (BNode*)malloc(sizeof(BNode));
global_root->left = global_root->right = 0;
global_root->parent = global_root;
global_root->key = key;
return;
}
if (depth >= curr_line)
{
return;
}
if (!root->left)
{
std::set<int>::iterator i = table.find(key);
if (i == table.end())
{
root->left=(BNode*)malloc(sizeof(BNode));
root->left->left = root->left->right = 0;
root->left->parent=root;
root->left->key=key;
table.insert(key);
return;
}
}
if (!root->right)
{
std::set<int>::iterator i = table.find(key);
if (i == table.end() && depth < curr_line)
{
root->right = (BNode*)malloc(sizeof(BNode));
root->right->left = root->right->right = 0;
root->right->parent = root;
root->right->key = key;
table.insert(key);
return;
}
}
if (root->left)
{
put_node(root->left, key, depth+1);
}
if (root->right)
{
put_node(root->right, key, depth+1);
}
}
void show_tree(BNode* root, int lvl)
{
if (!root)
{
return;
}
printf("lvl: %d; lvl: %d\n", lvl, root->key);
show_tree(root->left, lvl + 1);
show_tree(root->right, lvl + 1);
}
int main()
{
put_node(global_root, 4, 1); state = false;
put_node(global_root, 2, 1); state = false;
put_node(global_root, 6, 1); state = false;
put_node(global_root, 1, 1); state = false;
put_node(global_root, 3, 1); state = false;
put_node(global_root, 5, 1); state = false;
put_node(global_root, 7, 1); state = false;
show_tree(global_root, 1);
return 0;
}
Посмотрите я перевел все без ошибок, но ответ выводит не правильно
#include <stdio.h>
#include<malloc.h>
typedef enum{false,true}bool;
typedef struct BNode
{
int key;
struct BNode* left;
struct BNode* right;
struct BNode* parent;
}BNode;
BNode* global_root = 0;
bool state = false;
int mas[1000];
static double curr_node = 0.0;
static double curr_line = 1.0;
static double c = 0.0;
static double b = 0.0;
double pow(double curr_node,double b);
unsigned get_line()
{
++curr_node;
b=1.0/(curr_line);
c=pow(curr_node, b);
if(c==2.0)
{
++curr_line;
}
return curr_line;
}
void put_node(BNode* root, int key, int depth)
{
static int i;
if (!state)
{
state = true;
get_line();
}
if (curr_line == 1)
{
global_root = (BNode*)malloc(sizeof(BNode));
global_root->left = global_root->right = 0;
global_root->parent = global_root;
global_root->key = key;
return;
}
if (depth >= curr_line)
{
return;
}
if (!root->left)
{
if (mas[i]==key)
{
root->left=(BNode*)malloc(sizeof(BNode));
root->left->left = root->left->right = 0;
root->left->parent=root;
root->left->key=key;
++i;
mas[i]=key;
return;
}
}
if (!root->right)
{
if (mas[i]==key && depth < curr_line)
{
root->right = (BNode*)malloc(sizeof(BNode));
root->right->left = root->right->right = 0;
root->right->parent = root;
root->right->key = key;
++i;
mas[i]=key;
return;
}
}
if (root->left)
{
put_node(root->left, key, depth+1);
}
if (root->right)
{
put_node(root->right, key, depth+1);
}
}
void show_tree(BNode* root, int lvl)
{
if (!root)
{
return;
}
printf("lvl: %d; lvl: %d\n", lvl, root->key);
show_tree(root->left, lvl + 1);
show_tree(root->right, lvl + 1);
}
int main()
{
put_node(global_root, 4, 1); state = false;
put_node(global_root, 2, 1); state = false;
put_node(global_root, 6, 1); state = false;
put_node(global_root, 1, 1); state = false;
put_node(global_root, 3, 1); state = false;
put_node(global_root, 5, 1); state = false;
put_node(global_root, 7, 1); state = false;
show_tree(global_root, 1);
return 0;
}Решение задачи: «Перевод программы с языка C++ на язык C»
textual
Листинг программы
#include <stdio.h>
#include <set>
#include <math.h>
#include<malloc.h>
typedef enum{f,t}d;
typedef struct BNode
{
int key;
struct BNode* left;
struct BNode* right;
struct BNode* parent;
}BNode;
BNode* global_root = 0;
d state = f;
std::set<int> table;
double curr_node = 0;
double curr_line = 1;
int get_line()
{
++curr_node;
if ((pow(curr_node, 1/(curr_line))) == 2.0)
{
++curr_line;
}
return curr_line;
}
BNode *put_node(BNode* root, int key, int depth)
{
if (!state)
{
state = t;
get_line();
}
if (curr_line == 1)
{
global_root = (BNode*)malloc(sizeof(BNode));
global_root->left = global_root->right = 0;
global_root->parent = global_root;
global_root->key = key;
return global_root;
}
if (depth >= curr_line)
{
return global_root;
}
if (!root->left)
{
std::set<int>::iterator i = table.find(key);
if (i == table.end())
{
root->left = (BNode*)malloc(sizeof(BNode));
root->left->left = root->left->right = 0;
root->left->parent = root;
root->left->key = key;
table.insert(key);
return global_root;
}
}
if (!root->right)
{
std::set<int>::iterator i = table.find(key);
if (i == table.end() && depth < curr_line)
{
root->right = (BNode*)malloc(sizeof(BNode));
root->right->left = root->right->right = 0;
root->right->parent = root;
root->right->key = key;
table.insert(key);
return global_root;
}
}
if (root->left)
{
put_node(root->left, key, depth+1);
}
if (root->right)
{
put_node(root->right, key, depth+1);
}
return global_root;
}
BNode *show_tree(BNode* root, int lvl)
{
if (!root)
{
return global_root;
}
printf("lvl: %d; key: %d\n", lvl, root->key);
show_tree(root->left, lvl + 1);
show_tree(root->right, lvl + 1);
return global_root;
}
int main()
{
global_root=put_node(global_root, 1, 1); state = f;
global_root=put_node(global_root, 2, 1); state = f;
global_root=put_node(global_root, 3, 1); state = f;
global_root=put_node(global_root, 4, 1); state = f;
global_root=put_node(global_root, 5, 1); state = f;
global_root=put_node(global_root, 6, 1); state = f;
global_root=put_node(global_root, 7, 1); state = f;
global_root=show_tree(global_root, 1);
return 0;
}
Объяснение кода листинга программы
- Объявлены переменные:
global_root(указатель на узел)state(флаг типаenum)table(множество для хранения ключей)curr_node(текущий номер узла)curr_line(текущая линия для построения дерева)get_line(функция для получения следующего номера узла)put_node(функция для добавления узла в дерево)show_tree(функция для вывода дерева на экран)main(основная функция программы)
- В функции
mainсоздаются первые узлы и вызывается функцияshow_treeдля вывода дерева на экран. - В функции
get_lineвычисляется следующий номер узла, используя формулуpow(curr_node, 1/(curr_line)). Если результат равен 2.0, то увеличиваетсяcurr_line. - В функции
put_nodeвыполняется следующие действия:- Если
stateравноf, то устанавливается значениеstateравнымt. - Если
curr_lineравно 1, то создается новый узел и добавляется в дерево. - Если
depthбольше или равноcurr_line, то выполняется рекурсивный вызов функцииput_nodeдля правого поддерева. - Если узел с ключом
keyуже есть в дереве, то выполняется рекурсивный вызов функцииput_nodeдля левого поддерева. - Если узел с ключом
keyне найден в дереве иdepthменьшеcurr_line, то создается новый узел и добавляется в дерево. - Если узел с ключом
keyне найден в дереве иdepthравноcurr_line, то выполняется рекурсивный вызов функцииput_nodeдля правого поддерева.
- Если
- В функции
show_treeвыводится информация о каждом узле дерева. - В основной функции программы вызывается функция
main.