Автор: Matadora 25.9.2010, 14:47
будете смеяться, но я не могу сделать вроде простую и стандартную программу по строению бинарного дерева
в общем, условие такое:
Постройте дерево двоичного поиска для такого списка ключей: 6 17 21 35 46 51 59 66 78 83
я шарилась по сети и нашла одну программу которая по идее должна выводить дерево, вот ее код, НО ОНА ЭТОГО НЕ ДЕЛАЕТ! вредная Х_Х подскажите что в ней не так или дайте наводку на норм код
Код
#include<stdlib.h>
#include<stdio.h>
struct tree{
char info;
struct tree *left;
struct tree *right;
};
struct tree *root; //verhuna dereva pochatkova
struct tree *stree(struct tree *root, struct tree *r, char info);
void print_tree(struct tree *root, int l);
int main(void)
{
char s[10];
root=NULL;
do
{
printf("Enter the sumbol: ");
gets(s);
root=stree(root, root, *s);
}while(*s);
print_tree(root, 0);
return 0;
}
struct tree *stree(struct tree *root, struct tree *r, char info)
{
if(!r)
{
r=(struct tree *) malloc(sizeof(struct tree));
if(!r)
{
printf("ne vustachaye pamyati\n");
exit(0);
}
r->left=NULL;
r->right=NULL;
r->info=info;
if(!root) return r;
if(info<root->info) root->left=r;
else root->right=r;
return r;
}
if(info<r->info) stree(r, r->left, info);
else stree(r, r->right, info);
return root;
}
void print_tree(struct tree *r, int l)
{
int i;
if(!r) return;
print_tree(r->right, l+1);
for(i=0; i;r->info);
print_tree(r->left, l+1);
}
Автор: Vahappaday 25.9.2010, 15:05
Это дерево элементов типа char.
Надо переделать в Вашем случае под int.
Либо переделайте сами, либо чуть-чуть подождите - освобожусь немного и исправлю.
Хотя.... полезней было бы разобраться самостоятельно.
Чтение вместо gets сделать scanf'ом - он возвращает значение в зависимости от количества распознанных вхождений.
А дальше разница небольшая...
Единственное что, я бы сделал вывод покрасивее, с отступами.
Автор: Vahappaday 25.9.2010, 19:52
Код
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
struct tree{
int info;
struct tree *left;
struct tree *right;
};
struct tree *root; //verhuna dereva pochatkova
struct tree *stree(struct tree *root, struct tree *r, int info);
void print_tree(struct tree *root, int l);
int main(void)
{
int s;
root=NULL;
printf("Enter the sumbol: ");
while(scanf("%d",&s))
{
printf("Enter the sumbol: ");
root=stree(root, root, s);
}
print_tree(root, 0);
getch();
return 0;
}
struct tree *stree(struct tree *root, struct tree *r, int info)
{
if(!r)
{
r=(struct tree *) malloc(sizeof(struct tree));
if(!r)
{
printf("ne vustachaye pamyati\n");
exit(0);
}
r->left=NULL;
r->right=NULL;
r->info=info;
if(!root) return r;
if(info<root->info) root->left=r;
else root->right=r;
return r;
}
if(info<r->info) stree(r, r->left, info);
else stree(r, r->right, info);
return root;
}
void print_tree(struct tree *r, int l)
{
int i;
if(!r) return;
print_tree(r->right, l+1);
for(i=0;i<l;i++) printf(" ");
printf("%d\n", r->info);
print_tree(r->left, l+1);
}
getch(); - щоб чекав у кінці натиснення клавіши.
компілював у студії, так що чи не скомпілиться - пиши.
Автор: tig81 25.9.2010, 20:27
Цитата(Vahappaday @ 25.9.2010, 22:52)

getch(); - щоб чекав у кінці натиснення клавіши.
компілював у студії, так що чи не скомпілиться - пиши.
Липецкие программисты розуміють українську мову?
Автор: Vahappaday 26.9.2010, 7:51
Чому б ні? Іноді практикую щоб не запам'ятати.
У мене просто родичи в Луцькі є))
Автор: tig81 26.9.2010, 8:27
Цитата(Vahappaday @ 26.9.2010, 10:51)

щоб не запам'ятати.
щоб не забути.
Цитата
У мене просто родичи в Луцькі є))
Зрозуміло.
Автор: Vahappaday 26.9.2010, 8:35
ой... наоборот, правда :-[
Единственно что напрягает - это 4 раскладки...(( Пунто свитчер с ними не работает. У меня ещё канадская французская со значками