IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Помогите написать программу на бинарное дерево. язык С
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Задание звучит так. Древовидная структура строится из вершин, состоящих из двух полей: поля данных и указателя. Указатель ссылается на вспомогательный список, с помощью которого устанавливается связь текущей вершины с вершиной нижнего уровня. Каждый элемент этого списка содержит указатель на соседний элемент вспомогательного списка и на одну вершину нижнего уровня.
Я написал эту прогу, но у меня используются 4 указателя. Вот моя прога. Если можете исправьте ее.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct uzel
{
int el;
struct uzel *s1;
struct uzel *s2;
struct uzel *s3;
struct uzel *s4;
} *koren;

char main_menu[10];
int j, nachalo, n, res;

struct uzel *init(struct uzel *kn);
void add(struct uzel *kn, int &nach);
void prisoedinenie(struct uzel *ke, struct uzel *ne);
struct uzel *del_el(struct uzel *kn, int &nach, int &itog);
struct uzel *recdel_el(struct uzel *bn, int del, int &it);
struct uzel *del_tr(struct uzel *kn, int nach);
void save(struct uzel *kn, int nach);
void recsave(struct uzel *kn, int order, FILE *bf, int k, int mas[], int max);
struct uzel *load(struct uzel *kn, int &nach);
void recload(struct uzel *bn, struct uzel *nel, char us[], int nomer);
void write(struct uzel *kn, int order, int i);
int lot(struct uzel *kn, int &l, int i);

void main()
{

clrscr();
koren=NULL; nachalo=1; n=0;
while (1)
{
printf("1-inicializacia dereva\n");
printf("2-dobavlenie novogo elementa v derevo\n3-udalenie elementa iz dereva s unichtozheniem poddereva podchinennih elementov\n");
printf("4-udalenie dereva iz osnovnoy pamiati\n5-zapis dereva v fayl\n");
printf("6-zagruzka dereva iz fayla\n7-vivod dereva\n8-vihod\n");
printf("\nvvedite nomer punkta menu\n");
scanf("%s", main_menu);

switch(main_menu[0])
{
case '1':
koren=init(koren);
break;
case '2':
add(koren, nachalo);
break;
case '3':
{
if (koren!=NULL)
{
if (nachalo==1) {printf("derevo ne soderzhit ni odnogo elementa\n");}
else
{
res=0;
koren=del_el(koren, nachalo, res);
if (res==1) {printf("element i podchinennoe emu podderevo uspeshno udaleni\n");}
else {printf("derevo ne soderzhit takogo elementa\n");}
}
}
else {printf("derevo ne sushestvuet\n");}
}
break;
case '4':
{
if (koren!=NULL)
{
koren=del_tr(koren, nachalo);
nachalo=1;
printf("derevo uspeshno udaleno\n");
}
else {printf("derevo ne sushestvuet\n");}
}
break;
case '5':
save(koren, nachalo);
break;
case '6':
koren=load(koren, nachalo);
break;
case '7':
if (koren==NULL) {printf("derevo ne sushestvuet\n");}
else
{
if (nachalo==1) {printf("derevo ne soderzhit ni odnogo elementa\n");}
else
{
clrscr();
n=lot(koren, n, 0);
for (j=1; j<=n; j++) {write(koren, j, 1); printf("\n");}
}
}
break;
case '8':
return;
default:
printf("neizvestnaya komanda\n\n");
}

printf("nazhmite lubuyu klavishu");
getch();
clrscr();
}
}

struct uzel *init(struct uzel *kn)
{

int fli;

if (kn!=NULL)
{
printf("v osnovnuyu pamiat uzhe zagruzheno derevo!\npri sozdanii novogo dereva vsia nesohranennaya informaciya budet poteriana\n");
printf("recomenduetsia pered inicializaciey novogo dereva udalit predidushee s pomoshyu sootvetstvuyushey funnkcii v glavnom menu\n");
printf("sozdat novoe derevo\n 1-da 2-net\n");
scanf("%d", &fli);
if (fli==2) {printf("deystvie otmeneno polzovatelem\n"); return kn;}
}

if ((kn=(struct uzel *)malloc(sizeof(struct uzel)))==NULL)
{
printf("nedostatochno pamiati\n");
return kn;
}

printf("sozdano novoe derevo\n");
return kn;
}

void add(struct uzel *kn, int &nach)
{
struct uzel *nn;

if (kn==NULL) {printf("derevo ne zagruzheno v osnovnuyu pamiat: proizvedite zagruzku iz fayla\nili sozdayte novoe derevo\n"); return;}
if (nach==1)
{
printf("vvedite znachenie pervogo elementa\n");
scanf("%d", &kn->el);
kn->s1=NULL;
kn->s2=NULL;
kn->s3=NULL;
kn->s4=NULL;
nach=0;
return;
}
if (nach==0)
{
if ((nn=(struct uzel *)malloc(sizeof(struct uzel)))==NULL)
{
printf("nedostatochno pamiati\n");
}
else
{
printf("vvedite znachenie novogo elementa\n");
scanf("%d", &nn->el);
nn->s1=NULL;
nn->s2=NULL;
nn->s3=NULL;
nn->s4=NULL;
prisoedinenie(kn, nn);
}
}
printf("uzel dobavlen\n");
}

void prisoedinenie(struct uzel *ke, struct uzel *ne)
{
int fli;

clrscr();
printf("viberite deystvie\n1 - ");
if (ke->s1==NULL) {printf("prisoedinit element v kachestve 1 vetvi\n");} else {printf("pereyti v 1 vetv\n");}
printf("2 - ");
if (ke->s2==NULL) {printf("prisoedinit element v kachestve 2 vetvi\n");} else {printf("pereyti vo 2 vetv\n");}
printf("3 - ");
if (ke->s3==NULL) {printf("prisoedinit element v kachestve 3 vetvi\n");} else {printf("pereyti v 3 vetv\n");}
printf("4 - ");
if (ke->s4==NULL) {printf("prisoedinit element v kachestve 4 vetvi\n");} else {printf("pereyti v 4 vetv\n");}
scanf("%d", &fli);
if ((fli==1)&(ke->s1==NULL)) {ke->s1=ne; return;}
if ((fli==2)&(ke->s2==NULL)) {ke->s2=ne; return;}
if ((fli==3)&(ke->s3==NULL)) {ke->s3=ne; return;}
if ((fli==4)&(ke->s4==NULL)) {ke->s4=ne; return;}

if ((fli==1)&(ke->s1!=NULL)) {prisoedinenie(ke->s1, ne);}
if ((fli==2)&(ke->s2!=NULL)) {prisoedinenie(ke->s2, ne);}
if ((fli==3)&(ke->s3!=NULL)) {prisoedinenie(ke->s3, ne);}
if ((fli==4)&(ke->s4!=NULL)) {prisoedinenie(ke->s4, ne);}
}

struct uzel *del_el(struct uzel *kn, int &nach, int &itog)
{
int delel;

printf("ukazhite udaliaemiy element\n");
scanf("%d", &delel);

if (kn->el==delel) {kn=del_tr(koren, nach); nach=1; itog=1; return kn;}
else
{
if (kn->s1!=NULL) {kn->s1=recdel_el(kn->s1, delel, itog);}
if (kn->s2!=NULL) {kn->s2=recdel_el(kn->s2, delel, itog);}
if (kn->s3!=NULL) {kn->s3=recdel_el(kn->s3, delel, itog);}
if (kn->s4!=NULL) {kn->s4=recdel_el(kn->s4, delel, itog);}
}

return kn;
}

struct uzel *recdel_el(struct uzel *bn, int del, int &it)
{
if (bn->el==del) {bn=del_tr(bn, 0); it=1; return bn;}
else
{
if (bn->s1!=NULL) {bn->s1=recdel_el(bn->s1, del, it);}
if (bn->s2!=NULL) {bn->s2=recdel_el(bn->s2, del, it);}
if (bn->s3!=NULL) {bn->s3=recdel_el(bn->s3, del, it);}
if (bn->s4!=NULL) {bn->s4=recdel_el(bn->s4, del, it);}
}
return bn;
}

struct uzel *del_tr(struct uzel *kn, int nach)
{
if (nach==0)
{
if (kn->s1!=NULL) {kn->s1=del_tr(kn->s1, nach);}
if (kn->s2!=NULL) {kn->s2=del_tr(kn->s2, nach);}
if (kn->s3!=NULL) {kn->s3=del_tr(kn->s3, nach);}
if (kn->s4!=NULL) {kn->s4=del_tr(kn->s4, nach);}
}

free(kn);
return NULL;
}

void save(struct uzel *kn, int nach)
{
int fli, maxord, i, massiv[500];
char nfayl[50];
FILE *fp;

fli=1;
if (kn==NULL) {printf("derevo ne sushestvuet\n"); return;}
if (nach==1) {printf("derevo ne soderzhit ni odnogo elementa\n"); return;}

printf("vvedite imia sohraniaemogo fayla\n");
scanf("%s", nfayl);
if ((fp=fopen(nfayl, "r"))!=NULL)
{
fclose(fp);
printf("fayl s imenem %s uzhe sushestvuet\nperepisat fayl\n 1 - da 2 - net\n", nfayl);
scanf("%d", &fli);
}

if (fli==1)
{
if ((fp=fopen(nfayl, "w"))==NULL)
{
perror("oshibka pri otkritii fayla\n");
return;
}
} else {printf("deystvie otmeneno polzovatelem\n"); return;}

maxord=0;
maxord=lot(kn, maxord, 0);

for (i=1; i<=maxord; i++) recsave(kn, i, fp, 1, massiv, maxord);
fclose(fp);
printf("informacia sohranena\n");
}

void recsave(struct uzel *kn, int order, FILE *bf, int k, int mas[], int max)
{
int h;

if (order==k)
{
fprintf(bf, "%d ", kn->el);
if (order==1) {fprintf(bf, "0");}
else
{
for (h=0; h<=k-2; h++) fprintf(bf, "%d", mas[h]);
}
fprintf(bf, " ");
}

k=k+1;
if (order<k) {return;}
if (kn->s1!=NULL) {mas[k-2]=1; recsave(kn->s1, order, bf, k, mas, max);}
if (kn->s2!=NULL) {mas[k-2]=2; recsave(kn->s2, order, bf, k, mas, max);}
if (kn->s3!=NULL) {mas[k-2]=3; recsave(kn->s3, order, bf, k, mas, max);}
if (kn->s4!=NULL) {mas[k-2]=4; recsave(kn->s4, order, bf, k, mas, max);}
}

struct uzel *load(struct uzel *kn, int &nach)
{
struct uzel *nuzel;
int fli;
char nfayl[50], st[10];
FILE *fp;

if (kn==NULL) {printf("derevo ne sushestvuet\n"); return kn;}
if (nach==0) {printf("v osnovnuyu pamiat uzhe zagruzheno derevo!\npri zagruzke novogo dereva vsia nesohranennaya informaciya budet poteriana\n");
printf("recomenduetsia pered inicializaciey novogo dereva udalit predidushee s pomoshyu sootvetstvuyushey funnkcii v glavnom menu\n");
printf("sozdat novoe derevo\n 1-da 2-net\n");
scanf("%d", &fli);
if (fli!=1) {printf("deystvie otmeneno polzovatelem\n"); return kn;}}

printf("vvedite imia zagruzhaemogo fayla\n");
scanf("%s", nfayl);
if ((fp=fopen(nfayl, "r"))==NULL)
{
perror("oshibka pri otkritii fayla");
return kn;
}

while (!feof(fp))
{
if ((nuzel=(struct uzel *)malloc(sizeof(struct uzel)))==NULL)
{
printf("nedostatochno pamiati\n");
return kn;
}

fscanf(fp, "%d", &nuzel->el);
nuzel->s1=NULL;
nuzel->s2=NULL;
nuzel->s3=NULL;
nuzel->s4=NULL;
fscanf(fp, "%s", st);
if (st[0]=='0') {kn=nuzel;}
recload(kn, nuzel, st, 0);
}

nach=0;
fclose(fp);
printf("zagpuzheno\n");
return kn;
}

void recload(struct uzel *bn, struct uzel *nel, char us[], int nomer)
{
if ((us[nomer]=='1')&(bn->s1!=NULL)) {nomer=nomer+1; recload(bn->s1, nel, us, nomer);}
if ((us[nomer]=='2')&(bn->s2!=NULL)) {nomer=nomer+1; recload(bn->s2, nel, us, nomer);}
if ((us[nomer]=='3')&(bn->s3!=NULL)) {nomer=nomer+1; recload(bn->s3, nel, us, nomer);}
if ((us[nomer]=='4')&(bn->s4!=NULL)) {nomer=nomer+1; recload(bn->s4, nel, us, nomer);}

if ((us[nomer]=='1')&(bn->s1==NULL)) {bn->s1=nel;}
if ((us[nomer]=='2')&(bn->s2==NULL)) {bn->s2=nel;}
if ((us[nomer]=='3')&(bn->s3==NULL)) {bn->s3=nel;}
if ((us[nomer]=='4')&(bn->s4==NULL)) {bn->s4=nel;}

return;
}

void write(struct uzel *kn, int order, int i)
{
if (i==order) {printf("%d ", kn->el);}
i=i+1;
if (kn->s1!=NULL) {write(kn->s1, order, i);}
if (kn->s2!=NULL) {write(kn->s2, order, i);}
if (kn->s3!=NULL) {write(kn->s3, order, i);}
if (kn->s4!=NULL) {write(kn->s4, order, i);}
}

int lot(struct uzel *kn, int &l, int i)
{

if (kn==NULL) {return 0;} else {i=i+1;}
if (kn->s1!=NULL) {lot(kn->s1, l, i);} else {if (i>l) {l=i;}}
if (kn->s2!=NULL) {lot(kn->s2, l, i);} else {if (i>l) {l=i;}}
if (kn->s3!=NULL) {lot(kn->s3, l, i);} else {if (i>l) {l=i;}}
if (kn->s4!=NULL) {lot(kn->s4, l, i);} else {if (i>l) {l=i;}}

return l;
}

Заранее спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






N-арное дерево? С Паскаля перевести сможешь? Если надо, дам ссылку...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Давай. паскаль плохо помню, но попробую!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Volvo, спасибо большое! я разобрался с той прогой, к-ю ты дал. Только там нет сохранения в файл и восстановления из него, но думаю, что сам это сделаю. Если есть что-то про сохр/восст в/из файла скажи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Volvo, прога , которую ты дал че-то в одном месте не пашет(удаление элемента). ошибка при вводе ключа, большего 3. если не трудно, можешь посмотреть в чем ошибка!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Ты когда ввел данные, сделай скриншот, чтобы я мог у себя по картинке воспроизвести проблему... Тогда можно будет говорить об исправлении.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


[quote name='volvo' date='26.05.2007 20:09' post='104272']
Ты когда ввел данные, сделай скриншот, чтобы я мог у себя по картинке воспроизвести проблему... Тогда можно будет говорить об исправлении.
[/quoteщас сделаю!


Добавлено через 5 мин.
ну вот еще скриншот

Добавлено через 5 мин.
1

Добавлено через 11 мин.
че-то с картинокй не выходит. В общем я щас все расскажу. Значит ввожу номер ключа, значение.

parent index = 0
data = a
1 a

parent index = 1
data = b
1 a
2 b

parent index = 1
data = c
1 a
2 b
3 c

parent index = 2
data = d

1 a
2 b
3 d
4 c


parent index = 4
data = e

1 a
2 b
3 d
4 c
5 e


key to delete: 5

1 a
2 b
3 d
4 c
5 e



Вот это было на экране. Т.е. после того, как я все ввел, появляется key to delete:, я ввожу 5. Но элемент с ключом(в данном случае "e") 5 не удаляется. Это происходит когда номер ключа превышает 3, 4 и более.


Может, я че-то неправильно понял, или это ошибка.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 17:29
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name