Сортировка массива структур данных в C

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

Например, если текстовый файл выглядит так

string one; string one; string one; 1
string two; string two; string two; 2
string three; stringh three; string three; 3

Мне нужно, чтобы третья запись была первой, вторая - второй, а первая - последней. Поскольку 3> 2> 1.

Я думаю, что алгоритм сортировки вставкой верен, поскольку я тестировал его с простым массивом, и он работает, но мне трудно реализовать его в моей программе. Я получаю ошибку insertionSort’ makes pointer from integer without a cast, я думаю, это потому, что я использую структуру данных для хранения данных, отсканированных из файла.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100

struct Element
   {
    char one[100];
    char two[100];
    char three[100];
    int st;
   };

void insertionSort(int arr[]);
void printArray(int arr[]);


int main() {


    int i;
    struct Element elements[MAXLEN];


    FILE * fpointer = fopen("clients.txt", "r");

    char buffer[1024]; // Define a really big string to hold the line of text in
    char *field;
    int field_number;


    while(fgets(buffer,1024,fpointer))
        {
        field_number=0;
        field=strtok(buffer,";");
        while(field)
          {
           switch(field_number)
            {
              case 0:
              strcpy(elements[i].one,field);
              break;
              case 1:
              strcpy(elements[i].two,field);
              break;
              case 2:
              strcpy(elements[i].three,field);
              break;
              case 3:
              elements[i].st=atoi(field);
              break;
            }
         field=strtok(NULL,";"); // Get next field
         field_number++;
         }
        i++; // Move the index for elements to the next one
      }


    insertionSort(elements[MAXLEN].st);
    printArray(elements[MAXLEN].st);

    fclose(fpointer);
    return 0;

}


void insertionSort(int arr[])
{  
   struct Element elements[MAXLEN];
   int i, key, j;
   for (i = 1; i < 10; i++)
    {
       key = elements[i].st;
       j = i-1;


       while (j >= 0 && elements[j].st > key)
       {
           elements[j+1].st = elements[j].st;
           j = j-1;
       }
       elements[j+1].st = key;
    }

}


void printArray(int arr[])
{
int i;
for (i=0; i < 10; i++) {
    printf("%d ", arr[i]);
    printf("\n");
  }
}

Возможный дубликат Сортировка структур из файла по алфавиту в C

Chris Turner 31.08.2018 17:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде есть следующие проблемы.

вы заявили void insertionSort(int arr[]); and void printArray(int arr[]); функции, которые принимают pointer в int array в качестве аргумента, но вы передаете insertionSort(elements[MAXLEN].st); & printArray(elements[MAXLEN].st); просто int в качестве параметра.

Также insertionSort будет сортировать поля ststruct Element elements[MAXLEN]; , но не сам elements. и insertionSort отсортирует массив по возрастанию, а не по убыванию, как вы хотите.

Следовательно, измените это

   while (j >= 0 && elements[j].st > key)

к

   while (j >= 0 && elements[j].st < key.st)

Рассмотрим приведенный ниже код в качестве примера.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXLEN 100

    struct Element
       {
        char one[100];
        char two[100];
        char three[100];
        int st;
       };

    void insertionSort(struct Element elements[]);
    void printArray(struct Element elements[]);


    int main() {


        int i;
        struct Element elements[MAXLEN];


        FILE * fpointer = fopen("clients.txt", "r");

        char buffer[1024]; // Define a really big string to hold the line of text in
        char *field;
        int field_number;


        while(fgets(buffer,1024,fpointer))
            {
            field_number=0;
            field=strtok(buffer,";");
            while(field)
              {
               switch(field_number)
                {
                  case 0:
                  strcpy(elements[i].one,field);
                  break;
                  case 1:
                  strcpy(elements[i].two,field);
                  break;
                  case 2:
                  strcpy(elements[i].three,field);
                  break;
                  case 3:
                  elements[i].st=atoi(field);
                  break;
                }
             field=strtok(NULL,";"); // Get next field
             field_number++;
             }
           i++; // Move the index for elements to the next one
          }


        insertionSort(elements);
        printArray(elements);

        fclose(fpointer);
        return 0;

    }


void insertionSort(struct Element elements[])
{
   int i, j;
  struct Element key;
   for (i = 1; i < 10; i++)
    {
       key = elements[i];
       j = i-1;


       while (j >= 0 && elements[j].st < key.st)
       {
           elements[j+1] = elements[j];
           j = j-1;
       }
       elements[j+1] = key;
    }

}


    void printArray(struct Element elements[])
    {
    int i;
    for (i=0; i < 3; i++) {
        printf("%s %s %s%d ", elements[i].one,elements[i].two,elements[i].three,elements[i].st);
        printf("\n");
      }
    }

В основном мне приходилось передавать структуру, я этого не понимал. Спасибо большое!

Jack022 31.08.2018 17:58

Этот код копирует только числовое поле структуры, но оставляет строки в неправильном месте.

Chris Turner 31.08.2018 18:03

@ChrisTurner Действительно, исправил ваши выводы.

kiran Biradar 31.08.2018 18:20

Другие вопросы по теме