Probleme de tri suivant 2 paramètres [Résolu]

Messages postés
3
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2006
- - Dernière réponse : 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
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
4
3
Merci
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 :)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 217 internautes nous ont dit merci ce mois-ci

Commenter la réponse de luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
4
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 217 internautes nous ont dit merci ce mois-ci

Commenter la réponse de luhtor
Messages postés
3
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2006
0
Merci
// 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
Commenter la réponse de Gam_z64
Messages postés
3
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 avril 2006
0
Merci
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
Commenter la réponse de Gam_z64