Aide sur les liste chainées

Résolu
cs_thespartan Messages postés 36 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 26 mai 2008 - 3 févr. 2007 à 19:44
cs_thespartan Messages postés 36 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 26 mai 2008 - 6 févr. 2007 à 00:07
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
3 févr. 2007 à 20:38
#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++ (@++)<!--
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 févr. 2007 à 20:54
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++ (@++)<!--
3
cs_thespartan Messages postés 36 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 26 mai 2008
5 févr. 2007 à 00:59
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 févr. 2007 à 03:03
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++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 févr. 2007 à 15:03
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++ (@++)<!--
0
cs_thespartan Messages postés 36 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 26 mai 2008
6 févr. 2007 à 00:07
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
0
Rejoignez-nous