Probleme de tri suivant 2 paramètres

Résolu
Gam_z64 Messages postés 3 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 avril 2006 - 11 avril 2006 à 21:44
Gam_z64 Messages postés 3 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 avril 2006 - 13 avril 2006 à 00:36
Bonsoir, je vous appelle à l'aide parce que je n'arrive pas à trier ma liste chainée correctement; je n'ai pas trouvé de solution à mon problème sur le site. Ce serai sympa de votre part si vous pouviez m'aider.

voila comment est définie ma structure:

struct point {
int indiceligne;
int indicecolonne;
int F; // F = G + H
int G; // distance du point de depart au point courant
int H; // distance Manhattan pour aller jusqu'au point destination
int traite;// 0 si non traité et 1 si traité
struct point *suivant;
};


struct point *ListeOuverte = NULL;

mon prog de tri :
// On trie en meme temps qu'on ajoute des points
void AjoutePointListeOuverte (int i, int j, float G, float H) {
struct point *p;


p = (struct point *) malloc(sizeof(struct point));
(*p).indiceligne = i;
(*p).indicecolonne = j;
(*p).F = G + H;
(*p).G = G;
(*p).H = H;
(*p).suivant = NULL;


if (ListeOuverte == NULL)
ListeOuverte = p;
else {
struct point *pcourant = ListeOuverte;
struct point *pprecedent = ListeOuverte;
while (((*pcourant).suivant != NULL) && ((*pcourant).F <= (*p).F)) {
pprecedent = pcourant;
pcourant = (*pcourant).suivant;
}
if ((*pcourant).suivant == NULL) {
if ((*p).F >= (*pcourant).F)
(*pcourant).suivant = p; // fin de liste
else
if ((pprecedent == ListeOuverte) && ((*p).F < (*ListeOuverte).F)){
(*p).suivant = ListeOuverte; // debut de liste
ListeOuverte = p;
}
else {
(*pprecedent).suivant = p;
(*p).suivant = pcourant;
} }
else {
if ((pprecedent == ListeOuverte) && ((*p).F < (*ListeOuverte).F)) {
(*p).suivant = ListeOuverte; // debut de liste
ListeOuverte = p;
}
else {
(*pprecedent).suivant = p;
(*p).suivant = pcourant;
} } }}

Le problème est que dans mon tri, quand j'ai deux F égaux, je voudrais trier ces elements par valeur de int traite, les '0' en premier.
(je travaille sous visual c++6 et je suis débutant en c et c++)
pouvez vous m'aider? merci d'avance

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 avril 2006 à 22:38
Bon deja, remplace ca (*p).H par ca: p->H, ca sera bcp plus lisible dans ton programme.



Et ca veut dire quoi ca: "je voudrais trier ces elements par valeur de int traite".

En enfin, soit explique mieux, soit commente ton programme, car c'est illisible la :)
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
13 avril 2006 à 00:33
Le pb, c'est que tu veux tout faire en meme temps. Créer une fonction
qui permute deux éléments, ca permettra d'avoir une fonction de tri
plus lisible. Ou peut etre une fonction qui permet de déplacer un
élément de ta liste chainer.



Apres, c'est plus simple pour ton tri, t'as juste a maintenir deux
compteurs pour le début, et la fin de la liste. Quand tu rajoutes des
éléments, tu as juste a les ajouter après/avant le compteur.
3
Gam_z64 Messages postés 3 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 avril 2006
11 avril 2006 à 22:48
// On trie en meme temps qu'on ajoute des points
void AjoutePointListeOuverte (int i, int j, float G, float H) {
struct point *p;
p = (struct point *) malloc(sizeof(struct point));
(*p).indiceligne = i;
(*p).indicecolonne = j;
(*p).F = G + H;
(*p).G = G;
(*p).H = H;
(*p).traite=0;
(*p).suivant = NULL;


if (ListeOuverte == NULL)
ListeOuverte = p;
else {
struct point *pcourant = ListeOuverte;
struct point *pprecedent = ListeOuverte;
while ((pcourant -> suivant != NULL) && (pcourant -> F <= p -> F)) {
pprecedent = pcourant;
pcourant = pcourant -> suivant;
}
if (pcourant -> suivant == NULL) {
if (p -> F >= pcourant -> F)
pcourant -> suivant = p; // range en fin de liste
else
if ((pprecedent == ListeOuverte) && (p -> F < ListeOuverte -> F)){
p -> suivant = ListeOuverte; // range en debut de liste
ListeOuverte = p;
}
else {
pprecedent -> suivant = p;
p -> suivant = pcourant;
}
}
else {
if ((pprecedent == ListeOuverte) && (p -> F < ListeOuverte -> F)) {
p -> suivant = ListeOuverte; // range en debut de liste
ListeOuverte = p;
}
else {
pprecedent -> suivant = p;
p -> suivant = pcourant;
}
}
}
}

Je voudrais que la liste soit rangée de telle sorte que les elements ayant int traite=0 soent en haut (trié par F croissant) et les elements avec int traite=1 en bas de la liste (trié par F croissant)
Merci
0
Gam_z64 Messages postés 3 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 avril 2006
13 avril 2006 à 00:36
Ok merci, quelqu'un m'a dit la meme chose de faire une fonction qui compare deux élements et de trier ; j'essaie de le faire.
Un grand merci encore
0
Rejoignez-nous