Итак, я создал функцию для построения дерева хаффмана, которое передается связанным списком в порядке возрастания частот (значение, назначенное в каждом узле), но похоже, что оно застревает, когда его вплоть до последнего «не внутреннего узла», как в узле связанного списка, которому был дан персонаж, с которого нужно начинать.Дерево Хаффмана, застрявшее на последнем не-внутреннем узле
void build_tree(pqueue *list)
{
node *temp;
node* parent_node;
int min_1, min_2, ind = 0, counter = 0, length = 4;
temp = new_node();
while (length > 2)
{
temp = list -> start; /* 0. point temp at the linked list start (lowest frequency/letter) */
parent_node = new_node(); /* 1. make new node */
min_1 = temp -> frequency;
parent_node -> left = temp; /* 2. assign parent to point at left leaf */
temp = temp -> next; /* 3. move to next node */
min_2 = temp -> frequency;
parent_node -> right = temp; /* 4. assign parent to point at right leaf */
parent_node -> letter = '$';
parent_node -> frequency = min_1 + min_2; /* 5.assign internal node frequency */
list -> start = temp -> next;/* set the list to point at the next node for the next iteration through the loop */
while (ind == 0 && temp -> next != NULL)
{
temp = temp -> next;
if (temp -> next -> frequency >= parent_node -> frequency && temp != NULL) /* insert parent node */
{
parent_node -> next = temp -> next; /* parent points at higher freq node */
temp -> next = parent_node; /* parent node is temp next */
ind = 1;
}
else if (temp -> next == NULL) /* insert at end of list if parent node is biggest frequency */
{
temp -> next = parent_node;
ind = 1;
}
}
ind = 0;
temp = list -> start; /* temp points at new start (two nodes along)*/
while (temp -> next != NULL)
{
temp = temp -> next;
counter++;
printf("%c : %d\n", temp -> letter, temp -> frequency);
}
printf("----------------------------------------------\n");
length = counter;
counter = 0;
}
}
При передаче текстового файла, он будет печатать каждую итерацию путем построения дерева, чтобы показать добавление двух узлов, удаления этих узлов и вставки нового узла (две предыдущих частоты узла суммируется), однако он заканчивается сбоем seg, когда он попадает только на внутренние узлы (помечены как $) и один не внутренний узел. т.е. это после того, как много итераций потребовалось, чтобы укоротить его до этого числа узлов:
$ : 4 $ : 4 $ : 4 z: 6 Segmentation fault (core dumped)