Мне было поручено реализовать алгоритм сортировки слияния в списке, написанном на C/C++. У меня есть общая идея, написал мой код и успешно скомпилировал его. Однако, когда я запустил его, он начнется нормально, но затем введет «подготовленный список, теперь начинаю сортировку» без каких-либо ошибок. Я попытался просмотреть свой код, но у меня полная потеря относительно того, что может быть проблемой. Я также довольно дилетантский с отладкой, поэтому использование gdb в меру своих способностей не привело меня туда. Любые советы или советы будут огромной помощью, спасибо всем!Реализация mergesort в связанном списке
#include <stdio.h>
#include <stdlib.h>
struct listnode
{
struct listnode *next;
int key;
};
//Finds length of listnode
int
findLength (struct listnode *a)
{
struct listnode *temp = a;
int i = 0;
while (temp != NULL)
{
i++;
temp = temp->next;
}
return i;
}
struct listnode *
sort (struct listnode *a)
{
// Scenario when listnode is NULL
if (findLength (a) <= 1)
return a;
//Find middle
int mid = findLength (a)/2;
struct listnode *temp = a;
struct listnode *first = a;
struct listnode *second;
for (int i = 0; i < mid - 1; i++)
{
temp = a->next;
}
second = temp->next;
temp->next = NULL;
//Recursive calls to sort lists
first = sort (first);
second = sort (second);
if (first != NULL && second != NULL)
{
if (first->key < second->key)
{
a = first;
first = first->next;
}
else
{
a = second;
second = second->next;
}
}
struct listnode *head = a;
struct listnode *tail = a;
while (first != NULL && second != NULL)
{
if (first->key < second->key)
{
tail = first;
first = first->next;
tail = tail->next;
}
else
{
tail = second;
second = second->next;
tail = tail->next;
}
}
if (first == NULL)
{
while (second != NULL)
{
tail = second;
second = second->next;
tail = tail->next;
}
}
while (first != NULL)
{
tail = first;
first = first->next;
tail = tail->next;
}
return a;
}
Вот код теста при условии, написанный в C: INT
main (void)
{
long i;
struct listnode *node, *tmpnode, *space;
space = (struct listnode *) malloc (500000 * sizeof (struct listnode));
for (i = 0; i < 500000; i++)
{
(space + i)->key = 2 * ((17 * i) % 500000);
(space + i)->next = space + (i + 1);
}
(space + 499999)->next = NULL;
node = space;
printf ("\n prepared list, now starting sort\n");
node = sort (node);
printf ("\n checking sorted list\n");
for (i = 0; i < 500000; i++)
{
if (node == NULL)
{
printf ("List ended early\n");
exit (0);
}
if (node->key != 2 * i)
{
printf ("Node contains wrong value\n");
exit (0);
}
node = node->next;
}
printf ("Sort successful\n");
exit (0);
}
Вы не описали все, что должно быть зафиксировано в программе. –
'Однако, когда я запустил его, он начнется нормально, но затем снова без ошибок. Что это значит? Также ничего не говорится об этом коде C++. – Kevin
Ваш код довольно трудно прочитать. Я отредактировал его и использовал программу «indent», чтобы автоматически переформатировать ее. –