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.