multiple - ¿La función de biblioteca de qsort() C no funciona en listas enlazadas?
qsort documentation c (3)
Como pude resolver el problema, utilizando el método 2] sugerido por @muskie en su respuesta, estoy publicando la respuesta aquí. Se necesitó una corrección de errores en las funciones sort_fn_descend / ascend, mencionadas en el OP editado, y el código está ordenando la lista jsut fine. Corrección de errores FYI - la función descender anterior debería devolver b - a y ascender fn debería devolver a - b.
Estoy tratando de ordenar una lista vinculada individualmente que se ha creado y todos sus elementos, punteros inicializados. Estoy tratando de usar la función de la biblioteca C qsort () como se muestra a continuación. No parece ordenar la lista. Me está dando error de compilación diciendo: left of ''item'' especifica undefined struct / union ''LINKED_LIST_S'' en la línea que se muestra debajo en el código.
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;
}
así es como se llama a la función mylistsort () en 2 lugares:
mylistsort (list, sort_fn_descend); // donde lista un puntero de lista enlazado inicializado correctamente.
mylistsort (list, sort_fn_ascend); // donde se muestra un puntero de lista enlazado inicializado correctamente.
1] No funciona qsort () en la lista vinculada si el nodo principal se pasa como matriz base (primer argumento) a qsort.
2] ¿Cómo logro la clasificación de esta lista vinculada usando qsort () en el código anterior?
EDITAR: Gracias por las respuestas. Ahora he implementado una forma de ordenar una lista como lo menciona el enfoque @muksie 1] sugirió, como el código a continuación. Todavía qsort () no devuelve una matriz ordenada de ints. Primero quiero ordenar una matriz de 100 elementos, en orden descendente, pero el conjunto pasado es exactamente el inverso, es decir, los elementos están en orden ascendente de 1,2, ... 100. ¿Qué estoy haciendo mal? ¿Cómo puedo arreglarlo?
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;
}
Para ordenar su lista enlazada, puede considerar las siguientes opciones:
- Cree una matriz simple con todos los valores de la lista vinculada, oriéntela y vuelva a transformarse en una lista vinculada.
- Implemente el algoritmo de quicksort para su estructura de datos de lista enlazada.
qsort
funciona en arreglos simples de datos de igual tamaño, no en listas vinculadas.