Saya ingin mengurutkan array struct di C, tetapi menggunakan aritmatika pointer. Solusi saya adalah sebagai berikut:

#include <stdio.h>

typedef struct{
    char* brand;
    double cost;
}Car;


void printA(Car * arr, int size);
void sort(Car * arr, int size);


void printA(Car* v,int s){
    int i=0;
    Car* p;
    for (p=&v[0];p<&v[3];p++){
        printf("%s %lf \n",p->brand, p->cost);
    }
}

void sort(Car* v,int s){
   Car *i,*j,*temp,*k;
   for (i=&v[0]; i<&v[s]; i++)
   {
    for (j=&v[0] ; j<&v[s]; j++)
    {
      k=j+1;
      if (j->cost > (j+1)->cost)
      {
        temp = j;
        j = k;
        k = temp;
      }
    }
   }
}

int main() {
  Car v[3];
  Car a = {.brand = "bmw", .cost = 34.56 };
  Car b = {.brand = "vw", .cost = 47.35 };
  Car c = {.brand = "ford", .cost = 45.23 };
  v[0] = a;
  v[1] = b;
  v[2] = c;
  printA(v,3);
  sort(v,3);
  printA(v,3);
  return 0;
}

Masalahnya adalah bahwa array saya yang dihasilkan tidak diurutkan. Saya percaya bahwa saya juga harus menukar biaya, tetapi saya tidak yakin. Ada bantuan?

Terima kasih

c
0
Little 29 Mei 2021, 02:06

2 jawaban

Jawaban Terbaik

Masalahnya adalah bagaimana Anda melakukan swap.

        temp = j;
        j = k;
        k = temp;

Ini semua Car *, pointer. Semua yang dilakukan adalah menukar alamat memori antara variabel yang kemudian ditimpa oleh iterasi loop berikutnya.

Anda perlu menukar isi memori .

        Car temp = *j;  // Store the content of j
        *j = *k;        // Replace the content of j with the content of k
        *k = temp;      // Replace the content of k with the saved content of j

Yang memperbaiki swap. Untuk jenis itu berfungsi, Anda ingin membandingkan I ke J, bukan J to J + 1.

// size_t is the appropriate type for array indexes.
// See https://en.cppreference.com/w/c/types/size_t
void sort(Car v[], size_t s) {
    // Declaring end makes the code easier to follow.
    //
    // Declare variables individually and in the narrowest
    // possible scope to make the code easier to follow
    // and to avoid accidentally reusing variables.
    Car *end = &v[s-1];

    // Check i <= &v[s-1] to avoid referencing memory
    // we do not own. Probably not an issue since we never
    // access the memory, but let's be safe.
    for (Car *i=&v[0]; i <= end; i++)
    {
        // Start at i + 1. Everything before i has been
        // sorted, and there's no need to compare i to i.
        for (Car *j=i+1; j <= end; j++)
        {
            // Compare i against j.
            if (i->cost > j->cost)
            {
                Car temp = *i;
                *i = *j;
                *j = temp;
            }
        }
    }
}

Dalam produksi Anda tidak akan menulis fungsi sortir Anda sendiri. Anda akan menulis fungsi perbandingan mobil dan memberinya makan ke fungsi penyortiran yang keluar seperti QSort.

int compare_cars(const void* _a, const void* _b) {
    const Car *a = (const Car*)_a;
    const Car *b = (const Car*)_b;

    if( a->cost < b->cost )  {
        return -1;
    }
    else if( a->cost > b->cost ) {
        return 1;
    }
    else {
        return 0;
    }
}

qsort(v,s,sizeof(Car), compare_cars);
2
Schwern 29 Mei 2021, 00:06

Alternatif yang disarankan:

#include <stdio.h>

typedef struct{
    char* brand;
    double cost;
}Car;

// Since you declared function prototypes at the top, you can put the implementations anywhere    
void printA(Car * arr, int size);
void sort(Car * arr, int size);

int main() {
  // Simplify array initialization
  Car v[3] = {
    { "bmw", .34.56 },
    { "vw", 47.35 }
    { "ford", 45.23 }
  };

  printA(v,3);
  sort(v,3);
  printA(v,3);

  return 0;
}

void printA(Car* v, int size){
    // Simplify array element access
    for (int i=0; i < size; i++){
        printf("%s %lf \n", v[i].brand, v[i].cost);
    }
}

void sort(Car* v, int size) {
   // Iterate using indexes (i, j, k); swap array values
   Car temp;
   int k;
   for (i=0; i < size; i++) {
     for (j=0; j < size; j++) {
       k=j+1;
       if (v[j].cost > v[k].cost) {
         temp = v[j];
         v[j] = v[k];
         v[k] = temp;
       }
     }
   }
}

Saya
tidak dikompilasi tes, saya punya tidak memverifikasi algoritma sortir Anda. Tapi saya harap ini akan memberi Anda beberapa tips berguna ...

0
paulsm4 28 Mei 2021, 23:37