использование qsort для вложенного массива struct - PullRequest
0 голосов
/ 24 февраля 2020

Ниже приведены мои структуры и объявления qsort (которые должны быть организованы на основе nID)

РЕДАКТИРОВАТЬ:

struct items{
    int nID;
    int nQuantity;
    int nItems;
    float fPrice;
    char cItemName[21];
    char cCategory[21];
    char cItemDesc[31];
};

struct Register{
    struct items List[20];
    char cID[11];
    char cPassword[11];
    char cAddress[31];
    char cContact[16];
    char cName[21];
}; 

int main ()
{
  /*These are the contents of List[]*/
  Users[nInd].List[1].nID = 1;
  strcpy(Users[nInd].List[1].cItemName, "iPhoneMAXMAX");
  strcpy(Users[nInd].List[1].cCategory, "Gadgettronss");
  strcpy(Users[nInd].List[1].cItemDesc, "This is an iphone");
  Users[nInd].List[1].nQuantity = 1;
  Users[nInd].List[1].fPrice = 100;

  Users[nInd].List[0].nID = 50;
  strcpy(Users[nInd].List[0].cItemName, "iPhone");
  strcpy(Users[nInd].List[0].cCategory, "Gadgets");
  strcpy(Users[nInd].List[0].cItemDesc, "This is an iphone");
  Users[nInd].List[0].nQuantity = 20;
  Users[nInd].List[0].fPrice = 50;

  for (i = 0; i < 2; i++)
    qsort (&Users[nInd].List[i], 2, sizeof (struct Register), sort);

  for (i = 0; i < 2; i++)
    printf ("%11d  %20s\t %15s  \t   % 10.2f  \t\t      %2d\n", 
        Users[nInd].List[i].nID, Users[nInd].List[i].cItemName,
        Users[nInd].List[i].cCategory, Users[nInd].List[i].fPrice, 
        Users[nInd].List[i].nQuantity);
/*rest of the code*/
}

Идеальный результат:

Идентификатор продукта Название товара Категория Цена Количество

1 Iphone Гаджеты 50,00 20

50 IphoneMAXMAX Gadgettronss 100,00 1

Фактический выход:

50 IphoneMAXMAX Gadgettronss 100,00 1

1 Iphone Гаджеты 50.00 20

Однако моя проблема заключается в том, что при отображении содержимого List [] ничего не меняется.

Это моя функция сравнения для qsort:

int sort (const void*p, const void*q)
{
  const struct Register *ip = (struct Register*)p;
  const struct Register *iq = (struct Register*)q;

  if (ip->List[0].nID > iq->List[1].nID)
    return 1;
  else if (ip->List[0].nID < iq->List[1].nID)
    return -1;
  else
    return 0;

}

1 Ответ

4 голосов
/ 24 февраля 2020

Если вы хотите отсортировать элементы в массиве List, используя qsort, то, например, выполните

qsort(Users[nInd].List, NumberOfElementsInList, sizeof(struct items), CompareItems);

. Это позволит отсортировать NumberOfElementsInList первые struct items элементы в массиве * 1008. *.

Ваша функция сравнения получает указатели на элементы struct items в массиве:

int CompareItems(const void *a, const void *b)
{
    const struct items *item_a = (const struct items *) a;
    const struct items *item_b = (const struct items *) b;

    if (item_a->nID > item_b->nID)
        return 1;
    else if (item_a->nID < item_b->nID)
        return -1;
    else
        return 0;
}

Если вы хотите "отсортировать" только два первых элемента в Users[nInd].List массив, тогда функция qsort не нужна, просто сравните два элемента напрямую и поменяйте местами, если необходимо:

if (Users[nInd].List[0].nID > Users[nInd].List[1].nID)
{
    // Swap the items as index 0 and 1, thereby sorting them
    struct items temp_item = Users[nInd].List[0];
    Users[nInd].List[0] = Users[nInd].List[1];
    Users[nInd].List[1] = temp_item;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...