Witam!
Mam za zadanie utworzyć drzewo huffmana wraz z kodowaniem. Całość w języku C++ na listach statycznych.
Udało mi się zrobić drzewo ( w formie ojcec | potomek lewy | potomek prawy), niestety wszystkie próby stworzenia drzewa kodowania (symbol podstawowy lub zastępczy | łańcuch znaków kodujących z „0” i „1”) kończą się na zapętleniu (funkcja rekurencyjna) albo wypisywaniu jakichś głupot.. Proszę o pomoc z napisaniem funkcji tworzącej kodowanie w stworzonym przeze mnie drzewie.
Oto mój kod :
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
int ile=0;
struct model
{
int znak;
int czestosc;
}modsort[256];
struct drzewko
{
int ojciec;
int lewy;
int prawy;
}drzewo[256];
/*
void wyswietl_sort()
{
for(int i=0;i<ile;i++)
{
cout<<modsort[i].znak<<" | "<<modsort[i].czestosc<<endl;
}
}
*/
void wczytaj(string plik_wejsciowy)
{
int i=0;
int odczytane=0;
int odczytane2=0;
string sodczytane;
string sodczytane2;
ifstream plik_wczytany;
plik_wczytany.open(plik_wejsciowy.c_str(), ios::in);
while (plik_wczytany.good())
{
plik_wczytany >> sodczytane;
odczytane=atoi(sodczytane.c_str());
plik_wczytany >> sodczytane2;
odczytane2=atoi(sodczytane2.c_str());
modsort[i].znak=odczytane;
modsort[i].czestosc=odczytane2;
++i;
ile++;
}
plik_wczytany.close();
}
void posortuj(struct model modsort[])
{
int temp;
int temp2;
for(int i=0;i<ile;i++)
{
for(int j=0;j<(ile-i);j++)
{
if(modsort[j].czestosc<modsort[j+1].czestosc)
{
temp=modsort[j].czestosc;
temp2=modsort[j].znak;
modsort[j].czestosc=modsort[j+1].czestosc;
modsort[j].znak=modsort[j+1].znak;
modsort[j+1].czestosc=temp;
modsort[j+1].znak=temp2;
}
}
}
}
void tworze_drzewo(struct model modsort[])
{
int ile2=ile;
int licz=ile;
for(int i=0;i<ile-1;i++)
{
drzewo[i].ojciec=-1-i;
drzewo[i].prawy=modsort[ile2-1-i].znak;
drzewo[i].lewy=modsort[ile2-2-i].znak;
modsort[ile2-2-i].znak =-1-i;
modsort[ile2-2-i].czestosc=modsort[ile2-1-i].czestosc+modsort[ile2-2-i].czestosc;
licz--;
posortuj(modsort);
}
}
void coding(struct drzewko drzewo[],string kod)
//tutaj funkcja tworzaca kodowanie, teraz znajduje sie tylko wypisanie symboli od konca (czyli od pierwszego ojca) tablicy drzewo
{
for(int i=ile-2;i>-1;i--)
{
cout<<drzewo[i].ojciec<<" ";
}
cout<<endl<<endl;
}
int main(int argc, char** argv)
{
string code;
cout<<endl;
cout<<"Witaj! " <<endl<<endl;
wczytaj(argv[1]);
// wyswietl_sort();
cout<<"cos zrobilem"<<endl;
tworze_drzewo(modsort);
ofstream plik_zapis;
plik_zapis.open("test.tree", ios::out);
cout<<endl<<endl;
for(int i=0;i<ile-1;i++)
{
cout<<drzewo[i].ojciec<<" "<<drzewo[i].lewy<<" "<<drzewo[i].prawy<<" "<<endl;
plik_zapis << drzewo[i].ojciec<<" "<<drzewo[i].lewy<<" "<<drzewo[i].prawy<<endl;
}
plik_zapis.close();
cout<<endl<<endl;
coding(drzewo,code);
}
Do działania programu potrzebny jest na wejściu plik z posortowana lista symboli z rozszerzeniem .modsort (rozszerzenie jeszcze nie uwzględnione w kodzie) .W załączniku plik wejściowy test2.modsort.txt . Drugi plik jest z właściwym kodowaniem.