Моя программа должна читать файл, сохранять записи этого файла и затем сортировать каждую запись. Я использую алгоритм сортировки вставкой для сортировки записей, но у меня проблемы с его работой.
Например, если текстовый файл выглядит так
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");
}
}





В вашем коде есть следующие проблемы.
вы заявили
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");
}
}
В основном мне приходилось передавать структуру, я этого не понимал. Спасибо большое!
Этот код копирует только числовое поле структуры, но оставляет строки в неправильном месте.
@ChrisTurner Действительно, исправил ваши выводы.
Возможный дубликат Сортировка структур из файла по алфавиту в C