在C中排序数据结构数组

问题描述 投票:0回答:1

我的程序应该读取一个文件,存储该文件的记录,然后对每个记录进行排序。我正在使用插入排序算法对记录进行排序,但我遇到了一些问题,使其有效。

例如,如果文本文件看起来像那样

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 arrays
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");
      }
    }
© www.soinside.com 2019 - 2024. All rights reserved.