Langage C: liste chainee
Fermé
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
-
14 avril 2011 à 18:50
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 19 avril 2011 à 18:52
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 19 avril 2011 à 18:52
A voir également:
- Langage C: liste chainee
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Dev-Pascal - Télécharger - Édition & Programmation
16 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
14 avril 2011 à 22:16
14 avril 2011 à 22:16
return distance[p1->numero][p2->numero];
Tu fais un return d'une variable locale. Il faut pas faire ça. Soit, tu fais une variable statique, soit tu déclares ta variable dans la fonction appelante (probablement le main) et tu passes la variable en paramètre.
Cdlt,
Tu fais un return d'une variable locale. Il faut pas faire ça. Soit, tu fais une variable statique, soit tu déclares ta variable dans la fonction appelante (probablement le main) et tu passes la variable en paramètre.
Cdlt,
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
14 avril 2011 à 22:58
14 avril 2011 à 22:58
Merci pour votre réponse.
En fait je voudrais calculer la distance entre deux noeuds (sachant que j'ai 4 noeuds).
J'ai detoute sur la méthode.
J'ai refait. Pourriez-vous me dire si c'est correcte?
Merci par avance de votre aide.
En fait je voudrais calculer la distance entre deux noeuds (sachant que j'ai 4 noeuds).
J'ai detoute sur la méthode.
J'ai refait. Pourriez-vous me dire si c'est correcte?
Merci par avance de votre aide.
typedef struct noeud noeud; struct noeud { int numero; double abscisse; double ordonee; struct noeud *suivant; }; typedef noeud* llist; double * calculer_distance_entre_sommets(noeud *p1, noeud *p2) { double *distance; distance = malloc(16 * sizeof(*distance)); *distance = sqrt((p1->abscisse - p2->abscisse) * (p1->abscisse - p2->abscisse) +(p1->ordonee - p2->ordonee) * (p1->ordonee - p2->ordonee)); return distance; } int main () { llist ma_liste = NULL; noeud *p1 = ma_liste; noeud *p2 = ma_liste; double * distance = calculer_distance_entre_sommets(p1, p2); if (distance == NULL) free(distance); else { for(i=0;i<16;i++) printf("%lf\n", distance[i]); return 0; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
14 avril 2011 à 23:18
14 avril 2011 à 23:18
noeud *p1 = ma_liste;
Donc p1=NULL puisque ma_liste=NULL;
Même remarque pour p2.
sqrt((p1->abscisse - p2->abscisse
p1->... cela va aller lire à l'adresse 0000 (NULL) et tu devrais obtenir un segfault.
Il faut que tu alloues p1 et p2 et que tu remplisses correctement les structures.
Ensuite, je te refais la même remarque que tout à l'heure.
return distance;
Tu retournes une variable locale. Il faut passer par un double pointeur.
if (distance == NULL)
free(distance);
Si distance=NULL, pourquoi faire un free ? Inutile. C'est plutôt si c'est différent de NULL que c'est utile, pour libérer la zone. Mais faut le faire lorsque tu n'as plus besoin du pointeur (donc avant ton return 0;
printf("%lf\n", distance[i]);
C'est printf("%f\n", ...) qu'il faut mettre. et non "%lf".
Cdlt,
Donc p1=NULL puisque ma_liste=NULL;
Même remarque pour p2.
sqrt((p1->abscisse - p2->abscisse
p1->... cela va aller lire à l'adresse 0000 (NULL) et tu devrais obtenir un segfault.
Il faut que tu alloues p1 et p2 et que tu remplisses correctement les structures.
Ensuite, je te refais la même remarque que tout à l'heure.
return distance;
Tu retournes une variable locale. Il faut passer par un double pointeur.
if (distance == NULL)
free(distance);
Si distance=NULL, pourquoi faire un free ? Inutile. C'est plutôt si c'est différent de NULL que c'est utile, pour libérer la zone. Mais faut le faire lorsque tu n'as plus besoin du pointeur (donc avant ton return 0;
printf("%lf\n", distance[i]);
C'est printf("%f\n", ...) qu'il faut mettre. et non "%lf".
Cdlt,
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
14 avril 2011 à 23:58
14 avril 2011 à 23:58
merci pour votre réponse.
Voici ce que j'ai réalisé. Cela marcha sauf que je voulais uniliser les valeurs dans les cases de tableau en faisant des opération comme soustraction, addition, etc. Je ne sais pas comment accéder à ces cases :(((
Merci encore.
Voici ce que j'ai réalisé. Cela marcha sauf que je voulais uniliser les valeurs dans les cases de tableau en faisant des opération comme soustraction, addition, etc. Je ne sais pas comment accéder à ces cases :(((
Merci encore.
double** calculer_distance (llist client_liste) { noeud *h = client_liste; noeud *p1 = client_liste; noeud *p2 = client_liste; noeud *debut_liste = client_liste; int i; int j; double **distance; FILE *fichier = NULL; if ((fichier = fopen("D:\\Codes Thèse\\TS2004t3\\test.txt", "r")) == NULL)/*ouverture du fichier en lecture*/ printf("Error: impossible d'ouvrir fichier donnees.txt\n"); else//non { for (i=0;i<5;i++) fscanf(fichier, "%i %i %i %i %i %i %i %i",&(h->identifiant),&(h->abscisse),&(h->ordonee),&(h->demande),&(h->temps_service),&(h->borne_inf_tw),&(h->borne_sup_tw),&(h->capacite)); distance = (double **) malloc (5 * sizeof (double*)); for (i=0;i<5;i++) { distance[i]=(double *) malloc (5 * sizeof(double)); } j=0; for (p1=debut_liste;p1!=NULL;p1=p1->suivant) { distance[j][j]= 0.0; i=j+1; for (p2=p1->suivant;p2!=NULL;p2=p2->suivant) { distance[i][j]= distance[j][i]= sqrt((p1->abscisse - p2->abscisse) *(p1->abscisse - p2->abscisse) +(p1->ordonee - p2->ordonee) * (p1->ordonee - p2->ordonee)); i++; } j++; } fclose (fichier); } return distance; } int main () { llist ma_liste = NULL; double **matrice_distance = calculer_distance(ma_liste); }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
Modifié par fiddy le 15/04/2011 à 11:42
Modifié par fiddy le 15/04/2011 à 11:42
Il manque le free dans le main. Et pas besoin d'un double pointeur dans le main, juste dans la fonction calculer_distance.
Par exemple :
fscanf("...",&(h->identifiant), ...)
h est un pointeur. Il ne faut pas oublier son allocation... Un pointeur doit toujours pointer sur une zone maitrisée sinon le programme plante.
L'allocation de distance, bien que correcte sémantiquement, ne te sera pas utile pour ton programme.
Il faudrait plutôt mettre :
Je ne comprends plus ton programme, un coup tu as besoin d'un tableau, un coup d'une matrice.
L'idée à retenir est que tu dois avoir une dimension de plus que ce dont tu as besoin. Si tu as besoin d'une matrice, il te faudra mettre : double *distance = malloc(sizeof (double**)).
Ensuite, il faudra bien sûr allouer ta matrice.
Les free, s'utiliseront de la même façon.
Ainsi, lorsque tu retournes ta matrice, il faudra mettre : return distance;
Ce qui te permettra de retourner l'adresse de ta matrice qui se trouvera dans le heap et non dans la pile.
Je ne regarde pas le reste, il y a suffisamment de point à corriger pour que t'avances ;-))).
Bon courage.
Par exemple :
int main (void) { llist ma_liste = NULL; double *matrice_distance = calculer_distance(ma_liste); /*traitement de la matrice*/ free(ma_liste), ma_liste = NULL; return 0; }
fscanf("...",&(h->identifiant), ...)
h est un pointeur. Il ne faut pas oublier son allocation... Un pointeur doit toujours pointer sur une zone maitrisée sinon le programme plante.
L'allocation de distance, bien que correcte sémantiquement, ne te sera pas utile pour ton programme.
Il faudrait plutôt mettre :
double **distance = malloc (sizeof (double*));/*ne mets pas de cast, il est implicite*/
Je ne comprends plus ton programme, un coup tu as besoin d'un tableau, un coup d'une matrice.
L'idée à retenir est que tu dois avoir une dimension de plus que ce dont tu as besoin. Si tu as besoin d'une matrice, il te faudra mettre : double *distance = malloc(sizeof (double**)).
Ensuite, il faudra bien sûr allouer ta matrice.
int i; double ***distance=malloc(LIGNE * sizeof (double*)); for (i=0; i < LIGNE; i++) (*distance)[i]=malloc(COLONNE * sizeof (double)); /*utilisation*/ (*distance)[i][j]=...;
Les free, s'utiliseront de la même façon.
Ainsi, lorsque tu retournes ta matrice, il faudra mettre : return distance;
Ce qui te permettra de retourner l'adresse de ta matrice qui se trouvera dans le heap et non dans la pile.
Je ne regarde pas le reste, il y a suffisamment de point à corriger pour que t'avances ;-))).
Bon courage.
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
Modifié par sportif_C le 15/04/2011 à 11:11
Modifié par sportif_C le 15/04/2011 à 11:11
sur la ligne
Le compilateur m'indique
incompatible types in assignment|
sur la ligne
Le compilateur m'indique l'erreur suivante:
subscripted value is neither array nor pointer|
:(((((
**distance=malloc(LIGNE * sizeof (double*));
Le compilateur m'indique
incompatible types in assignment|
sur la ligne
(*distance)[i][j]=..;
Le compilateur m'indique l'erreur suivante:
subscripted value is neither array nor pointer|
:(((((
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
15 avril 2011 à 11:41
15 avril 2011 à 11:41
J'ai oublié des étoiles. Je rectifie le post précédent.
Il faut mettre : double ***distance = malloc(sizeof (double**)).
(*distance)[i][j]=..;
Lool. J'ai mis .., car cela dépend de ce que tu veux mettre. Je te donne des exemples, à toi de compléter correctement. Pareil, j'ai mis LIGNE, c'est à toi de remplacer LIGNE par la valeur de ton choix...
Il faut mettre : double ***distance = malloc(sizeof (double**)).
(*distance)[i][j]=..;
Lool. J'ai mis .., car cela dépend de ce que tu veux mettre. Je te donne des exemples, à toi de compléter correctement. Pareil, j'ai mis LIGNE, c'est à toi de remplacer LIGNE par la valeur de ton choix...
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
Modifié par sportif_C le 15/04/2011 à 12:32
Modifié par sportif_C le 15/04/2011 à 12:32
Merci pour votre réponse.
pourquoi le compilateur ne m'indique pas une erreur en faisant ceci. Il compile et exécute sans plantage?
pourquoi le compilateur ne m'indique pas une erreur en faisant ceci. Il compile et exécute sans plantage?
double** calculer_distance (llist client_liste) { double **distance; distance = (double **) malloc (5 * sizeof (double*)); for (i=0;i<5;i++) { distance[i]=(double *) malloc (5 * sizeof(double)); return distance; } return distance; } int main() { double **matrice_distance = calculer_distance(ma_liste); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
15 avril 2011 à 12:58
15 avril 2011 à 12:58
pourquoi le compilateur ne m'indique pas une erreur en faisant ceci
Car c'est syntaxiquement correct.
Il compile et exécute sans plantage?
Un non plantage ne veut pas dire que c'est bon. Dans certains cas, ce cas ne fonctionnera pas, notamment lorsque tu appelleras une autre fonction.
Car c'est syntaxiquement correct.
Il compile et exécute sans plantage?
Un non plantage ne veut pas dire que c'est bon. Dans certains cas, ce cas ne fonctionnera pas, notamment lorsque tu appelleras une autre fonction.
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
Modifié par sportif_C le 15/04/2011 à 16:50
Modifié par sportif_C le 15/04/2011 à 16:50
Merci pour votre réponse.
Pourriez-vous me dire pourquoi il m affiche des zéros dans ma liste?
Merci.
Pourriez-vous me dire pourquoi il m affiche des zéros dans ma liste?
Merci.
int rechercher_max_distance(double distance[5][5]) { int j; double max = 0.0; int c; for (j=0;j<5;j++) { if (distance[0][j]>max) { max = distance[0][j]; c = j; } } return c; } /*initialisation liste circuulaire*/ void initialisation (Dlist_solution * liste) { liste->premier = NULL; liste->dernier = NULL; liste->taille = 0; } /*insertion premier element liste solution*/ int ins_liste_solution_vide(Dlist_solution * liste, int val) { solution *nouveau; if ((nouveau = (solution *) malloc (sizeof (solution))) == NULL) return -1; nouveau->no = 0; nouveau->suivant = nouveau; liste->premier = nouveau; liste->dernier = nouveau; liste->taille++; return 0; } /* insertion dans une liste non-vide */ int ins_liste_solution(Dlist_solution* liste, solution *courant, int val) { solution *nouveau; if ((nouveau = (solution *) malloc (sizeof (solution))) == NULL) return -1; nouveau->no = val; if (courant != liste->dernier) return -1; nouveau->suivant = courant->suivant; courant->suivant = nouveau; liste->dernier = nouveau; liste->taille++; return 0; } /* affichage de la liste */ void afficher_solution(Dlist_solution * liste) { solution *courant; courant = liste->premier; int i; for (i=0;i<liste->taille;++i) { printf ("%d\n", courant, courant->no); courant = courant->suivant; } } int main () { int max; llist ma_liste = NULL; solution *courant; Dlist_solution *liste; if ((liste = (Dlist_solution *) malloc (sizeof (Dlist_solution))) == NULL) return -1; double **matrice_distance = calculer_distance(ma_liste);max = rechercher_max_distance (matrice_distance); printf("max est %d\n", max); initialisation (liste); if (liste->taille == 0) { ins_liste_solution_vide(liste,0); } else { ins_liste_solution(liste,liste->dernier,max); } printf ("%d elements:deb=%d, fin=%d\n", liste->taille, liste->premier->no, liste->dernier->no); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
15 avril 2011 à 22:29
15 avril 2011 à 22:29
Toujours les mêmes erreurs.
Faut tenir compte des remarques...
calculer_distance(ma_liste)
ma_liste vaut NULL...
Je lis pas le reste du coup.
Faut tenir compte des remarques...
calculer_distance(ma_liste)
ma_liste vaut NULL...
Je lis pas le reste du coup.
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
16 avril 2011 à 03:30
16 avril 2011 à 03:30
Salut,
@fiddy Je trouve que c'était correct quand tu avais mis
ça alloue la première rangée du tableau comme ex:
manquait plus qu'à allouer pour le X si on veut y mettre des valeurs ou pas pour un tableau de pointeur, j'ai pas tout compris le problème en fait.
@sportif_C dans le dernier code donné il y a :
int rechercher_max_distance(double distance[5][5])
peut être remplacé par
int rechercher_max_distance(double **distance,int max_x,int max_y)
max x y pour préciser la taille du tableau
Comme fiddy l'a déjà dit
- normalement vous ne devriez pas avoir à faire un cast du retour de malloc (à moins que vous utilisez des fichier .cpp pour du c++ au lieu de .c et donc peut y avoir des warnings s'il n'est pas préciser que c'est du c nul part ce sera du c++ à la vu du compilateur je pense)
- il faut libérer la mémoire après utilisation quand on l'a alloué dynamiquement
*avis intimement personnel propre à moi même : Ce n'est pas bien de faire un doublon http://www.commentcamarche.net/forum/affich-21833758-c-liste-chainee surtout le poster après tout le mal que fiddy s'est donné pour vous aider :O
il manque la partie qui charge les valeurs ce qui doit expliquer que "ma_list" soit null ou alors vous avez oubliez le principal ?
Re-postez le code avec la fonction calculer_distance que vous utilisez maintenant car celle postée plus haut est bancale et je pense que vous l'avez modifié vu qu'elle ne fait rien d'utile à part allouer et retourner un pointeur d'un tableau où seule la première case est allouée (y a un return dans la boucle), aussi à l'intérieur de celle-ci vous précisez le 5*5 ce qui revient à faire simplement
double distance[5][5];
un exemple pour illustrer (j'avoue que j'ai du mal avec les (*plop+i) etc je préfère avec les crochets):
@fiddy Je trouve que c'était correct quand tu avais mis
**distance=malloc(LIGNE * sizeof (double*));
ça alloue la première rangée du tableau comme ex:
double distance [LIGNE][X]
manquait plus qu'à allouer pour le X si on veut y mettre des valeurs ou pas pour un tableau de pointeur, j'ai pas tout compris le problème en fait.
@sportif_C dans le dernier code donné il y a :
int rechercher_max_distance(double distance[5][5])
peut être remplacé par
int rechercher_max_distance(double **distance,int max_x,int max_y)
max x y pour préciser la taille du tableau
Comme fiddy l'a déjà dit
- normalement vous ne devriez pas avoir à faire un cast du retour de malloc (à moins que vous utilisez des fichier .cpp pour du c++ au lieu de .c et donc peut y avoir des warnings s'il n'est pas préciser que c'est du c nul part ce sera du c++ à la vu du compilateur je pense)
- il faut libérer la mémoire après utilisation quand on l'a alloué dynamiquement
*avis intimement personnel propre à moi même : Ce n'est pas bien de faire un doublon http://www.commentcamarche.net/forum/affich-21833758-c-liste-chainee surtout le poster après tout le mal que fiddy s'est donné pour vous aider :O
il manque la partie qui charge les valeurs ce qui doit expliquer que "ma_list" soit null ou alors vous avez oubliez le principal ?
Re-postez le code avec la fonction calculer_distance que vous utilisez maintenant car celle postée plus haut est bancale et je pense que vous l'avez modifié vu qu'elle ne fait rien d'utile à part allouer et retourner un pointeur d'un tableau où seule la première case est allouée (y a un return dans la boucle), aussi à l'intérieur de celle-ci vous précisez le 5*5 ce qui revient à faire simplement
double distance[5][5];
un exemple pour illustrer (j'avoue que j'ai du mal avec les (*plop+i) etc je préfère avec les crochets):
#include <stdio.h> #include <stdlib.h> void print_plop(double **plop,int x,int y) { int i,j; for(i=0;i<x;i++) for(j=0;j<y;j++) printf("plop[%d][%d] = %f\n",i,j,plop[i][j]); } int main(void) { int i,j; double **dist; /* plop pour simuler des données */ double plop[4][2]={ {2.3,4.4},{3.5,9.1}, {4.6,8.0},{9.4,3.5} }; /* faire de dist un tableau 4*2 */ dist=malloc(sizeof(double*)*4); /* dist[4][x] tableau de pointeurs */ for(i=0;i<4;i++) dist[i]=malloc(sizeof(double)*2); /* dist[4][2] les pointeurs dirigés vers nouveaux blocs */ /* une copie de plop dans dist */ for(i=0;i<4;i++) for(j=0;j<2;j++) dist[i][j]=plop[i][j]; print_plop(dist,4,2);/* affiche dist en précisant sa taille */ /* liberation de la memoire */ for(i=0;i<4;i++) free(dist[i]);/* libere les pointeurs */ free(dist); /* libere le tableau */ return 0; }
sportif_C
Messages postés
18
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
16 janvier 2012
16 avril 2011 à 10:04
16 avril 2011 à 10:04
Merci de votre réponse. J'ai tenu compte de vos remarques. Je le poste intégralement quand je le finis
Là je me bloque sur la fonction distance entre deux noeuds. Je m'explique
J'ai une liste chainée simple.
Dans la liste chainée simple qui contient 5 élements j ai les infos suivantes : abscisses et ordonée.
Je cherche à écrire une foction qui me permet de calculer la distance entre deux noeuds.
J'ai fait ceci. Est ce correcte?
Merci par avance.
Comment faire l'appel dans une autre fonction?
Là je me bloque sur la fonction distance entre deux noeuds. Je m'explique
J'ai une liste chainée simple.
Dans la liste chainée simple qui contient 5 élements j ai les infos suivantes : abscisses et ordonée.
Je cherche à écrire une foction qui me permet de calculer la distance entre deux noeuds.
J'ai fait ceci. Est ce correcte?
Merci par avance.
typedef struct noeud noeud; struct noeud { double abscisse; double ordonee; struct noeud *suivant; }; typedef noeud* llist; /*calcul cost entre deux noeuds*/ double cost_deux_noeuds(noeud *p1, noeud *p2) { p1= p1->suivant; p2=p1->suivant; return sqrt((p1->abscisse - p2->abscisse) *(p1->abscisse - p2->abscisse) +(p1->ordonee - p2->ordonee) * (p1->ordonee - p2->ordonee)); }
Comment faire l'appel dans une autre fonction?
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
16 avril 2011 à 13:54
16 avril 2011 à 13:54
Je suis une bille en maths donc ne peut pas vous aider pour les calculs. A part ça,
si j'ai bien compris lorsque vous faites
vous voulez passer à la case suivante de llist[x] qui contient les noeuds ?
exemple pour l'utiliser :
si j'ai bien compris lorsque vous faites
p1= p1->suivant; p2=p1->suivant;
vous voulez passer à la case suivante de llist[x] qui contient les noeuds ?
exemple pour l'utiliser :
#include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct{ double abscisse; double ordonee; }noeud; double cost_deux_noeuds(noeud *p1, noeud *p2) { return sqrt((p1->abscisse - p2->abscisse) * (p1->abscisse - p2->abscisse) + (p1->ordonee - p2->ordonee) * (p1->ordonee - p2->ordonee)); } int main(void) { double resultat; noeud *list; list=malloc(sizeof(noeud)*4); /* list devient un tableau de type noeud : list[4] , là pour 4 noeuds */ list[0].abscisse=1.0;/*premier noeud */ list[0].ordonee=2.0; list[1].abscisse=3.0;/*second noeud */ list[1].ordonee=4.0; resultat=cost_deux_noeuds(&list[0],&list[1]);/*on envoit deux noeuds le 0 et 1 de la list*/ printf("%f\n",resultat); free(list); /* libere la list */ return 0; }
Maintenant, je voudrais insérer les noeuds dans ma liste solution selon le principe suivant:
prendre noeud par noeud dans ma liste : llist
insérer ce noeud dans les différentes position dans ma nouvelle liste appellée Dlist_solution (c est une liste circulaire).
retenir la meilleur posotion en calculant le cout d'insertion de ce noeud dans la nouvelle liste
le cout d'insertion égale à distance entre ce noeud et le noeud précédent + la distance entre ce neoud et le noeud suivant - la distance entre noeud précedent de ce noeud et noeud suivant de ce noeud.
La formule de la distance: par exemple la distance entre noeud 1 et noeud 2 est égale à sqrt((abscisse 1 - abscisse2) ²+ (ordonee 1 - ordonee 2)
Voici un exemple pour assimiler mon algorithme d'insertion:
supposons que ma nouvelle liste contient 2 noeuds Dlist = {2, 5}
La liste llist contient 5 noeuds {0, 1, 3, 4, 0}
Donc,
1.on teste l'insertion du noeud 2 dans ma liste llist
0 2 1 3 4 0 ====>cout insertion = 2
0 1 2 3 4 0 ====>cout insertion = 1 ==>meilleur cout
0 1 3 2 4 0====>cout insertion = 3
0 1 3 4 2 0 ====>cout insertion = 4
le noeud suivant (noeud 2) est à insérer dans la position 2 dans ma nouvelle liste Dlist-solution.
La question que je me pose: je dois calculer à chaque fois le cout d'insertion qui est déterminé à partie des distances entre les deux noeuds. Les distances sont calculées à l'aide des abscisse et ordonee des noeuds .
Donc, est ce que dans ma nouvelle que je vais remplir selon cet algorithme je dois avoir un pointeur sur la liste qui contient les élements à insérer?
Merci par avance de votre aide.
prendre noeud par noeud dans ma liste : llist
typedef struct noeud noeud; struct noeud { int identifiant; double abscisse; double ordonee; struct noeud *suivant; }; typedef noeud* llist;
insérer ce noeud dans les différentes position dans ma nouvelle liste appellée Dlist_solution (c est une liste circulaire).
retenir la meilleur posotion en calculant le cout d'insertion de ce noeud dans la nouvelle liste
le cout d'insertion égale à distance entre ce noeud et le noeud précédent + la distance entre ce neoud et le noeud suivant - la distance entre noeud précedent de ce noeud et noeud suivant de ce noeud.
La formule de la distance: par exemple la distance entre noeud 1 et noeud 2 est égale à sqrt((abscisse 1 - abscisse2) ²+ (ordonee 1 - ordonee 2)
Voici un exemple pour assimiler mon algorithme d'insertion:
supposons que ma nouvelle liste contient 2 noeuds Dlist = {2, 5}
La liste llist contient 5 noeuds {0, 1, 3, 4, 0}
Donc,
1.on teste l'insertion du noeud 2 dans ma liste llist
0 2 1 3 4 0 ====>cout insertion = 2
0 1 2 3 4 0 ====>cout insertion = 1 ==>meilleur cout
0 1 3 2 4 0====>cout insertion = 3
0 1 3 4 2 0 ====>cout insertion = 4
le noeud suivant (noeud 2) est à insérer dans la position 2 dans ma nouvelle liste Dlist-solution.
La question que je me pose: je dois calculer à chaque fois le cout d'insertion qui est déterminé à partie des distances entre les deux noeuds. Les distances sont calculées à l'aide des abscisse et ordonee des noeuds .
Donc, est ce que dans ma nouvelle que je vais remplir selon cet algorithme je dois avoir un pointeur sur la liste qui contient les élements à insérer?
Merci par avance de votre aide.
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
19 avril 2011 à 18:52
19 avril 2011 à 18:52
Le problème est bien plus clair expliqué ainsi. Je ne sais pas répondre à la question. Est-ce que tout vos calculs sont corrects ? Pouvez-vous donner une liste pour Dlist et llist avec les valeurs x,y et le résultat que l'on devrait trouver (comme dans l'exemple mais avec les valeurs et non les id des noeuds)?
Un petit bout de code basé sur l'exemple plus haut et sur vos calculs&explications, le résultat est-il correct ?
le résultat :
[1,9][4,3][3,5][4,6][2,1][0,9]pos 1 : 4.472136
[1,9][3,5][4,3][4,6][2,1][0,9]pos 2 : 3.821854
[1,9][3,5][4,6][4,3][2,1][0,9]pos 3 : 0.443262
[1,9][3,5][4,6][2,1][4,3][0,9]pos 4 : 1.793318
Un petit bout de code basé sur l'exemple plus haut et sur vos calculs&explications, le résultat est-il correct ?
#include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct{ double x,y; }noeud; double dist(noeud p1, noeud p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } void print_cout(noeud n,noeud *list,int nblist) { int i,j; for(i=1;i<nblist;i++){ for(j=0;j<nblist;j++){ printf("[%.f,%.f]",list[j].x,list[j].y); if(i-1==j)printf("[%.f,%.f]",n.x,n.y); } printf("pos %d : %f\n",i, (dist(n,list[i-1])+dist(n,list[i])-dist(list[i-1],list[i])) ); } } int main(void) { noeud Dlist[2]={{4,3},{6,1}}; noeud llist[5]={{1,9},{3,5},{4,6},{2,1},{0,9}}; print_cout(Dlist[0],llist,5); return 0; }
le résultat :
[1,9][4,3][3,5][4,6][2,1][0,9]pos 1 : 4.472136
[1,9][3,5][4,3][4,6][2,1][0,9]pos 2 : 3.821854
[1,9][3,5][4,6][4,3][2,1][0,9]pos 3 : 0.443262
[1,9][3,5][4,6][2,1][4,3][0,9]pos 4 : 1.793318