Aide sur les liste chainées

Résolu
Signaler
Messages postés
36
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
26 mai 2008
-
Messages postés
36
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
26 mai 2008
-
Voilà j'ai un petit problème avec les listes chainées : j'ai ma liste ls que je rempli par des chiffres de 1 à 8 dans l'ordre croissant dans le champ x et un chiffre1 dans le champ y . Les affichages dans makelist me montrent que la liste est bien remplie. Seulement ça marche plus quand je veux afficher la liste à partir d'une fonction extérieure en l'occurence aff. Quelqu'un peut m'aider plz???

<quote>
#include <stdio.h>

struct liste_coord{
  int x;
  int y;
  struct liste_coord *suiv;
};
typedef struct liste_coord liste_coord;

liste_coord makelist (liste_coord *coups, int t[8]){
     int i;
      coups=NULL;
     for(i=0;i<8;i++){
     coups = malloc(sizeof(liste_coord));
     coups->x=i;
     coups->y=1;
      printf("- [%d %d]\n",coups->x,coups->y);
     coups=coups->suiv;
   }
     coups=NULL;
}

void aff(liste_coord *p)
{
  while(p)
    {
      printf("%d %d\n",p->x,p->y);
      p = p->suiv;
    }
}

main(){
  liste_coord *ls=NULL;
  int t[8],i;
  for(i=0;i<8;i++)
    t[i]=i;
  makelist(ls,t);
  aff(ls);
  getchar();
}
<\quote>

6 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
#include <stdio.h>

typedef struct liste_coord
{
    int x, y;
    struct liste_coord *suiv;
}liste_coord;

liste_coord *makelist (/*int *t,*/ int num)
{
    int i = 0;    liste_coord *first 0, *coups, *prev 0;
    do
    {
        coups = malloc(sizeof(liste_coord));
        if(!first) first = coups;
        coups->x=i; coups->y=1;
        printf("- [%d %d]\n",coups->x,coups->y);
        if(prev) prev->suiv = coups;
        prev = coups;
    } while(++i<num);
    coups->suiv = 0;
   
    return first;
}

void aff(liste_coord *p)
{
    while(p)
    {
        printf("%d %d\n",p->x,p->y);
        p = p->suiv;
    }
}

main()
{
    liste_coord *ls;
/*    int t[8],i;
    for(i=0;i<8;i++) t[i]=i;*/
    ls = makelist(/*t,*/ 8);
    aff(ls);
    getchar();
}

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Décidément, je dis vraiment n'importequoi ces temps-ci. Non, on ne peut pas passer first en argument, du moin pas comme ça. Faudrait faire un pointeur de pointeurs mais ça complique les choses pour rien. Déclare first dans makelist, et retourne le à la fin comme dans mon exemple. Y'a pas plus simple.

En passent, il serait préférable que tu laisse num dans makelist pour pouvoir générer des chaines de taille variable (pas seulement de 8 listes).

C++ (@++)<!--
Messages postés
36
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
26 mai 2008

Si je comprend mieux je réécrivais tout le temps dans le même noeud avant? Pour le seg fault je sais pas trop.

Encore une chose , j'appelle makelist avec ls sachant que dans makelist, cette liste sera first, pas besoin de retourner first à la fin de la fonction vu que ls et first pointent sur la même chose non? En fait je sais que c'est non vu que ça marche pas mais je ne comprends pas pourquoi.

typedef struct liste_coord liste_coord;

liste_coord *makelist (liste_coord *first){
     int i;
     liste_coord *prev=NULL,*coups;
     first=NULL;
     for(i=0;i<8;i++){
     coups = malloc(sizeof(liste_coord));
         if(!first) first = coups;
     coups->x=i;
     coups->y=1;
      printf("- [%d %d]\n",coups->x,coups->y);
      if(prev) prev->suiv = coups;
        prev = coups;
   }
     coups->suiv=NULL;
     return first;
}

void aff(liste_coord *p)
{
    while(p)
    {
        printf("%d %d\n",p->x,p->y);
        p = p->suiv;
    }
}

main()
{
    liste_coord *ls;
    makelist(ls);
    aff(ls);
    getchar();
}

Spartan
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
if(!first) first = coups;

On test pour savoir si first est nulle. Si non, on considère que first pointe déjà sur quelque chose de valide. Or, ton ls à sa déclaration n'est pas nulle donc la fonction considère que first pointe déjà sur la première liste.
Faudrait que ls soi nulle dès sa création:
liste_coord *ls = 0;

Mais je ne recommande pas ça. Il risque d'y avoir des oublies et ça fait un code pas très compréhensible. Le code que je t'est montré est parfaitement opérationnel. C'est lui que je te recommande. Optimise le à tes besoins (car y'a encore du travaille à faire dedans).

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Ou encore, on peut garder ta méthode et initialiser first à 0 directement dans la fonction. Ce pourrais être une bonne alternative.
Cependant, si tu ne veut pas que ta fonction retourne quelque chose, il faudrait qu'elle soit de type void.

C++ (@++)<!--
Messages postés
36
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
26 mai 2008

d'accord je n'ai pas encore tout compris sur les listes chainées mais l'aide que tu m'as fournie me suffit pour l'instant. Quand j'aurais le temps j'essairai d'approfondir mes connaissances sur les listes chainées.

Spartan