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

> Внимание!

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

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

 
 Ответить  Открыть новую тему 
> Дерево на Си, Различные задания по обработке дерева
сообщение
Сообщение #1


Новичок
*

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

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


Составить и отладить программу, которая выполняет по выбору: формирование дерева, включение вершины, удаление вершины, решение подзадачи с использованием указанного способа представления и типа обхода дерева, печать дерева.
Для способа представления, где для каждой вершины в памяти хранится информация при вершине (например, имя вершины), количество подчиненных ей вершин и указатели на каждую подчиненную вершину, фронтального обхода дерева и варианта данных I решить подзадачу: модифицировать оценки заданного студента. Вариант данных I: информация о студентах одного вуза. Студенты объединены в группы, группы в курсы, курсы в факультеты. Данные о каждом студенте включают: фамилию и инициалы, оценки за последнюю сессию.
Вот у меня есть программа, которая очень похожа на то, что мне надо:
Прикрепленный файл  GGGG2.CPP ( 8.57 килобайт ) Кол-во скачиваний: 359
Прикрепленный файл  Indata.txt ( 790 байт ) Кол-во скачиваний: 337

Но в ней реализация идет не с помощью очереди, которая используется при фронтальнои обходе, а с помощью стека, который используется при радиальном обходе. И еще мне бы хотелось, чтобы main была в конце, а также формирование происходило не из файла, а при непосредственном выполнении программы.
Вот так приблизительно мне бы хотелось увидеть программу:
Прикрепленный файл  MISIS.CPP ( 3.37 килобайт ) Кол-во скачиваний: 340

Помогите пожалуйста совместить и немного подкорректировать.


--------------------
Errare humanum est.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Новичок
*

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

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


Ну неужели никто не может помочь, ребята, пожалуйста, я же не прошу с начала самого писать...


--------------------
Errare humanum est.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Я уже наверное всех замучала со своим дурацким деревом, sad.gif но у меня вроде все получилось у самой, кроме одного: пожалуйста помогите оформить функцию печати, так чтобы дерево на экран выводилось целиком в порядке, соответствующем радиальному обходу.
#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 килобайт ) Кол-во скачиваний: 298


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

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

 





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