Я уже наверное всех замучала со своим дурацким деревом,
но у меня вроде все получилось у самой, кроме одного: пожалуйста помогите оформить функцию печати, так чтобы дерево на экран выводилось целиком в порядке, соответствующем радиальному обходу.
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> #include <dos.h> #define TREE struct tree TREE { char Name[50]; int m1,m2,m3,m4; int Vr; /*nomer vershinu*/ int l; /*chislo vuhodyashh vershin*/ TREE *Point[20]; /*ykazateli na elementu sledyushego yrovnya*/ }; TREE *Stack[50]; TREE *Que[50]; TREE *ptr_Tree[50]; TREE *ptr_Tre, *ptr_Trt, *Root; int Lp,Rp,lp; void pushQ(TREE *ptr) /*vkluchenie elementa v ochered'*/ { Que[Lp++]=ptr; } TREE *popQ(void) /*ydalenie elementa iz ocheredi*/ { return Que[Rp++]; } void push(TREE *ptr) /*vkluchenie elementa v stek*/ { Stack[lp++] = ptr; } TREE *pop(void) /*ydalenie elementa iz steka*/ { return Stack[--lp]; } void TreeForm() /*formirovanie dereva*/ { int i, Vr, Nom; TREE *ptr_Tree[50]; FILE *fp; clrscr(); printf("Formirovanie dereva :MISIS: \n"); if ((fp = fopen("indata.txt","r")) == NULL) { printf("Can't open file d:\\indata.txt, please check the path to the file!\n"); getch(); } fscanf(fp,"%d",&Vr); for (i=0; i<Vr; i++) ptr_Tree[i] = (TREE *)malloc(sizeof(TREE)); for (i=0; i<Vr; i++) { ptr_Trt = ptr_Tree[i]; fscanf(fp, "%s",ptr_Trt->Name); fscanf(fp,"%d",&ptr_Trt->m1); fscanf(fp,"%d",&ptr_Trt->m2); fscanf(fp,"%d",&ptr_Trt->m3); fscanf(fp,"%d",&ptr_Trt->m4); fscanf(fp,"%d",&ptr_Trt->l); for (int j = 0; j<ptr_Trt->l; j++) { fscanf(fp,"%d",&Nom); ptr_Trt->Point[j] = ptr_Tree[Nom-1]; } } fclose(fp); Root = ptr_Tree[0]; printf("Formirovanie spiska zaversheno."); getch(); } TREE *Radl(char Name[]) /*radialnui obhod*/ { TREE *ptr; push(Root); while (lp != 0) { ptr = pop(); if (strcmp(ptr->Name,Name) == 0) { lp = 0; return(ptr); } for (int k = 0; k <= ptr->l -1; k++) { push(ptr->Point[k]); } } return(NULL); } TREE *Frtln(char Name[]) /*frontalnui obhod*/ { int kl,l,j,Tree[50],*k; kl = 0; pushQ(Root); while( Lp != Rp ) { ptr_Tre = popQ(); if (strcmp(ptr_Tre->Name,Name) == 0) { Lp=Rp; return (ptr_Tre); } Tree[kl] = ptr_Tre->Vr; kl++; l=ptr_Tre->l; for (j=0; j<l; j++) pushQ(ptr_Tre->Point[j]); *k = kl; } return(NULL); } void Print_Tree() /*pechat', kotoryu nyjno peredelat'*/ { int n,i,key; char c; TREE *ptr_Tr,*ptr_tre; printf("Struktura MISiS\n"); push(Root); while (key!= 0) { ptr_tre=ptr_Trt; ptr_Trt = pop(); for (int j = 0; j < ptr_Trt->l; j++) { ptr_Tr=ptr_Trt->Point[j]; if(ptr_Tr->m1==0) printf(" %d %-7s \n",j+1,ptr_Tr->Name); else printf(" %d %-7s %d %d %d %d \n",j+1,ptr_Tr->Name, ptr_Tr->m1,ptr_Tr->m2,ptr_Tr->m3,ptr_Tr->m4); } printf("Insert key ('0'-to EXIT): "); scanf("%d",&key); if(key>j || key<0) { printf("Takogo klucha net"); break; } if(key==-1||key==1||key==2||key==3||key==4) { if(key==-1) push(ptr_tre); else push(ptr_Trt->Point[key-1]); } else push(Root); } getch(); } void Insert_Tree() /*vstavka vershinu*/ { char tmp, otr[50], rz[50]; int i=0; TREE *ptrX; clrscr(); window(1,9,47,25); gotoxy(1,1);printf("1.Novui fakul'tet.\n"); gotoxy(1,2);printf("2.Novui kurs.\n"); gotoxy(1,3);printf("3.Novaya gruppa.\n"); gotoxy(1,4);printf("4.Novui studenta.\n"); tmp=getch(); switch(tmp) { case '1': { ptrX=(TREE *)malloc(sizeof(TREE)); printf("Vvedite nazvanie novogo fakul'teta: "); scanf("%s",ptrX->Name); ptrX->m1=0; ptrX->m2=0; ptrX->m3=0; ptrX->m4=0; ptrX->l = 0; Root->l++; Root->Point[Root->l-1] = ptrX; }; break; case '2': { TREE *ptr; char fak[20],kurs[20]; printf("Vvedite nazvanie fakul'teta dlya vklucheniya novogo kursa: "); scanf("%s",fak); ptr = Frtln(fak); if(ptr==NULL) { printf("Takogo fakul'teta net.\n"); getch(); return; } printf("Vvedite nomer novogo kursa: "); scanf("%s",kurs); if (strcmp(kurs,"1")==0) strcpy(kurs,"1kurs"); if (strcmp(kurs,"2")==0) strcpy(kurs,"2kurs"); if (strcmp(kurs,"3")==0) strcpy(kurs,"3kurs"); if (strcmp(kurs,"4")==0) strcpy(kurs,"4kurs"); if (strcmp(kurs,"5")==0) strcpy(kurs,"5kurs"); ptrX = (TREE *)malloc(sizeof(TREE)); strcpy(ptrX->Name,kurs); ptrX->m1=0; ptrX->m2=0; ptrX->m3=0; ptrX->m4=0; ptrX->l = 0; ptr->l++; ptr->Point[ptr->l-1] = ptrX; }; break; case '3': { TREE *ptr,*ptrA; char fak[20],kurs[20],group[20]; printf("Vvedite nazvanie fakul'teta dlya vklucheniya novoi gryppu: "); scanf("%s",fak); ptr = Frtln(fak); if(ptr == NULL) { printf("Takogo fakul'teta net."); getch(); return; } printf("Vvedite nomer kursa dlya vklucheniya novoy gryppu: "); scanf("%s",kurs); if (strcmp(kurs,"1")==0) strcpy(kurs,"1kurs"); if (strcmp(kurs,"2")==0) strcpy(kurs,"2kurs"); if (strcmp(kurs,"3")==0) strcpy(kurs,"3kurs"); if (strcmp(kurs,"4")==0) strcpy(kurs,"4kurs"); if (strcmp(kurs,"5")==0) strcpy(kurs,"5kurs"); for(i=0;i<(ptr->l);i++) { if (strcmp(kurs,ptr->Point[i]->Name)==0) ptrA=ptr->Point[i]; } printf("Vvedite nazvanie novoi gryppu: "); scanf("%s",group); ptrX = (TREE *)malloc(sizeof(TREE)); strcpy(ptrX->Name,group ); ptrX->m1= 0; ptrX->m2= 0; ptrX->m3= 0; ptrX->m4= 0; ptrX->l = 0; ptrA->l++; ptrA->Point[ptrA->l-1] = ptrX; }; break; case '4': { TREE *ptr; char group[20],name[20]; int m1,m2,m3,m4; printf("Vvedite nazvanie gryppu dlya vklucheniya studenta: "); scanf("%s",group); ptr = Frtln(group); if(ptr == NULL) { printf("Takoi gryppu net."); getch(); return; } printf("Vvedite imya novogo studenta: "); scanf("%s",name); ptrX = (TREE *)malloc(sizeof(TREE)); strcpy(ptrX->Name,name ); printf("Vvedite ocenki studenta: "); scanf("%d",&m1); scanf("%d",&m2); scanf("%d",&m3); scanf("%d",&m4); ptrX->m1=m1; ptrX->m2=m2; ptrX->m3=m3; ptrX->m4=m4; ptrX->l=0; ptr->l++; ptr->Point[ptr->l-1] = ptrX; }; break; } } void Del_Tree() /*ydalenie vershinu*/ { char father[20], son[20]; int i,j; TREE *ptrX,*ptr; clrscr(); printf("Vvedite starshyu vershinu dlya ydaleniya: "); scanf("%s",father); ptr=Radl(father); if(ptr==NULL) { printf("Takoi vershinu net."); getch(); return; } printf("Vvedite mladshyu vershinu: "); scanf("%s",son); ptrX=Radl(son); if(ptrX==NULL) { printf("Takoi vershinu net."); getch(); return; } for(i=0;i<ptr->l;i++) if(ptr->Point[i]==ptrX) j=i; ptr->l--; for(i=j;i<ptr->l;i++) ptr->Point[i]=ptr->Point[i+1]; } void Modifikaciya() /*izmenenie ocenok studenta*/ { TREE *ptr; char stud[20]; int m1,m2,m3,m4; printf("Vvedite imya studenta dlya izmeneniya ocenok: \n"); scanf("%s",stud); ptr=Frtln(stud); if(ptr==NULL) { printf("Takogo ne syshestvyet."); getch(); return; } printf("Vvedite novue ocenki: "); scanf("%d",&m1); scanf("%d",&m2); scanf("%d",&m3); scanf("%d",&m4); ptr->m1=m1; ptr->m2=m2; ptr->m3=m3; ptr->m4=m4; } int main() /*osnovaya programma*/ { char c; int n; clrscr(); do { /*vuvod na ekran menu*/ window(1,1,80,8); gotoxy(1,1);puts("1.Formirovanie dereva MISiS"); gotoxy(1,2);puts("2.Vkluchenie vershinu v derevo"); gotoxy(1,3);puts("3.Ydalenie vershinu iz dereva"); gotoxy(1,4);puts("4.Modifikaciya ocenok stydenta"); gotoxy(1,5);puts("5.Pechat' dereva"); gotoxy(1,6);puts("6.Vuhod"); c = getch(); /*ojidanie najatiya klavishi*/ window(1,9,80,25); clrscr(); switch© { /*vubor punkta menu*/ case '1': { /*formirovanie dereva*/ TreeForm(); break; } case '2': { /*vkluchenie vershinu v derevo*/ Insert_Tree(); break; } case '3': { /*ydalenie vershinu iz dereva*/ Del_Tree(); break; } case '4': { /*modifikaciya icenok stydenta*/ Modifikaciya(); break; } case '5': { /*pechat' vsego dereva*/ Print_Tree(); break; } case '6': { /*vuhod*/ break; } } } while(c>'0' && c<'6'); return c; }
Indata.txt ( 1.03 килобайт )
Кол-во скачиваний: 495
Errare humanum est.