Разве функция библиотеки qsort () C не работает со связанными списками? - PullRequest
0 голосов
/ 17 августа 2011

Я пытаюсь отсортировать односвязный список, который был создан и все его элементы, указатели инициализированы. Я пытаюсь использовать функцию библиотеки qsort () C, как показано ниже. Это не похоже на сортировку списка. Это дает мне ошибку компилятора, говоря: слева от 'item' указывает неопределенную структуру / объединение 'LINKED_LIST_S' в строке, показанной ниже в коде.

struct LINKED_LIST_S
{
         int item;
         struct LINKED_LIST_S * next; 
 } ;

typedef int (*cmpfn)(const void *ptr1, const void *ptr2);

int mylistsort(my_list_t list, cmpfn f1)
{

    qsort ( list , 100, sizeof (struct LINKED_LIST_S), (fn) );
   return -1;
}


int sort_fn_ascend(const void *ptr1, const void *ptr2)
{
    int a = (*(LINKED_LIST_S *)ptr1).item; //Compiler error
   int b = (*(LINKED_LIST_S *)ptr2).item; //Compiler error

  return b - a;

}

int sort_fn_descend(const void *ptr1, const void *ptr2)
{   
   int a = ((struct LINKED_LIST_S *)ptr1)->item; //Compiler error
   int b = ((struct LINKED_LIST_S *)ptr2)->item; //Compiler error

  return a - b;

}

это то, как функция mylistsort () вызывается в 2 местах:

mylistsort (list, sort_fn_descend); // где список правильно инициализированный указатель на связанный список.

mylistsort (list, sort_fn_ascend); // где список правильно инициализированный указатель на связанный список.

1] Не работает qsort () для связанного списка, если poitner головного узла передается в качестве базового массива (первый аргумент) в qsort.

2] Как мне выполнить сортировку этого связанного списка с помощью qsort () в приведенном выше коде?

РЕДАКТИРОВАТЬ: Спасибо за ответы. Теперь я реализовал способ сортировки списка, упомянутый @muksie подхода 1], который он предложил, в виде кода ниже. Тем не менее, qsort () не возвращает отсортированный массив целых чисел. Сначала я хочу отсортировать массив из 100 элементов в порядке убывания, но переданный массив является точным обратным, то есть элементы расположены в порядке возрастания от 1,2, ... 100. Что я делаю неправильно? Как я могу это исправить?

int linkedListSort(LINKED_LIST_T list, newCompareFunction fn, void *usr_info)
{
    LINKED_LIST_T tmpptr = list;
    int newitems[N_ITEMS];
    int i=0;

    //Logic to get all the items in the list in a array
    while(tmpptr != NULL)
    {
        newitems[i] = tmpptr->item;
        tmpptr = tmpptr->next;
        i++;
    }
    tmpptr = list;
    i = 0;
    //Sort that array
    //qsort ( list , 100, sizeof (struct LINKED_LIST_S), (fn) );
    qsort ( newitems , 100, sizeof(list->item), (fn) );

    //store the sorted items back into the list.
    while(tmpptr != NULL)
    {
        tmpptr->item = newitems[i];
        tmpptr = tmpptr->next;
        i++;
    }

   return -1;
}

int sort_fn_descend(void *ptr1,void *ptr2)
{   
   int a = *((int*)(ptr1));
   int b = *((int*) (ptr2));

  return a - b;

}


int sort_fn_ascend(const void *ptr1, const void *ptr2)
{
    int a = *((int*)(ptr1));
   int b = *((int*) (ptr2));

  return b - a;

}

Ответы [ 3 ]

7 голосов
/ 17 августа 2011

qsort работает на простых массивах данных одинакового размера, а не на связанных списках.

2 голосов
/ 17 августа 2011

Для сортировки связанного списка вы можете рассмотреть следующие варианты:

  1. Создать простой массив со всеми значениями связанного списка, отсортировать его и преобразовать обратно в связанный список.
  2. Реализация алгоритма быстрой сортировки для структуры данных связанного списка.
0 голосов
/ 18 августа 2011

Поскольку я смог решить проблему, используя подход 2], предложенный @muskie в своем ответе, я публикую ответ здесь.Требовалось исправить ошибку в функциях sort_fn_descend / ascend, упомянутых в отредактированном OP, и код сортировал список хорошо.Исправление ошибки FYI - функция понижения выше должна возвращать b - a, а ascend fn должна возвращать a - b.

...