Witam,

Mam problem z wyświetlaniem wyników działania mojego programu. Jak mniemam tkwi on w przekazywaniu tablicy drzew do funkcji, która tworzy mi z nich listę jednokierunkową. Totalnie nie wiem co jest nie tak. Program przy wyświetlaniu wyników po kompresji "gubi" wskaźnik na pierwszą literę która występuje w danych.

Dane do mojego programu:
6
a 16
b 5
c 12
d 17
e 10
f 25

Dane1:
5
A 0.39
B 0.21
C 0.19
D 0.12
E 0.09

Kod:

#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>

using namespace std;

struct wezel //implementacja wezla
{
    char litera; //literka
    double czest;  // a tu czestotliwosc wystepowania
    wezel *rodzic; //wskaznik na rodzica
    wezel *l_dziecko; //wskaznik na lewe dziecko
    wezel *p_dziecko; //wskaznik na prawe dziecko
};

struct element //struktura listy
{
    wezel* drzewo;
    element *nastepny;
};


wezel *dane(fstream &we, int n); //funkcja z danymi
element **robliste(wezel *dane, int n); //funckja tworzy liste z wskaznikami na dane
void dodaj(element** lista, wezel *dane); //dodaje element do listy
void usun(element** lista); // usuwa element z listy
void sortuj(element** lista); // sortuje akutalna liste
void wyswietl(element** lista); // do wyswietlania listy
void wypisz(wezel* drzewo, string kod); //funkcja do wypisywania danych
void Huffman(element** lista, int n); //a;gorytm glowny

int main()
{
    int n,m;
    fstream we;

    //pierwszy zestaw
    we.open("dane.txt", ios::in); //otwieram plik z danymi
    we >> n; //liczba literek
    wezel *zbior1 = dane(we, n); // to sa moje dane do pierwszego przypadku, wrzucam do tablicy!
    /*for(int i=0;i<n;i++)
        cout<<zbior1[i].litera<<": "<<zbior1[i].czest<<endl;*/
    element** lista1 = robliste(zbior1,n); //przypisuje utworzona liste do zmiennej "lista"
    wyswietl(lista1);
    we.close();

    cout<<endl;
    getch();

    //drugi zestaw
    we.open("dane1.txt", ios::in);
    we >> m;
    wezel *zbior2 = dane(we, m); // to sa moje dane do przypadku drugiego, tez w tablicy
    element** lista2 = robliste(zbior2,m); //przypisuje utworzona liste do zmiennej "lista"
    wyswietl(lista2);
    we.close();

    getch();

    cout<<endl<<"SORTUJE..."<<endl;
    sortuj(lista1);
    sortuj(lista2);
    cout<<"POSORTOWALEM"<<endl;
    getch();
    cout<<endl;
    wyswietl(lista1);
    cout<<endl;
    wyswietl(lista2);
    cout<<endl;

    getch();

    //Wywoluje algorytm dla zestawow danych
    cout<<"Przyklad pierwszy:"<<endl;
    Huffman(lista1, n); //pierwszy
    cout<<endl<<"Przyklad drugi:"<<endl;
    Huffman(lista2, m); //drugi
    getch();
    return 0;
}

/****************FUNKCJE***************/

wezel *dane(fstream &we, int n)
{
    wezel *tab = new wezel[n];
    for(int i=0;i<n;i++)
    {
        we >> tab[i].litera >> tab[i].czest;
        tab[i].l_dziecko = NULL;
        tab[i].p_dziecko = NULL;
        tab[i].rodzic = NULL;
    }
    return tab;
}

element **robliste(wezel *tab, int n)
{
    element ** lista;
    *lista=NULL;
    for(int i=0;i<n;i++)
        dodaj(lista,&tab[i]);
    return lista;
}

void dodaj(element** lista, wezel *dane)
{
    element* temp;
    temp = new element;
    temp->drzewo = dane;
    temp->nastepny = *lista;
    *lista = temp;
}

void usun(element** lista)
{
    element* temp;
    temp = *lista;
    *lista = temp->nastepny;
    delete temp;
}


void sortuj(element** lista)
{
   	element* n = 0;
	while(*lista)
	{
		element *najwiekszy = *lista, *nowy = 0;
		for(element *p = *lista, *i = (*lista)->nastepny; i; p = i, i = i->nastepny)
			if(i->drzewo->czest >= najwiekszy->drzewo->czest)
				najwiekszy = i, nowy = p;
		if(nowy)
			nowy->nastepny = najwiekszy->nastepny;
		else
			*lista = najwiekszy->nastepny;
		najwiekszy->nastepny = n;
		n = najwiekszy;
	}
	*lista = n;
}

void wyswietl(element** lista)
{
    element* temp=(*lista);
    while(temp)
    {
        cout<<temp->drzewo->czest<<" ";
        temp=temp->nastepny;
    }
}

void wypisz(wezel* drzewo, string kod)
{
    if(drzewo->l_dziecko==NULL) //bo wypisuje tylko liscie
        cout<<drzewo->litera<<": "<<kod<<endl;
    else
    {
        wypisz(drzewo->l_dziecko,kod+"0");
        wypisz(drzewo->p_dziecko,kod+"1");
    }
}

void Huffman(element **lista, int n)
{
    for(int i=n;i>1;i--)
    {
        //cout<<"****PIERWSZY*****"<<endl<<endl;
        sortuj(lista);
        //cout<<"*****OSTATNI*******"<<endl<<endl;
        wezel* x = (*lista)->drzewo;
        wezel* y = (*lista)->nastepny->drzewo;
        wezel *nowy;
        nowy = new wezel;
        //cout<<"***TU_JESTEM****"<<endl;
        nowy->czest= x->czest + y->czest;
        nowy->l_dziecko = x;
        nowy->p_dziecko = y;
        nowy->rodzic = NULL;
        x->rodzic = nowy;
        y->rodzic = nowy;
        usun(lista);
        usun(lista);
        dodaj(lista,nowy);
    }
    wypisz((*lista)->drzewo,"");
}