Как отсортировать что-то по типу структуры - PullRequest
0 голосов
/ 15 марта 2020

У меня есть структура ElementType

typedef struct
{
    int AtomicNumber;
    char Name[31];
    char Symbol[4];
} ElementType;

Я пытаюсь реализовать алгоритм сортировки, который будет сортировать элементы по алфавиту. Я сравниваю строки, но ничего не работает. Я не могу понять, что не так с моей функцией ниже.

void sortAlphabetical(ElementType elements[NUM_ELEMENTS])
{
   printf("SORTING!\n");
   int c, d;
   for (c = 0 ; c < NUM_ELEMENTS - 1; c++)
   {
       for (d = 0 ; d < NUM_ELEMENTS - c - 1; d++)
       {
           if (elements[d].Name > elements[d+1].Name)
           {
                ElementType temp;

                temp.AtomicNumber = elements[d].AtomicNumber;
                strcpy(temp.Name, elements[d].Name);
                strcpy(temp.Symbol, elements[d].Symbol);

                elements[d].AtomicNumber = elements[d+1].AtomicNumber;
                strcpy(elements[d].Name, elements[d+1].Name);
                strcpy(elements[d].Symbol, elements[d+1].Symbol);

                elements[d+1].AtomicNumber = temp.AtomicNumber;
                strcpy(elements[d+1].Name, temp.Name);
                strcpy(elements[d+1].Symbol, temp.Symbol);
           }
       }
   }
}

1 Ответ

5 голосов
/ 15 марта 2020
if (elements[d].Name > elements[d+1].Name)

C Оператор > недостаточно "умен", чтобы сравнивать строки в словаре; это только для чисел или указателей. Это условие фактически сравнивает указатели char* с первыми символами имен.

Вместо этого вам потребуется функция strcmp:

if (strcmp(elements[d].Name, elements[d+1].Name) > 0)

Также вместо того, чтобы писать собственную пузырьковую сортировку, вы можете подумать, что qsort, который предназначен именно для такого рода вещей, немного проще в написании и может быть быстрее для больших массивов:

#include <stdlib.h>
#include <string.h>

int compareElementNames(const void* p1, const void* p2)
{
    const ElementType *elem1 = p1;
    const ElementType *elem2 = p2;
    return strcmp(elem1->Name, elem2->Name);
}

void sortAlphabetical(ElementType elements[NUM_ELEMENTS])
{
    qsort(elements, NUM_ELEMENTS, sizeof(*elements), compareElementNames);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...