HRyk
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Друзья, подскажите такую вещь: мне нужно решить задачу: построить лес из двоичных деревьев, каждое из которых объединяет слова с одинаковой повторяемостью в тексте (тоесть дан некоторый текст в файле, слова в тексте могут повторяться, я должен в двоичное дерево объединить слова с одинаковой повторяемостью (положение слов в дереве определяется алфавитом), и из этих деревьев построить лес) ОСНОВНОЙ ВОПРОС-КАКОВ АЛГОРИТМ ПОСТРОЕНИЯ ЛЕСА??? Я эту задачу решаю так: 1) переписываю все слова из текстового файла (м1.txt) в другой файл (m2.txt),где эти слова расположены столбиком. 2) на основе файла (m2.txt) создаю статическую структуру, в которую записываю слово и частоту его повторения в тексте. 3) Из слов с одинаковой повторяемостью создаю двоичное дерево-вывожу его на экран. НО, проблема в том, что я не знаю как удалить получившееся дерево после его вывода, и другие слова добавляются у меня в то же дерево! Как тут быть??? Подскажите, плз. Код: #include "stdafx.h" #include <conio.h> #include <string.h> #include <stdlib.h> #include <stdio.h> //--------------------------- int GetStringHash(char*S1) { int h=0; for (int i=0;S1[i]!=0;i++) {printf("HASM==%d\n",S1[i]); h=h+(i+1)*S1[i]; } return h; } struct Slovo { int kolich; char name[20]; }; //-------------------------- struct ElemT {int Sod; char name[20]; ElemT*pLeft; ElemT*pRight; }; //---------------------------- ElemT*pHead=NULL; void AddElemtoTree(ElemT*&pH,int S,char *STR) {ElemT*pCur=pH; char SSS[5]="aaaa"; if (pH==NULL) { pH=new ElemT; pH->Sod=S; pH->pLeft=NULL; pH->pRight=NULL; //----------------------------------- return; } while(1) { if (S<pCur->Sod) {if (pCur->pLeft!=NULL) pCur=pCur->pLeft; else {pCur->pLeft=new ElemT; pCur=pCur->pLeft; pCur->Sod=S; //pCur->name=STR; //strncpy(pCur->name,STR,strlen(STR)); strcpy(pCur->name,STR); pCur->pLeft=NULL; pCur->pRight=NULL; break; } } else {if (pCur->pRight!=NULL) pCur=pCur->pRight; else {pCur->pRight=new ElemT; pCur=pCur->pRight; pCur->Sod=S; //pCur->name=STR; strncpy(pCur->name,STR,strlen(STR)); pCur->pLeft=NULL; pCur->pRight=NULL; break; } } } } //--------------------------- void PrintTree(ElemT*pCur) { if (pCur!=NULL) { printf(" %d , %s",pCur->Sod,pCur->name); PrintTree(pCur->pLeft); PrintTree(pCur->pRight); printf("\n"); } } int ravn[20];//pHead[5]={1,1,1,1,1}; //--------------------------- int _tmain(int argc, _TCHAR* argv[]) {int i,j,S1;//kol,S1; //------------------------------------ int n,k=0,e=0,ch=0; //---------------- //создаем указатель на массив будующих хешей int*a; int*b; //--------------------- char S[100],S11[100],S2[100],S4[100];; //переписываем из текстового файла s слова в столбик в файл d //------------------------------------------------------------- FILE*d=fopen("m2.txt","wt"); //открываем файл FILE*s=fopen("m1.txt","rt"); if (s==0) {printf("NET"); getch(); return 0; } fscanf(s,"%d",&e); while (e!=1988) { fscanf(s,"%S",&S11); printf("%S\n",S11); fprintf(d,"%S\n",S11); fscanf(s,"%d",&e); ch=ch+1; } fclose(s); fprintf(d,"%d",1988); fclose(d); //------------------------------------------------------------ //создаем массив хэшей; a=new int [ch]; int a1[10]; e=0; FILE*d1=fopen("m2.txt","rt"); fscanf(d1,"%d",&e); while (e!=1988) { fscanf(d1,"%S",&S11); *(a+k)=GetStringHash(S11); k=k+1; fscanf(d1,"%d",&e); } fclose(d1); b=new int [ch]; for (int w=0;w<ch;w++) b[w]=0; int kol,p=0; for (int i=0;i<ch;i++) { if (a[i]!=0) kol=1; else kol=0; for (int j=0;j<ch;j++) if ((a[i]==a[j])&&(a[j]!=0)&&(i!=j)) { kol=kol+1; a[j]=0; } a[i]=0; b[p]=kol; p=p+1; } //------------------------------------------ Slovo Sl[20];//100 int z=0; //--------------------------------- FILE*f=fopen("m1.txt","rt"); for (int i=0;i<ch;i++) { if (b[i]!=0) {fscanf(f,"%s\n",&Sl[z].name); Sl[z].kolich=b[i]; z=z+1; } else fscanf(f,"%S\n",&S4); } //----------------------------------- char STR[20],SSS[5]="!!!!"; AddElemtoTree(pHead,999,SSS); //------------------------------- int kolic; kolic=1; for (int u=0;u<z;u++) { ravn[0]=u; for (int q=0;q<z;q++) if ((Sl[u].kolich==Sl[q].kolich)&&(u!=q)&&(Sl[u].kolich!=0)&&(Sl[q].kolich!=0)) {//printf("%d==%d, (%d::%d)\n",Sl[u].kolich,Sl[q].kolich,u,q); ravn[kolic]=q; kolic=kolic+1; //Sl[q].kolich=0; } //for (int r=0;r<5;r++) //printf("ee==%d\n",ravn[r]); //printf("kol==%d\n",kolic); if (kolic>1) { AddElemtoTree(pHead,999,SSS); for (int g=0;g<kolic;g++) {//printf("hh==%d %s\n",Sl[ravn[g]].kolich,Sl[ravn[g]].name); AddElemtoTree(pHead,Sl[ravn[g]].kolich,Sl[ravn[g]].name); Sl[ravn[g]].kolich=0; } } //-------------- ElemT*pCur=pHead; //------------------------- if (pCur->Sod==999) pCur=pCur->pLeft; //------------------------- printf("\n"); PrintTree(pCur); for (int c=0;c<20;c++) ravn[c]=0; kolic=1; //------------------------------------------------------- Sl[ravn[u]].kolich=0; ElemT*pHead=NULL; } printf("\n"); for (int i=0;i<z;i++) printf("ITOG==%d, %S\n",Sl[i].kolich ,Sl [ i ].name); //--------------------------------------------- for (int y=0;y<ch;y++) printf("%d ",b[y]); getch(); return 0; } | Добавлено: Друзья, уточняю вопрос: Как создать цикл следующего вида : К примеру: i=0; while (i<3) { -создаем двоичное дерево; -выводим дерево на экран; i=i+1; } | Всего записей: 162 | Зарегистр. 04-11-2006 | Отправлено: 13:58 01-05-2007 | Исправлено: HRyk, 14:05 01-05-2007 |
|