Skip to main content
5 of 5
added 124 characters in body
Jamal
  • 34.9k
  • 13
  • 133
  • 237

Shorten a sorting function

I have this function:

int sort(book *data, int books, char mode, char sortBy) {

  int i, j;
  book aux;
  aux.cat = malloc(sizeof *(aux.cat));

  if(sortBy == 'n') {
    for(i = 0; i < books; i++) {
      for(j = i; j < books; j++) {
        if(mode == 'a') {
          if(strcmp((data + i)->fname, (data + j)->fname) > 0) {
            aux = *(data + i);
            *(data + i) = *(data + j);
            *(data + j) = aux;
          }
        }
        else {
          if(strcmp((data + i)->fname, (data + j)->fname) < 0) {
            aux = *(data + i);
            *(data + i) = *(data + j);
            *(data + j) = aux;
          }
        }
      }
    }
  }
  else {
    for(i = 0; i < books; i++) {
      for(j = i; j < books; j++) {
        if(mode == 'a') {
          if(strcmp((data + i)->categ, "Fictiune") == 0) {
            if(((data + i)->cat)->price > ((data + j)->cat)->price) {
              aux = *(data + i);
              *(data + i) = *(data + j);
              *(data + j) = aux;
            }
          }
        }
        else {
          if(strcmp((data + i)->categ, "Fictiune") == 0) {
            if(((data + i)->cat)->price < ((data + j)->cat)->price) {
              aux = *(data + i);
              *(data + i) = *(data + j);
              *(data + j) = aux;
            }
          }
        }
      }
    }
  }

  free(aux.cat);

  return 0;
}

I need to sort the data array in two modes: ascending and descending, and by two criteria: name and price.

The question is: is there a way to write another, more compact function that will do the same thing?

And, what do you think about line 5 (aux.cat = malloc(sizeof *(aux.cat));)? Is it a right way to initialize the cat pointer?

These are the structures:

typedef struct {
  int price, edition;
  char favCharacter[SMAX];
} category;

typedef struct {
  char title[SMAX], fname[SMAX], lname[SMAX], categ[SMAX];
  category *cat;
} book;
mariusmmg2
  • 261
  • 3
  • 7