Новичок
Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.2.2007
Репутация: нет Всего: нет
|
Друзья, как создать цикл следующего вида : К примеру: i=0; while (i<3) { -создаем двоичное дерево; -выводим дерево на экран; i=i+1; } Друзья, подскажите такую вещь: мне нужно решить задачу: построить лес из двоичных деревьев, каждое из которых объединяет слова с одинаковой повторяемостью в тексте (тоесть дан некоторый текст в файле, слова в тексте могут повторяться, я должен в двоичное дерево объединить слова с одинаковой повторяемостью (положение слов в дереве определяется алфавитом), и из этих деревьев построить лес) ОСНОВНОЙ ВОПРОС-КАКОВ АЛГОРИТМ ПОСТРОЕНИЯ ЛЕСА??? Я эту задачу решаю так: 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]; 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 c=0;c<z;c++) { for (int u=0;u<z;u++)//// { ravn[0]=c;//Sl[0].kolich; if ((Sl[c].kolich==Sl[u].kolich)&&(Sl[u].kolich!=0)&&(u!=c)&&(Sl[c].kolich!=0)) {//printf("%d==%d, (%d::%d)\n",Sl[u].kolich,Sl[c].kolich,c,u); ravn[kolic]=u; kolic=kolic+1; Sl[u].kolich=0; } 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; Sl[c].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; //------------------------------------------------------- } 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; }
|
Это сообщение отредактировал(а) Alexeis - 3.5.2007, 09:41
|