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,"");
}