2015-12-11 5 views
-1

Итак, я создал функцию для построения дерева хаффмана, которое передается связанным списком в порядке возрастания частот (значение, назначенное в каждом узле), но похоже, что оно застревает, когда его вплоть до последнего «не внутреннего узла», как в узле связанного списка, которому был дан персонаж, с которого нужно начинать.Дерево Хаффмана, застрявшее на последнем не-внутреннем узле

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)

ответ

1

Ну, вот, по крайней мере одна ошибка:

while (ind == 0 && temp -> next != NULL) 
{ 
    temp = temp -> next; 
    if (temp -> next -> frequency >= parent_node -> frequency && temp != NULL) /* insert parent node */ 
    { 
     ... 

Пусть temp->next не NULL, но temp->next->next есть NULL. Затем вы вводите тело петли и заменяете temp на temp->next. Итак, теперь temp->next является NULL. Но вы пытаетесь ссылаться на temp->next->frequencey. Это нарушение сегментации. Сброс ядра.