Моя очередь приоритетов продолжает удалять узлы, и я не знаю, почему - PullRequest
0 голосов
/ 25 февраля 2019

Я искал около 2 часов сейчас, и я не могу найти причину, по которой, но в 1 конкретном месте мой код, по-видимому, устанавливает для «следующего» узла значение Null, а остаток очереди с приоритетами стирается.Может быть, я что-то пропускаю, но я искал свой код и не могу найти проблему.Вот функция:

void PriorityQueue_add(PriorityQueue *pq, Node *newNode){
        printf("New Node:");
        node_print(newNode);
        newNode->in_queue = TRUE;

        if(pq->head == NULL){
                pq->head = newNode;
        }else if(newNode->lowest_cost <= pq->head->lowest_cost){
                newNode->next = pq->head;
                pq->head = newNode;
        }else if(pq->head->next == NULL){
                pq->head->next = newNode;
        }else{
                Node *prevNode = calloc(1, sizeof(Node));
                Node *tempNode = malloc(sizeof(Node));
                tempNode = pq->head;
                printf("TempNode next: %d\n", tempNode->next->id);
                while(tempNode != NULL && (newNode->lowest_cost > tempNode->lowest_cost)){
                        printf("RUNS\n");
                        prevNode = tempNode;
                        tempNode = tempNode->next;
                        printf("PrevNode: %d\n", prevNode->id);
                        printf("TempNode: %d\n", tempNode->id);
                }
                if(tempNode = NULL){
                        printf("RUNNING 1\n");
                        prevNode->next = newNode;
                }else{
                        printf("RUNNING 2\n");
                        prevNode->next = newNode;
                        newNode->next = tempNode;
                }
        }
}

и вот мои входы, которые я использовал для проверки кода:

////=============== NODE TEST =================
Node *test1 = malloc(sizeof(Node));
        Node *test2 = malloc(sizeof(Node));
        Node *test3 = malloc(sizeof(Node));
        Node *test4 = malloc(sizeof(Node));
        Node *test5 = malloc(sizeof(Node));
        node_init(test1);
        node_init(test2);
        node_init(test3);
        node_init(test4);
        node_init(test5);

        test1->id = 4;
        test2->id = 7;
        test3->id = 9;
        test4->id = 13;
        test5->id = 17;
        test1->lowest_cost = 5;
        test2->lowest_cost = 8;
        test3->lowest_cost = 10;
        test4->lowest_cost = 14;
        test5->lowest_cost = 18;
//============ Priority Queue TEST =============
        PriorityQueue *pq = malloc(sizeof(PriorityQueue));
        PriorityQueue_init(pq);
        PriorityQueue_add(pq, test3);
        PriorityQueue_print(pq);
        PriorityQueue_add(pq, test4);
        PriorityQueue_print(pq);
        PriorityQueue_add(pq, test1);
        PriorityQueue_print(pq);
        PriorityQueue_add(pq, test2);
        PriorityQueue_print(pq);
        PriorityQueue_add(pq, test5);
        PriorityQueue_print(pq);

Кроме того, вывод выглядит следующим образом:

New Node:[id: 9  cost: 10  in_queue: 0   next: (nil)    parent: (nil)]
Printing Queue:
[id: 9  cost: 10  in_queue: 1   next: (nil)    parent: (nil)]


New Node:[id: 13  cost: 14  in_queue: 0   next: (nil)    parent: (nil)]
Printing Queue:
[id: 9  cost: 10  in_queue: 1   next: 0x15b0290    parent: (nil)]
[id: 13  cost: 14  in_queue: 1   next: (nil)    parent: (nil)]


New Node:[id: 4  cost: 5  in_queue: 0   next: (nil)    parent: (nil)]
Printing Queue:
[id: 4  cost: 5  in_queue: 1   next: 0x15b0260    parent: (nil)]
[id: 9  cost: 10  in_queue: 1   next: 0x15b0290    parent: (nil)]
[id: 13  cost: 14  in_queue: 1   next: (nil)    parent: (nil)]


New Node:[id: 7  cost: 8  in_queue: 0   next: (nil)    parent: (nil)]
TempNode next: 9
RUNS
PrevNode: 4
TempNode: 9
RUNNING 2
Printing Queue:
[id: 4  cost: 5  in_queue: 1   next: 0x15b0230    parent: (nil)]
[id: 7  cost: 8  in_queue: 1   next: (nil)    parent: (nil)]


New Node:[id: 17  cost: 18  in_queue: 0   next: (nil)    parent: (nil)]
TempNode next: 7
RUNS
PrevNode: 4
TempNode: 7
RUNS
PrevNode: 7
makefile:4: recipe for target 'all' failed
make: *** [all] Segmentation fault (core dumped)

Я знаю, что в конце я получаю ошибку сегмента, потому что я пытаюсь распечатать tempNode-> id, когда tempNode равен Null, но меня это не волнует.Я не понимаю, почему в моей четвертой вставке список перезапускается с идентификаторов [4, 9, 13] до [4, 7].Заранее спасибо.

========================================= РЕДАКТИРОВАТЬ ===================================

Я нашел проблему у всех.Он был расположен в операторе if внутри оператора else.У меня случайно был 1 знак равенства вместо 2 ... так просто, но я упустил это из виду.

...