Сортировка слиянием в массиве структур - PullRequest
1 голос
/ 10 апреля 2020

У меня есть массив структур, где каждый объект является студентом с именем и оценкой, и я пытаюсь объединить сортировку этого массива (я хочу отсортировать их по классам в порядке возрастания). Вот структура студента:

struct Student
{
    char grade[42];
    char city[42];
};

оценка - это символ, потому что я присваиваю оценку, получая данные от пользователя с помощью fgets и sscanf. Я не думаю, что необходимо помещать весь мой код алгоритма сортировки слиянием, но я хочу поделиться этой частью, которая, я думаю, может быть проблематичной c?

    int firstHalfSize = midElement - firstElement + 1;
    int secondHalfSize = lastElement - midElement;
    struct Student firstHalfArray[firstHalfSize];
    struct Student secondHalfArray[secondHalfSize];
    char *p;
    char *s;
    int index1 = 0;
    int index2 = 0;
    int mergedArrIndex = firstElement;

    while (index1 < firstHalfSize && index2 < secondHalfSize)
    {
        if (strtol(firstHalfArray[index1].grade, &p, 10) <= strtol(secondHalfArray[index2].grade, &s, 10))
        {
            arr[mergedArrIndex] = firstHalfArray[index1];
            index1++;
        }
        else
        {
            arr[mergedArrIndex] = secondHalfArray[index2];
            index2++;
        }
        mergedArrIndex++;
    }

той частью, где я сортирую Объект ученика, сравнивая оценку, состоит в преобразовании char grade в длинную с strtol, что, я думаю, у меня получилось хорошо, так что это может не быть проблемой. Мои проблемы в том, что я инициализирую свой массив структур следующим образом:

struct Student students[5501];

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

struct Student aStudent;
int lineCounter = 0;
students[lineCounter] = aStudent;

и увеличивайте lineCounter на 1 каждый раз, когда я получаю новый ввод. (aStudent изменяется, когда я получаю новый ввод) Здесь я вызываю функцию сортировки слиянием и получаю странные результаты:

mergeSort(students, 0, 5501); // 5501 is the size of the array
printArray(students, 5501);

Вот функция printArray, созданная просто для того, чтобы увидеть, получаю ли я оценку в по возрастанию

void printArray(struct Student A[], int size)
{
    char *p;
    int i;
    for (i=0; i < size; i++)
        printf("%ld", strtol(A[i].grade, &p, 10));

}

, но я продолжаю печатать:

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

и я не знаю почему. Кроме того, как я могу это сделать, если пользователь добавляет объект «3 студента» в массив students Я рассматриваю его только как массив из 3 элементов, а не как массив из 5501 элемента? Спасибо! И извините, если это немного долго, я действительно старался быть кратким, не теряя важную информацию.

1 Ответ

0 голосов
/ 10 апреля 2020

Поскольку пользователь может ввести N чисел учеников, я рекомендую вместо этого использовать связанный список и поставить узел (struct Student) в правильное положение в зависимости от класса.

Вы можете узнать больше о Linked Списки здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...