Программирование на C: функция, использующая указатели для сортировки массива

#arrays #c #sorting

#массивы #c #сортировка

Вопрос:

У меня возникли некоторые проблемы с этой функцией. Его основная цель — отсортировать массив классов (ниже) в порядке убывания по количеству разделов. Вот массив классов:

 CIS_CLASSES *pCls, *pLast;
CIS_CLASSES  clsList[NUM_CLS] =
{
    {"CIS 35A", 2, {61, 63}},
    {"CIS 35B", 1, {62}},
    {"CIS 41A", 3, {1, 2, 61}},
    {"CIS 28",  1, {61}},
    {"CIS 22C", 4, {3, 4, 61, 63}},
    {"CIS 26B", 1, {61}},
    {"CIS 22B", 8, {1, 2, 3, 4, 6, 61, 62, 63}},
    {"CIS 29",  1, {61}},
    {"CIS 22A", 8, {1, 3, 5, 6, 7, 8, 61, 63}},
};
 

Я также определил NUM_CLS с помощью struct:

 #define NUM_CLS 9

typedef struct
{
    char  course[10];
    int   noSections;
    int   sections[16];
    int final;
} CIS_CLASSES;`
 

Вот функция :

 void sortDescend(CIS_CLASSES  list[], CIS_CLASSES *pLast);
{
    CIS_CLASSES *pCurr;
    CIS_CLASSES *pWalk;

    for (pCurr = list- 1; pCurr < pLast; pCurr  )
    {
        CIS_CLASSES temp = *pCurr;
        pWalk = pCurr - 1;
        while (pWalk >= 0 amp;amp; temp.final > pLast->list[pWalk].final)
        {
            pLast->list[pWalk   1] = pLast->list[pWalk];
            pWalk--;
        }
        pLast->list[pWalk   1] = temp;
    }
  }
}
 

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке: нет элемента с именем ‘list’ в ‘CIS_CLASSES’. Но я не понимаю, почему? и как я могу заставить ее работать? Пожалуйста, дайте мне знать, если я что-то упустил!

Комментарии:

1. Каковы ваши намерения с этим выражением: pLast->list[pWalk] ?

2. Ваш параметр CIS_CLASSES list[] равен, а затем вы определяете pCurr = list- 1 , но нет смысла вычитать 1 из массива. Даже если бы это имело смысл, это дало бы вам указатель на некоторую память ПЕРЕД началом массива (память, которую вы не должны трогать). Затем вы определяете pWalk = pCurr - 1; так, что pWalk теперь является указателем на какую-то другую память ПЕРЕД началом массива (память, которую вы не должны трогать). Затем вы используете этот указатель pWalk в качестве индекса массива. Но указатели не являются индексами массива, поэтому эта часть неверна. Я не уверен, что вы на самом деле хотели сделать…

Ответ №1:

Глядя на вашу структуру, я не вижу list там элемента:

 typedef struct
{
    char  course[10];
    int   noSections;
    int   sections[16];
    int final;
} CIS_CLASSES;
 

Поэтому

 pLast->list[pWalk].final
 

должен произойти сбой.

Ответ №2:

Пожалуйста, попробуйте сделать следующее.

 void sortDescend(CIS_CLASSES  pInput[], CIS_CLASSES **pOutput);
{
    // pOutput should be declared in your main function as the following
    // CIS_CLASSES **pOutput = (CIS_CLASSES **)malloc(NUM_CLS * sizeof(PVOID));

    // copy pointer arrays of CIS_CLASSES list elements
    for(int i=0; i<NUM_CLS; i  )
    {
        pOutput[i] = amp;pInput[i];
    }

    // bubble sort
    for (int i=0; i<NUM_CLS-1, i  )
    {
        for (int j=i 1; j<NUM_CLS; j  )
        {
            CIS_CLASSES temp = *pCurr;
            if(pOutput[i]->noSection < pOutput[j]->noSection)
            {
                pCurr = pOutput[i];
                pOutput[i] = pOutput[j];
                pOutput[j] = pCurr;
            }
        }
    }
    // You can access the descending sorted list item like pOutput[index]->course, ... 
}
 

Ответ №3:

Спасибо всем! Я обновил свой код до этого :

     void sortDescend(CIS_CLASSES  list[], CIS_CLASSES *pLast);
 

{

 CIS_CLASSES *pCurr;
 CIS_CLASSES *pWalk;

for (pCurr = list 1; pCurr < pLast; pCurr  )
{
    CIS_CLASSES temp = *pCurr;
    pWalk = pCurr - 1;
    while (pWalk >= 0 amp;amp; strcmp(temp.course, pWalk->course) > 0)
   {
         *(pWalk   1) = *pWalk;
          pWalk--;
   }
   *(pWalk   1)  = temp;
}
 

}
}