[C]Liste chainée
Répondre à la discussion
Affichage des résultats 1 à 30 sur 30

[C]Liste chainée



  1. #1
    invite8b421ec7

    Question [C]Liste chainée


    ------

    Bonjour,

    Voilà, je souhaite soustraire entre deux valeurs d'une liste chainée simple. Comment faire?
    Voici mon programme. ça compile sauf que je n'obtiens pas les bons résultats. Il m'affiche que des zéros (exemple distance[0][0]=0.0, distance[0][1]= 0.0, etc). Alors que je dois avoir des les valeurs de matrice distance comme ceci
    distance[0][0] = 0.0
    distance[0][1] = 12.12
    ...
    Des idées?

    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    typedef struct noeud noeud;
    struct noeud{
       int identifiant;
       double abscisse;
       double ordonee;
       int demande;                    //demande du client
       int temps_service;
       int borne_inf_tw;
       int borne_sup_tw;
       int capacite;
       struct noeud *suivant;
    };
    typedef struct solution solution;
    typedef noeud* llist;
    typedef solution* llist_s;
    
    llist ajouter_noeud(llist client_liste, int id, double abs,double ord,int dde,int tps_service,int b_inf_tw,int b_sup_tw,int cap)
    {
       noeud* nouveau = (noeud*) malloc(sizeof(noeud));
       nouveau->identifiant = id;
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->demande = dde;
       nouveau->temps_service = tps_service;
       nouveau->borne_inf_tw = b_inf_tw;
       nouveau->borne_sup_tw = b_sup_tw;
       nouveau->capacite = cap;
       nouveau->suivant = client_liste;
    
       return nouveau;
    }
    void trier_distance (llist client_liste)
    {
       noeud *p = client_liste;
       int i;
       int j;
       double **distance;
       FILE * fichier;
    	fichier = fopen("D:\\Codes \\TS2004t3\\test.txt", "r");
    
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .txt \n");
    		exit (-1);
    	}
    	for(i=0;i<7;i++)
    		fscanf(fichier, "%d %lf %lf %d %d %d %d %d",&(p->identifiant),&(p->abscisse),&(p->ordonee),&(p->demande),&(p->temps_service),&(p->borne_inf_tw),&(p->borne_sup_tw),&(p->capacite));
    
       distance = (double ** ) malloc (7 * sizeof (double));
    	for (i=0;i<7;i++)
    	{
    
    		distance[i]=(double *) malloc (7 * sizeof(double));
    	}
       for(i=0;i<7;i++)
    	{
    		for(j=0;j<i+1;j++)
    		{
    		   if(i == j)
    		   {
    		      distance[i][j]= 0.0;
    		   }
    		   distance[i][j]= distance[j][i] = sqrt(pow((p->abscisse - p->abscisse),2.0)+ pow((p->ordonee - p->ordonee),2.0));
    
    		}
    	}
       /*affichage sur l'écran de la matrice distance triée*/
        for (i=0;i<7;i++)
    	 {
    		for (j=0;j<7;j++)
    		{
    		   printf("\n distance[%i][%i]=%.1lf\n",i, j, distance[i][j]);
          }
    	 }
    
    void afficher_liste(llist client_liste)
    {
       noeud *p = client_liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf("%d %lf %lf %d %d %d %d %d\n",p->identifiant,p->abscisse,p->ordonee,p->demande,p->temps_service,p->borne_inf_tw,p->borne_sup_tw,p->capacite);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int dde;
       int tps_service;
       int b_inf_tw;
       int b_sup_tw;
       int cap;
       double **distance_entre_noeud;
       int i;
       FILE *fp;
    
    
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes \\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}
    
       for(i=0;i<7;i++){
          fscanf(fp,"%d %lf %lf %d %d %d %d %d\n",&id,&abs,&ord,&dde,&tps_service,&b_inf_tw,&b_sup_tw,&cap);
       ma_liste = ajouter_noeud(ma_liste,id,abs,ord,dde,tps_service,b_inf_tw,b_sup_tw,cap);
    
       }
       /*allocation dynamique du tableau distance*/
       distance_entre_noeud = (double ** ) malloc (7 * sizeof (double));
    	for (i=0;i<7;i++)
    	{
    
    		distance_entre_noeud[i]=(double *) malloc (7 * sizeof(double));
    	}
    
    
       trier_distance(ma_liste);
    
    
    
    
       fclose (fp);
       getchar();
       return EXIT_SUCCESS;
    
    }
    Les données
    0 0.00 0.00 0 0 1 40 4
    1 12.20 -12.30 +3 1 1 5 4
    2 10.11 22.10 -1 1 1 7 4
    3 22.34 12.34 -2 1 1 9 4
    4 42.33 23.24 +4 1 1 10 4
    5 15.66 17.89 -2 1 1 14 4
    6 22.13 40.30 -2 1 1 20 4

    -----

  2. #2
    invite2d7144a7

    Re : [C]Liste chainée

    Bonjour,

    Des idées, oui.

    Dont une, basique : tu suis ton programme instruction par instruction, et tu notes l'évolution des variables à chaque pas ...

    ... si tu suis bien, tu trouveras au moins quelque chose qui ne va pas.

  3. #3
    bzh_nicolas

    Re : [C]Liste chainée

    Je te l'ai déjà dit dans un autre post mais je vais me répéter :
    Soigne ton indentation ! Tu éviteras déjà quelques erreurs...
    Parce que là, je ne comprends même pas que ça compile...
    Quel compilateur utilises-tu ?

  4. #4
    invite8b421ec7

    Re : [C]Liste chainée

    Citation Envoyé par bzh_nicolas Voir le message
    Je te l'ai déjà dit dans un autre post mais je vais me répéter :
    Soigne ton indentation ! Tu éviteras déjà quelques erreurs...
    Parce que là, je ne comprends même pas que ça compile...
    Quel compilateur utilises-tu ?
    Merci pour votre réponse.
    En fait, quand je fais copier coller sur le site, ça bouge. D'ailleurs je ne sais pas pourquoi.
    Sinon, je suis sous codeblocks (compilateur: gcc).

  5. A voir en vidéo sur Futura
  6. #5
    bzh_nicolas

    Re : [C]Liste chainée

    Un peu hors sujet mais :
    Il manque quand même une accolade fermante à la fin de ta fonction trier_distance. Tu fais tes copier-coller en plusieurs fois ?

  7. #6
    invite8b421ec7

    Question Re : [C]Liste chainée

    Citation Envoyé par bzh_nicolas Voir le message
    Un peu hors sujet mais :
    Il manque quand même une accolade fermante à la fin de ta fonction trier_distance. Tu fais tes copier-coller en plusieurs fois ?
    Oui. Enfin je crois

  8. #7
    bzh_nicolas

    Re : [C]Liste chainée

    Bizarre alors, vérifie ton code source quand même (à la fin de trier_distance).
    Mais il doit être correct sinon tu ne pourrais pas compiler

  9. #8
    invite8b421ec7

    Re : [C]Liste chainée

    Citation Envoyé par bzh_nicolas Voir le message
    Bizarre alors, vérifie ton code source quand même (à la fin de trier_distance).
    Mais il doit être correct sinon tu ne pourrais pas compiler
    Chez moi c'est correcte. Tous les accolades ouvertes sont fermèes.
    J' ai dû appuyer maladroitement sur la touche suppr du clavier sans me rendre compte .

  10. #9
    bzh_nicolas

    Re : [C]Liste chainée

    OK,
    Bon ben retour au conseil de whoami alors

  11. #10
    invite8b421ec7

    Re : [C]Liste chainée

    Citation Envoyé par bzh_nicolas Voir le message
    OK,
    Bon ben retour au conseil de whoami alors
    Je vais essayer d'expliquer plus clair mon problème.
    En fait, je voudrais savoir comment accéder aux élements de mon noeud de ma liste et son suivant.
    Dans n'importe quel noeu de ma liste , j'ai un élement abscisse et un élement ordonee
    Code:
    struct noeud{
       int identifiant;
       double abscisse;
       double ordonee;
          struct noeud *suivant;
    };
    Je voudrais calculer la distance qui sépare entre deux noeuds qui consiste à faire faire ceci
    racine carrée ((abscisse noeud i - abscisse noeud j)²+(ordonee noeud i - ordonee noeud j)²)
    Sachant que j'ai 7 noeud dans ma liste.
    Code:
      noeud *p = client_liste;
     for(i=0;i<7;i++)
    	{
    		for(j=0;j<i+1;j++)
    		{
    		   if(i == j)
    		   {
    		      distance[i][j]= 0.0;
    		   }
    		   distance[i][j]= distance[j][i] = sqrt(pow((p->abscisse - p->abscisse),2.0)+ pow((p->ordonee - p->ordonee),2.0));
    
    		}
    	}
    Je ne vois pas comment faire avec le type de structure de donnée la liste chainée .
    J'espère que vous avez compris mon souci.
    Merci par avance de votre aide.

  12. #11
    polo974

    Re : [C]Liste chainée

    Tu veux calculer quoi exactement?
    toutes les distances posibles ou juste les distance entre 2 noeuds consécutifs...

    Bon, sinon, pour calculer tes distances (entre tous les points), il faut se rappeler que:
    d[a][b] = d[b][a]
    d[a][a] = 0. (d'ailleurs tu fais le test, mets à 0 mais fais quand même le calcul après...)

    donc on calcule seulement la demi matrice utile (et ensuite, on se débrouille pour n'utiliser que cette demi matrice!).

    Code:
    for ( pt_noeud1 = pt_debut_liste;  pt_noeud1->suivant non NULL; pt_noeud1= pt_noeud1->suivant )
        for ( pt_noeud2 = pt_noeud1->suivant; pt_noeud2 non NUL; pt_noeud2= pt_noeud2->suivant )
            calcul_distance(pt_noeud1, pt_noeud2)
    ça c'est pour jouer avec les listes, mais il faut ensuite ranger la distance quelque part...
    donc ajouter des index dans chaque boucle (init, incrément...).

    sinon, il y a l'autre solution: passer de la liste au tableau:
    Code:
    tab_pt_noeud = malloc( 7 * sizeof(void *)) // d'ailleurs tu as un pb de malloc ** ... (double)
    nb=0
    for ( pt_noeud1 = pt_debut_liste; pt_noeud1 non NULL; pt_noeud1= pt_noeud1->suivant
        tab_pt_noeud[nb++] = pt_noeud1 )
    et ensuite, tu oublies cette liste et ne bosses qu'avec le tableau de pointeurs de noeuds.
    (nb contient le nombre d'éléments)

    (toujours en évitant de tout calculer 2 fois...)

    Maintenant, s'il s'agit de juste calculer les distances entre les noeuds consécutifs:
    Code:
    for ( pt_noeud1 = pt_debut_liste;  pt_noeud1->suivant non NULL; pt_noeud1= pt_noeud1->suivant )
        calcul_distance(pt_noeud1, pt_noeud1->suivant)
    (bien sûr il faut gérer le rangement des résultats...)



    en passant:
    x*x est plus rapide que pow(x,2.0) (idem pour x3)
    Jusqu'ici tout va bien...

  13. #12
    invite8b421ec7

    Re : [C]Liste chainée

    Citation Envoyé par polo974 Voir le message
    Tu veux calculer quoi exactement?
    toutes les distances posibles ou juste les distance entre 2 noeuds consécutifs...

    Bon, sinon, pour calculer tes distances (entre tous les points), il faut se rappeler que:
    d[a][b] = d[b][a]
    d[a][a] = 0. (d'ailleurs tu fais le test, mets à 0 mais fais quand même le calcul après...)

    donc on calcule seulement la demi matrice utile (et ensuite, on se débrouille pour n'utiliser que cette demi matrice!).
    Merci pour votre aide.
    Au fait, je voudrais calculer toutes les distances.

  14. #13
    invite8b421ec7

    Question Re : [C]Liste chainée

    Citation Envoyé par polo974 Voir le message
    Code:
    for ( pt_noeud1 = pt_debut_liste;  pt_noeud1->suivant non NULL; pt_noeud1= pt_noeud1->suivant )
        for ( pt_noeud2 = pt_noeud1->suivant; pt_noeud2 non NUL; pt_noeud2= pt_noeud2->suivant )
            calcul_distance(pt_noeud1, pt_noeud2)
    ça c'est pour jouer avec les listes, mais il faut ensuite ranger la distance quelque part...
    donc ajouter des index dans chaque boucle (init, incrément...).
    Je ne suis pas sure d'avoir tout compris . Ce code considère deux noeuds? Je ne parviens pas à appliquer pour le cas d'une liste de noeuds
    J'ai essayé de faire ceci mais je n'obtiens pas le résultat attendu.
    Merci de vos lumières.
    Code:
    typedef struct noeud noeud;
    struct noeud{
       double abscisse;
       double ordonee;
       struct noeud *suivant;
    };
    typedef noeud* llist;
    llist ajouter_noeud(llist client_liste, int id, double abs,double ord,int dde,int tps_service,int b_inf_tw,int b_sup_tw,int cap)
    {
       noeud* nouveau = (noeud*) malloc(sizeof(noeud));
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->suivant = client_liste;
    
       return nouveau;
    }
    void afficher_distance(llist client_liste, struct noeud h[], int n)
    noeud *p = client_liste;
    
       int i;
       int j;
       double distance[7][7];
       FILE * fichier;
    	fichier = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .txt \n");
    		exit (-1);
    	}
    	for(i=0;i<2;i++){
    	   for(j=0;j<i+1;j++){
    		fscanf(fichier, "%lf %lf ",&(p->abscisse),&(p->ordonee));
          printf("%.1lf %.1lf %.1lf %.1lf\n", (p->abscisse),(p->ordonee), (p->abscisse),(p->ordonee));
    
          if(i == j)
    		   {
    		      distance[i][j]= 0.0;
    		   }
    
    		   distance[i][j]= sqrt((((h[i].abscisse) - (h[j].abscisse))* ((h[i].abscisse) - (h[j].abscisse)))+ (((h[i].ordonee) - (h[j].ordonee))* ((h[i].ordonee) - (h[j].ordonee))));}}
    
    
    
       /*affichage sur l'écran distance[0][2]*/
    for(i=0;i<2;i++){
    	   for(j=0;j<i+1;j++){
    		   printf("\n %.1lf\n", distance[0][2]);}}
    
    
    
    
       fclose (fichier);
    }

  15. #14
    invite8b421ec7

    Question Re : [C]Liste chainée

    Je n'ai pas compris ceci
    Citation Envoyé par polo974 Voir le message
    Code:
    pt_noeud1 = pt_debut_liste;

    Merci d'avance de vos lumières

  16. #15
    invite8b421ec7

    Question Re : [C]Liste chainée

    J'ai essayé de faire ceci mais le programme se plante
    Code:
       i=0;
       j=0;
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
             {
                for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
                {
                   if(i == j)
                   {
                      distance[i][j]= 0.0;
                   }
                   {
                      distance[i][j]=distance[i][j]= distance[j][i] = sqrt(pow((p1->abscisse - p2->abscisse),2.0)+ pow((p1->ordonee - p2->ordonee),2.0));
    
                   }
                   j++;
                }
                i++;
    
             }
    Debuggeur signale erreur dans la ligne
    Code:
    distance[i][j]=distance[i][j]= distance[j][i] = sqrt(pow((p1->abscisse - p2->abscisse),2.0)+ pow((p1->ordonee - p2->ordonee),2.0));
    Avec cette formule de la distance, il m'affiche des valeurs bizarres
    Code:
    distance[i][j]=sqrt((p1->abscisse - p2->abscisse * p1->abscisse - p2->abscisse)+ (p1->ordonee - p2->ordonee * p1->ordonee - p2->ordonee));
    Merci par avance de vos lumières.

  17. #16
    bzh_nicolas

    Re : [C]Liste chainée

    Code:
       i=0;
       j=0;
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
             {
                for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
                {
                   if(i == j)
                   {
                      distance[i][j]= 0.0;
                   }
                    //rajoute else sinon ça sert à rien
                   {
                      distance[i][j]=distance[i][j]= distance[j][i] = sqrt(pow((p1->abscisse - p2->abscisse),2.0)+ pow((p1->ordonee - p2->ordonee),2.0));
                      // pourquoi affectes-tu 2 fois distance[i][j] ?
                   }
                   j++;
                }
                i++;
    
             }
    Citation Envoyé par celine2 Voir le message
    Debuggeur signale erreur dans la ligne
    Code:
    distance[i][j]=distance[i][j]= distance[j][i] = sqrt(pow((p1->abscisse - p2->abscisse),2.0)+ pow((p1->ordonee - p2->ordonee),2.0));
    Quelle erreur exactement ?

    Citation Envoyé par celine2 Voir le message
    Avec cette formule de la distance, il m'affiche des valeurs bizarres
    Code:
    distance[i][j]=sqrt((p1->abscisse - p2->abscisse * p1->abscisse - p2->abscisse)+ (p1->ordonee - p2->ordonee * p1->ordonee - p2->ordonee));
    Priorité des opérateurs, il faut mettre des parenthèses...

  18. #17
    invite8b421ec7

    Question Re : [C]Liste chainée

    Citation Envoyé par bzh_nicolas Voir le message
    Code:
       i=0;
       j=0;
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
             {
                for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
                {
                   if(i == j)
                   {
                      distance[i][j]= 0.0;
                   }
                    //rajoute else sinon ça sert à rien
                   {
                      distance[i][j]=distance[i][j]= distance[j][i] = sqrt(pow((p1->abscisse - p2->abscisse),2.0)+ pow((p1->ordonee - p2->ordonee),2.0));
                      // pourquoi affectes-tu 2 fois distance[i][j] ?
                   }
                   j++;
                }
                i++;
    
             }
    Quelle erreur exactement ?


    Priorité des opérateurs, il faut mettre des parenthèses...
    comment?
    Merci par avance.

  19. #18
    polo974

    Re : [C]Liste chainée

    Citation Envoyé par celine2
    Je n'ai pas compris ceci
    Apparemment, si...
    donc on passe à la suite.
    Citation Envoyé par celine2 Voir le message
    comment?
    Merci par avance.
    Comment quoi?...

    pour la priorité des opérateurs, depuis le collège, on dit que la multiplication est prioritaire sur les additions soustractions, donc si on veut (et ici on veut!) le produit de 2 soustractions on met de parenthèse:
    (a-b) * (c-d)

    de plus comme tu fais:
    (a-b) * (a-b)

    autant passer par une variable intermédiaire
    double c=a-b;
    puis
    c*c
    soit le compilo est malin et le fait de toute façon en cachette, soit il est bête, et il fait 2 fois le calcul.
    et ce sera plus lisible.

    pour les parenthèses (où, quand, comment, ...), il faut faire une petite recherche "C precedence" et "C associativity"
    (c'est avec les tableaux de pointeurs de fonctions qu'on commence à rigoler...)

    de toute façon pour la précédence, quand on doute, on jette une paire de parenthèse !
    Jusqu'ici tout va bien...

  20. #19
    invite8b421ec7

    Question Re : [C]Liste chainée

    Citation Envoyé par polo974 Voir le message
    Apparemment, si...
    donc on passe à la suite.

    Comment quoi?...

    pour la priorité des opérateurs, depuis le collège, on dit que la multiplication est prioritaire sur les additions soustractions, donc si on veut (et ici on veut!) le produit de 2 soustractions on met de parenthèse:
    (a-b) * (c-d)

    de plus comme tu fais:
    (a-b) * (a-b)

    autant passer par une variable intermédiaire
    double c=a-b;
    puis
    c*c
    soit le compilo est malin et le fait de toute façon en cachette, soit il est bête, et il fait 2 fois le calcul.
    et ce sera plus lisible.

    pour les parenthèses (où, quand, comment, ...), il faut faire une petite recherche "C precedence" et "C associativity"
    (c'est avec les tableaux de pointeurs de fonctions qu'on commence à rigoler...)

    de toute façon pour la précédence, quand on doute, on jette une paire de parenthèse !
    Merci pour votre réponse.
    J'ai fais ceci mais le programme plante
    Code:
      void afficher_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 c = p1->abscisse - p2->abscisse;
       double d = p1->ordonee -  p2->ordonee;
       double **distance;
       FILE * fichier;
    	fichier = fopen("D:\\Codes \\TS2004t3\\test.txt", "r");
    
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .txt \n");
    		exit (-1);
    	}
    	for(i=0;i<7;i++)
    		fscanf(fichier, “%lf %lf ",&(h->abscisse),&(h->ordonee));
    
       distance = (double ** ) malloc (7 * sizeof (double));
    	for (i=0;i<7;i++)
    	{
    
    		distance[i]=(double *) malloc (7 * sizeof(double));
    	}
       i=0;
       j=0;
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
       {
          for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
          {
             if(i == j)
             {
                      distance[i][j]= 0.0;
             }
             else
             {
                      distance[i][j]= distance[j][i]= sqrt(c *  c +  d * d);
    
             }
             j++;
          }
          i++;
    
       }

  21. #20
    polo974

    Re : [C]Liste chainée

    Le problème, c'est que tu te focalises sur le langage et que tu oublies ce qu'il y a derrière:
    • algorithme
    • structure des données

    Le truc simple, au début, tu truffes de printf, et tu ne fais pas d'affectation dans ton tableau (ce qui évite les plantages).
    Le pb vient de j...
    mauvaise valeur d'init
    mauvais endroit d'init

    et l'algo que je t'ai proposé ne balaye que les calculs utiles donc les cas i==j ne doivent pas arriver.
    au début de la première boucle, tu peux faire:
    distance[i][i]= 0.0;
    donc il est clair qu'au même moment, il serait utile d'initialiser j à quelque chose de différent de i...
    Jusqu'ici tout va bien...

  22. #21
    invite8b421ec7

    Re : [C]Liste chainée

    polo974

    Le problème, c'est que tu te focalises sur le langage et que tu oublies ce qu'il y a derrière:

    algorithme
    structure des données

    Le truc simple, au début, tu truffes de printf, et tu ne fais pas d'affectation dans ton tableau (ce qui évite les plantages).
    Le pb vient de j...
    mauvaise valeur d'init
    mauvais endroit d'init

    et l'algo que je t'ai proposé ne balaye que les calculs utiles donc les cas i==j ne doivent pas arriver.
    au début de la première boucle, tu peux faire:
    distance[i][i]= 0.0;
    donc il est clair qu'au même moment, il serait utile d'initialiser j à quelque chose de différent de i...
    Je ne suis pas sure de tout compris. Je ne sias pas comment initialiser j .

    J'ai fais ceci. Mais il m'affiche des valeurs bizarres pour i =! j.
    Voici en pièce jointe une capture d'écran.


    Help please.
    Pensez-vou qu' utiliser la structure est mieux pour ce type de problème (en terme de rapidité).
    Merci pour vos éclaircissements.
    Cordialement

    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    typedef struct noeud noeud;
    struct noeud{
       double abscisse;
       double ordonee;
       struct noeud *suivant;
    };
    typedef noeud* llist;
    llist ajouter_noeud(llist client_liste, double abs,double ord)
    {
       noeud* nouveau = (noeud*) malloc(sizeof(noeud));
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->suivant = client_liste;
       return nouveau;
    }
    void afficher_distance (llist client_liste)
    {
    
       noeud *h = client_liste;
       noeud *p1 = client_liste;
       noeud *p2 = client_liste;
       noeud *debut_liste = client_liste;
       int i;
       double vecteur[49];
       double temp; /*pour permutation*/
       int k;
       int j;
       double c = p1->abscisse - p2->abscisse;
       double d = p1->ordonee -  p2->ordonee;
       double **distance;
       FILE * fichier;
    	fichier = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .txt \n");
    		exit (-1);
    	}
    	for(i=0;i<7;i++)
    		fscanf(fichier, " %lf %lf ",&(h->abscisse),&(h->ordonee));
    
       distance = (double ** ) malloc (7 * sizeof (double));
    	for (i=0;i<7;i++)
    	{
    
    		distance[i]=(double *) malloc (7 * sizeof(double));
    	}
       i=0;
       j=0;
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
    
       {
          for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
          {
             if(i==j)
             {
                      distance[i][j]= 0.0;
             }
             else
             {
                distance[i][j]= distance[i][j]= sqrt(c *  c +  d * d);
    
             }
             i++;
          }
          j++;
    
       }
       /*affichage sur l'écran de la matrice distance */
        for (i=0;i<7;i++)
    	 {
    		for (j=0;j<7;j++)
    		{
    		   printf("\n distance[%i][%i]=%.1lf\n",i, j, distance[i][j]);
          }
    	 }
        for(i=0;i<7;i++)free(distance[i]);
        free(distance);
          fclose (fichier);
    }
    
    
    void afficher_liste(llist client_liste)
    {
       noeud *p = client_liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf(" %lf %lf \n",p->abscisse,p->ordonee);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int i;
       FILE *fp;
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes \\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}
    Images attachées Images attachées  

  23. #22
    bzh_nicolas

    Re : [C]Liste chainée

    Pose toi et réfléchis à ton algo parce que là ça part dans tous les sens...
    On te donne une astuce, tu la rajoutes dans ton code sans vraiment réfléchir à comment elle fonctionne. Donc comme plusieurs personnes te l'ont déjà dit : crayon papier et si tu n'y arrives pas comme ça, printf dans tous les coins pour voir comment évoluent tes variables.

    Citation Envoyé par celine2 Voir le message
    Help please.
    Pensez-vou qu' utiliser la structure est mieux pour ce type de problème (en terme de rapidité).
    Merci pour vos éclaircissements.
    Cordialement
    Changer encore tout ton algo ne va surement pas aider, en plus en terme de rapidité, tu risques plus d'en perdre que d'en gagner (et de toute façon la différence sera minime...)

    Code:
    void afficher_distance (llist client_liste)
    {
    
       noeud *h = client_liste;
       noeud *p1 = client_liste;
       noeud *p2 = client_liste;
       noeud *debut_liste = client_liste;
       int i;
       double vecteur[49];
       double temp; /*pour permutation*/
       int k;
       int j;
       double c = p1->abscisse - p2->abscisse;
       double d = p1->ordonee -  p2->ordonee;
       // C'est bien d'initialiser tes variables mais :
       // Quels sont les valeurs de p1 et p2 à cet endroit
       // Est-ce que c'est utile ?
       double **distance;
       FILE * fichier;
    	fichier = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .txt \n");
    		exit (-1);
    	}
    	for(i=0;i<7;i++)
    		fscanf(fichier, " %lf %lf ",&(h->abscisse),&(h->ordonee));
    
       distance = (double ** ) malloc (7 * sizeof (double));
    	for (i=0;i<7;i++)
    	{
    
    		distance[i]=(double *) malloc (7 * sizeof(double));
    	}
       i=0;
       j=0;
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
    
       {
          for(p2=p1->suivant;p2->suivant!=NULL;p2=p2->suivant)
          {
             if(i==j)
             {
                      distance[i][j]= 0.0;
             }
             else
             {
                distance[i][j]= distance[i][j]= sqrt(c *  c +  d * d);
                // tu as relus sérieusement ton affectation ???
                // et que valent c et d ici ???
    
             }
             i++;
          }
          j++;
    
       }
       /*affichage sur l'écran de la matrice distance */
        for (i=0;i<7;i++)
    	 {
    		for (j=0;j<7;j++)
    		{
    		   printf("\n distance[%i][%i]=%.1lf\n",i, j, distance[i][j]);
          }
    	 }
        for(i=0;i<7;i++)free(distance[i]);
        free(distance);
          fclose (fichier);
    }
    
    
    void afficher_liste(llist client_liste)
    {
       noeud *p = client_liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf(" %lf %lf \n",p->abscisse,p->ordonee);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int i;
       FILE *fp;
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes \\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}

  24. #23
    invite8b421ec7

    Re : [C]Liste chainée

    J'ai des difficultés avec la liste chainée.
    En utilisant la structure, ça marche nikel
    Code:
    /*calcul distance*/
     	for(i=0;i<k;i++)
    	{
    		for(j=0;j<i+1;j++)
    		{
    			if(i==j)
    			{
                    distance_entre_ville[i][j]= 0.0;
    			}
    
    			distance_entre_ville[i][j]= distance_entre_ville[j][i] =  sqrt(pow((Ville[i].abscisse - Ville[j].abscisse),2.0)+pow((Ville[i].ordonnee - Ville[j].ordonnee),2.0));
    
    		}
    	}

  25. #24
    invite8b421ec7

    Question Re : [C]Liste chainée

    Bonjour,

    J'ai ressayé de re-coder. là, ça marche mais pas correctement car j'ai des valeurs bizarres pour distance[0][6], distance[1][6], distance[2][6], distance[3][6], distance[4][6], distance[5][6], distance[0][6]. De meme pour distance[6][0], distance[6][1], distance[6][2], distance[6][3], distance[6][4], distance[6][5], distance[6][5].
    Ci-joint une capture d'écran.
    Mon code:
    Code:
    j=0;
    
       for(p1=debut_liste;p1->suivant!=NULL;p1=p1->suivant)
    
       {
          distance[j][j]= 0.0;
          i=j+1;
    
          for(p2=p1->suivant;p2->suivant!=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++;
       }
    Merci par avance de vos lumières.
    Images attachées Images attachées  

  26. #25
    polo974

    Re : [C]Liste chainée

    Eh bien, on fini par y arriver...

    Sauf que:
    • quand tu remplis ta liste, tu mets le point 0 en premier et ensuite, tu insères (devant) les autres. donc ta liste est inversée (pas grave, il suffit de s'en rappeler dans la gestion des index...)
    • ta boucle intérieure ne correspond pas à ce que je t'avais donné (condition d'arrêt) on va encore dire que c'est la faute du copié/collé...

    A ta structure noeud, tu peux ajouter un index
    tu ajoutes i dans les paramètres à la fonction ajouter_noeud () que tu ranges dans l'index du nouveau noeud.
    et ensuite tu imprimes dès que tu te sers de ce noeud...


    Mais n'oublies jamais de penser (sur papier, dessin, schéma, ...) précisément à ce que tu veux, et de vérifier que ton programme le fait bien (donc pour ça, le truffer de traces)...
    Jusqu'ici tout va bien...

  27. #26
    bzh_nicolas

    Re : [C]Liste chainée

    Citation Envoyé par celine2 Voir le message
    J'ai ressayé de re-coder. là, ça marche mais pas correctement car j'ai des valeurs bizarres pour distance[0][6], distance[1][6], distance[2][6], distance[3][6], distance[4][6], distance[5][6], distance[0][6]. De meme pour distance[6][0], distance[6][1], distance[6][2], distance[6][3], distance[6][4], distance[6][5], distance[6][5]
    Ma main à couper que le problème vient de la valeur que tu as dans ton tableau ou ta liste au 6ème élément...

  28. #27
    polo974

    Re : [C]Liste chainée

    Citation Envoyé par bzh_nicolas Voir le message
    Ma main à couper que le problème vient de la valeur que tu as dans ton tableau ou ta liste au 6ème élément...
    Je sais que tu n'es pas manchot , mais c'est un peu en amont qu'il faut chercher, vu que ce sont les résultats (ou leur absence en l'occurrence)...
    Jusqu'ici tout va bien...

  29. #28
    invite8b421ec7

    Question Re : [C]Liste chainée

    Re-bonjour,

    Voilà, je dois s'arreter quand p2!=NULL.
    Là ça fonctionne sauf que la valeur de la dernière case de la matrice distance[6][6] est bizarre
    Code:
    distance = (double ** ) malloc (7 * sizeof (double*));
    	for (i=0;i<7;i++)
    	{
    
    		distance[i]=(double *) malloc (7 * sizeof(double));
    	}
    
    
       j=0;
    
       for(p1=debut_liste;p1->suivant!=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++;
       }

  30. #29
    polo974

    Re : [C]Liste chainée

    Citation Envoyé par celine2 Voir le message
    Re-bonjour,

    Voilà, je dois s'arreter quand p2!=NULL.
    Là ça fonctionne sauf que la valeur de la dernière case de la matrice distance[6][6] est bizarre
    Ben oui, si on regarde ce qu'il se passe:
    (c calcul, d duplication, 0 mise à 0)
    Code:
    0cccccc
    d0ccccc
    dd0cccc
    ddd0ccc
    dddd0cc
    ddddd0c
    dddddd
    Et, oh surprise, on n'a pas fait distance[6][6]=0 ...

    Donc...

    ( Mais ça tu aurais dû le voir en réfléchissant un peu ou en traçant... (coup de pied au cul pédagogique ))
    Jusqu'ici tout va bien...

  31. #30
    invite8b421ec7

    Re : [C]Liste chainée

    Enfin, je suis arrivée. Que je suis bête Merci par avance de votre aide précieuse.
    Code:
    j=0;
    
       for(p1=debut_liste;p1!=NULL;p1=p1->suivant)//la modification
    
       {
          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++;
       }

Discussions similaires

  1. [langage C]Liste chainée simple
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 15
    Dernier message: 02/04/2011, 21h13
  2. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 01/01/2011, 19h18
  3. liste chainée en C
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 01/01/2011, 11h31
  4. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 11/12/2010, 15h35
  5. Liste chaînée en C - Changer un élément.
    Par invite61ab3646 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 04/11/2010, 10h40