Comment sortinger les éléments de la liste par leur priorité en C?

Je souhaite sortinger les éléments de la liste en fonction de leur priorité, que l’utilisateur saisit, et cela se produit bien. Cependant, quand il y a plus d’un article avec la même priorité, il ne les sortinge pas par ordre d’arrivée comme il est supposé.

Je suis désolé si je ne le dis pas assez clairement pour que vous puissiez comprendre. Les noms des variables sont en portugais, alors si vous ne comprenez pas quelque chose, veuillez demander.

Voici le code:

typedef struct pedido pedido, *ppedido; struct pedido{ char id[5]; int prioridade; int mesa, n_pratos; struct prato *prato[TAM]; ppedido prox; }; struct prato{ char id[5]; }; ppedido novo_pedido(ppedido lista) { ppedido novo, aux, anterior = NULL; int i; novo = (struct pedido*)malloc(sizeof(pedido)); if(novo == NULL){ printf("Erro na alocacao de memoria...\n"); return; } printf("Number of menus: "); scanf("%d", &novo->n_pratos); printf("Table number: "); scanf("%d", &novo->mesa); printf("Priority of request? "); scanf("%d", &novo->prioridade); printf("Introduza o ID do pedido: "); scanf("%s", &novo->id); for(i=0;in_pratos;i++){ printf("ID of menu %d: ", i+1); //something like "M1, M4..." doesn't matter scanf("%s", &novo->prato[i]); fflush(stdin); } novo->prox=NULL; if(lista == NULL || novo->prioridade > lista->prioridade) { novo->prox = lista; lista = novo; } else { aux = lista; while(aux != NULL && novo->prioridade prioridade) //this is where it should be sort requests by their priority and order of arrival aux = aux->prox; novo->prox = aux->prox; aux->prox = novo; } return lista; } 

Je pense que tu veux changer ça:

 while(aux != NULL && novo->prioridade < aux->prioridade) 

À:

 while(aux->prox != NULL && novo->prioridade <= aux->prox->prioridade) 

De cette façon, il dépassera tous ceux de la même priorité et sera rapproché de la fin de la liste. Cela gardera une référence à aux lorsque vous passerez à la fin de la liste.

Je suppose que dans votre recherche, vous vous arrêtez dès que vous trouvez la priorité la plus élevée.

Cela suppose que l’ordre d’entrée dans la liste est le même que l’ordre d’arrivée.

Je ne vois pas de sorting dans votre code posté, mais la plupart des algorithmes de sorting ne sont pas stables. Cela signifie qu’ils ne préservent généralement pas l’ordre des éléments considérés comme “égaux”.

Vous devez soit passer à un sorting stable, soit modifier votre fonction de comparaison pour prendre en compte l ‘”heure d’arrivée” lorsque les priorités sont égales.

Supposons donc que nous avons la priorité, les tuples d’objects (priority, item) et l’ item est un caractère pour notre exemple.

 NULL 

La liste commence nulle. Nous commençons à insérer.

 (1, x) NULL 

 (3, z) (2, y) (1, x) NULL 

Maintenant nous insérons (0, a) .

if évalué à false, aux = lista pointant vers (3, z) .

Le while avance jusqu’aux points jusqu’à NULL .

Ensuite:

  novo->prox = aux->prox; aux->prox = novo; 

mais aux est NULL .

S’agissant de l’ordre d’arrivée, parlez-vous d’ordre d’arrivée en termes d’appels à la fonction ou d’un autre ordre d’arrivée faisant partie de vos données?