Я пытаюсь отсортировать односвязный список, который был создан и все его элементы, указатели инициализированы. Я пытаюсь использовать функцию библиотеки 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;
}