Problem jest dosyć prosty. Muszę zaimplementować drzewo do którego wpiszę wartość i znak. Całość ma być elementem programu kodującego tekst huffmanem. Pytanie brzmi jak zbudowac takie drzewko od 'dołu'. Póki co buduje osobne drzewka dla każdego przypadku, chciałbym je połączyć w jedną spójną całość. Bardzo proszę o pomoc i z góry dziękuje.
struct data{
char sign=NULL;
int count=0;
struct data*next=NULL;
};
struct tree{
struct tree * left=NULL;
struct tree * right=NULL;
struct tree * dad = NULL;
char sign_tree=NULL;
int value=NULL;
};
void data1(data*head, tree*root) {
data*wsk; // wskaznik do struktury przechowującej znak i ilość jego powtórzeń
wsk = head;
tree*tmp; // wskaznik do struktury drzewa
tmp=root;
int bufer;
int bufer1;
char sign=NULL;
char sign1=NULL;
int count_str=0;
while (wsk != NULL) // funkcja zliczająca ilosć stuktur data
{
count_str++;
wsk = wsk -> next;
}
sort(head); // funkcja sortujaca elemnty lsity od najmniejszej do najwiekszej
wsk = head;
for (int i = 0; i < count_str; i++)
{
while (wsk->count == 0) // jezeli pierwszy element listy wystepuje 0 razy ( w przypadku pustej listy i kolejnych ktore zostana wyzerowane ) omiń go
{
wsk = wsk->next;
}
if (wsk->next != NULL) // jezeli pozostaly jeszcze 2 elementy listy wykonaj dzialanie
{
bufer = wsk->count; //wpisz obecneą i kolejną wartosć z listy w bufor i bufor1
sign = wsk->sign;
bufer1 = wsk->next->count;
sign1 = wsk->next->sign;
wsk->count=0; //wyzeruj wartosci tak aby zostaly pominiete przy nastepnym przpisywaniu
wsk->next->count=0;
while (wsk->next != NULL) przejdz na koniec listy
{
wsk = wsk->next;
}
wsk->next = new data; //dodaj nowy element listy, jego wartosc to suma dwoch poprzednich
wsk->next->count = bufer + bufer1;
wsk->next->sign = '$';
sort(head); //posortuj
printf("\n bufer ;%d bufer1; %d\n", bufer, bufer1);
tmp = new tree; // skoro program pobral 1 i 2 liczbe z posortowanej listy, to pobral najmniejsza i druga po niej
tmp->value = bufer + bufer1; // zatem warunek kodowania hffmana zostal spelniony, bufer to lewy lisc bufer1 to prawy lisc
tmp->sign_tree = '!'; // a ich suma bedzie wartoscia ojca
tmp->left = new tree;
tmp->left->value = bufer;
tmp->left->sign_tree = sign;
tmp->right = new tree;
tmp->right->value = bufer1;
tmp->right->sign_tree = sign1;
sort(head); //posortuj liste
printf("\n lewo %d - %c \n ", tmp->left->value, tmp->left->sign_tree);
printf("\n ojciec %d - %c \n ", tmp->value, tmp->sign_tree);
printf("\n prawo %d - %c \n ", tmp->right->value, tmp->right->sign_tree);
}
}
}