Gam_z64
Messages postés3Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention13 avril 2006
-
11 avril 2006 à 21:44
Gam_z64
Messages postés3Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention13 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
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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.
Gam_z64
Messages postés3Date d'inscriptionsamedi 7 janvier 2006StatutMembreDernière intervention13 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