Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C/C++]Создание леса из двоичных деревьев. Создать лес из двоичных деревьев. 
:(
    Опции темы
bobr
Дата 1.5.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.