![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Focus |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Задание звучит так. Древовидная структура строится из вершин, состоящих из двух полей: поля данных и указателя. Указатель ссылается на вспомогательный список, с помощью которого устанавливается связь текущей вершины с вершиной нижнего уровня. Каждый элемент этого списка содержит указатель на соседний элемент вспомогательного списка и на одну вершину нижнего уровня.
Я написал эту прогу, но у меня используются 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; } Заранее спасибо! |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 15:09 |