Я искал около 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 ... так просто, но я упустил это из виду.