У меня возникла проблема с сортировкой выбора с использованием арифметики указателя, а не с использованием стандартного нотации индекса. Причина, по которой я должен это сделать, - это присвоение класса. Все дело в том, чтобы научиться использовать арифметику указателей без «индексации читеров» (pointer + i
), где i
будет индексом как таковым: array[i]
.Сортировка выбора с указателями на элементы массива
Прежде чем вызвать функцию сортировки, я выделил массив из 1000 структур. Typedef выглядит следующим образом:
typedef struct
{
char* name;
char* art;
int rating;
} ENTRY;
Идея состоит в том, что я читаю файл, содержащий ASCII-арт. Каждое произведение искусства бросается в его собственную структуру. Вот одна «запись» из текстового файла:
Jean Pajerek
|\_____/|
|[o] [o]|
| V |
| |
-ooo---ooo-
# 4
Это сова! Но мне нужно сохранить имя, искусство и рейтинг в соответствующем поле структуры. Моя функция чтения работает отлично. Я выделяю массив из 1000 структур, а затем просто читаю текстовый файл. Он содержит только 18 изображений, поэтому не стоит беспокоиться.
Теперь давайте поговорим о моей функции выбора сортировки. Я начал с рассмотрения алгоритма сортировки выбора для массивов int с использованием нотации индекса, затем я попытался адаптировать его к моим требованиям.
- использование арифметики указателей
- движется вокруг структур вместо Интс
Так вот код:
void sort(ENTRY* aryptr, int* counter)
{
ENTRY* slow;
ENTRY* fast;
ENTRY* lastmin;
ENTRY min;
ENTRY temp;
int i;
int j;
printf("\n\n...SORTING\n\n\n");
slow = aryptr;
for (i=0; i < *counter - 2; i++)
{
min = *slow;
fast = slow + 1;
for (j = i + 1; j < *counter-1; j++)
{
if (strcmp(fast->name, min.name) < 0)
{
min = *fast;
lastmin = fast;
}
fast++;
}
temp = *slow;
*slow = min;
*lastmin = temp;
slow++;
}
}
Я использую i
и j
как счетчики, потому что я чувствовал, что тестирование для чего-то вроде walker->name != NULL
был небезопасным. (Должен ли я пытаться использовать NULL-тест в любом случае? Это кажется мне более «логически удовлетворительным», если я могу гарантировать вещь после того, как последний элемент, по сути, NULL ...) Независимо от того, что я использую для отслеживания мои местоположения для медленных и быстрых указателей, у меня проблема с подобным.
Проблема в следующем: у меня есть файл art.txt с кучей разных предметов искусства. Некоторые предметы искусства принадлежат одному и тому же человеку.
VOLDEMORT
(art is hippogryph)
# 1
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3
TONY STARK
(art is blob)
#1
EDDARD STARK
(art is dragon)
#5
Когда я закончу сортировки, произведения искусства того же автора будет рядом друг с другом в массиве. Меня не волнует порядок искусства того же человека. Предположим, что я сортирую его с помощью моего кода: я получаю что-то вроде этого.
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3
EDDARD STARK
(art is dragon)
#5
EDDARD STARK
(art is turtle)
# 4
TONY STARK
(art is blob)
#1
VOLDEMORT
(art is hippogryph)
# 1
отсортированный блок искусства Эддард Старк будет иметь копию первой части искусства в этом блоке в конце. Я посмотрел на свою логику, напечатал различные вещи для отладки, но я до сих пор не могу понять, где проблема. Думаю, я просто не смогу это увидеть, потому что так долго смотрел на свой проклятый код. Есть идеи?
Мне нравится сова. – st0le