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

> Внимание!

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

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


Новичок
*

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

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


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

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

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


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


Новичок
*

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

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


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


--------------------
Errare humanum est.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Gera
сообщение 15.04.2007 13:01
Сообщение #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(c)
		 {			 /*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 килобайт ) Кол-во скачиваний: 353


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

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

 

- Текстовая версия 28.07.2025 20:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"