我的程序应该读取一个文件,存储该文件的记录,然后对每个记录进行排序。我正在使用插入排序算法对记录进行排序,但我遇到了一些问题,使其有效。
例如,如果文本文件看起来像那样
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
将对st
的struct 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");
}
}