ANSI C/C++ Drzewo Huffmana

0

Witam próbuję stworzyć drzewo Huffmana,

stworzyłem liste jednokierunkową gdzie w pojedynczym elemencie przechowuję:
częstotliwość wystąpień znaków, znak, miejsce (korzeń) drzewek gdy juz zaczną być tworzone.

Budując drzewo pobieram 2 elementy usuwając je z listy
następnie dodaje element do listy z połączonych tych dwóch elementów (suma czestotliwosci) oraz zapisuje w miejscu korzenia gdzie znajduje sie to podrzewko, żeby nie stracić połączenia drzewa.

void addNodes()
{
    if (head->root == NULL) // gdy jest lisciem tworz node1,node2 z l,r nullami
    {

        struct tree *node1 = (struct tree *)malloc(sizeof(struct tree));
        node1->left = NULL;
        node1->right = NULL;
        node1->freq = head->freq;
        node1->sign = head->sign;
        deleteLista(); // usuwa z glowy 1 element ;

        struct tree *node2 = (struct tree *)malloc(sizeof(struct tree));
        node2->left = NULL;
        node2->right = NULL;
        node2->freq = head->freq;
        node2->sign = head->sign;
        deleteLista();

        struct tree *node = (struct tree *)malloc(sizeof(struct tree));
        node->left = node1;
        node->right = node2;
        node->freq = node1->freq + node2->freq;
        addFirst(node->freq); // dodaje nowa glowe;
        head->root=node;

    }
    else {
    }

}

Program leci w nieskończoność gdy próbuję dodać te 3 węzły.

0

Formatowanie treści postów na forum

Za mało informacji, żeby powiedzieć co jest nie tak, np. nie wiadomo co robi deleteLista(). Swoją drogą oczy bolą od czytania takiego tworu językowego.
Poza tym to jest klasyczna sytuacja, gdzie się odpala debuggera i po 5 minutach widzisz gdzie program się zapętla.

0

ok dzięki spróbuję debuggera.
o to funkcję wraz ze struct.:

struct tree
{

    struct tree *left, *right;
    char sign;
    int freq;
};
struct lista
{

    struct lista *next;
    struct tree *root;
    char sign;
    int freq;
};
struct lista *head = NULL;

void addFirst(int f) // potrzebne do tworzenia drzewa.
{
    struct lista *newHead = (struct lista*)malloc(sizeof(struct lista));
        newHead->freq = f;
        newHead->next = head;
        head = newHead;
}
void deleteLista()
{
    if (head == NULL)
    {
        printf("LISTA JEST PUSTA ....");
    }
    else
    {

        struct lista *pointer = head->next;
        free(head);
        head=pointer;
        free(pointer);
    }
}
1
struct lista *pointer = head->next;   // zapamiętam sobie następną głowę
free(head);         // usuwam starą głowę
head=pointer;     // głowa już wskazuje na nową pozycję
free(pointer);   // nową głowę też sobie usunę, a co mi tam!!!!!!!!!
0

Dzięki dało mi to do myślenia.
W jaki sposób mógłbym przekazać wartość head->next do nowej głowy w funkcji void ?

0

Nie rozumiem pytania. Przecież head->next to właśnie nowa głowa?

0
void deleteLista()
{
    if (head == NULL)
    {
        printf("LISTA JEST PUSTA ....");
    }
    else
    {
 
        struct lista *pointer = head->next;
        free(head);
        head=pointer;
    }
}

dzięki to powinno być ok. tak jak napisałeś.
próbuję doczytać na temat wskaźników.
Sporo bubli zrobiłem.

Ok chyba rozumiem podsumowując:

  1. Po przypisaniu head = pointer w head zostaje zapisany adress pamięci.
  2. po wykonaniu funkcji pointer znika on z pamięci.
    a w head dalej zostanie adress.

1 użytkowników online, w tym zalogowanych: 0, gości: 1