[C] Liste chainée que j'arrive pas à parcourir [resolu]

Liste chainée que j'arrive pas à parcourir [resolu] [C] - C++ - Programmation

Marsh Posté le 17-12-2002 à 17:58:15    

Bonjour,
j'ai crée une liste chainéee, j'insère 4 élements dedans, et quand je veux parcourir ma liste, je ne vois que le dernier...
pkoi ??  :??:
 
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
struct struct_pile
{
 char caractere;
 struct struct_pile *suivant;
};
 
typedef struct struct_pile *pile;
 
pile empiler(pile une_pile, char elem)
{
 pile nv_pile, avant;
 nv_pile=(pile)malloc(sizeof(struct_pile));
 if (une_pile==NULL)
 {
  nv_pile->caractere=elem;
  nv_pile->suivant=NULL;
 }
 else
 {
  avant = une_pile;
  printf ("cas de la pile\n" );
  while (avant->suivant != NULL)
  {
   printf("boucle\n" );
   avant = avant->suivant;
  }
  nv_pile->caractere=elem;
  nv_pile->suivant=NULL;
  printf("fin de boucle\n" );
  avant->suivant = nv_pile;
 }
return une_pile;
}
 
//Programme principal
main()
{
 pile ma_pile,q;
 ma_pile=(pile)malloc(sizeof(struct_pile));
 printf("Creation de la pile\n" );
 //ma_pile=NULL;
 printf("Empilage 1\n" );
 ma_pile=empiler(ma_pile,'a';);
 printf("Empilage 2\n" );
 ma_pile=empiler(ma_pile,'b';);
 printf("Empilage 3\n" );
 ma_pile=empiler(ma_pile,'1';);
 printf("Empilage 4\n" );
 ma_pile=empiler(ma_pile,'f';);
 printf("Affichage\n" );
 q=ma_pile;
 while (q!=NULL)
 {
  printf("...........\n" );
  printf("pile : %c\n",q->caractere);
  q=q->suivant;
 }
}
 
Par avance merci des vos réponses...


Message édité par nikko le 17-12-2002 à 19:35:47
Reply

Marsh Posté le 17-12-2002 à 17:58:15   

Reply

Marsh Posté le 17-12-2002 à 18:07:58    

(au moins) 2 erreurs :
 
1/
ma_pile=(pile)malloc(sizeof(struct_pile));  
printf("Creation de la pile\n" );  
ma_pile=NULL;  
 
alloc d'une pile et mise à NULL du pointeur, memory leak -> MAL
 
2/
return nv_pile;  
 
tu retournes le dernier élément alloué que tu considères ensuite dans ton code comme la liste en elle-même. tu n'afficheras donc que le dernier élément après tes empilages.

Reply

Marsh Posté le 17-12-2002 à 18:26:45    

oui, en effet !!
mais bon maintenant, j'ai une erreur dans ma boucle d'insertion
à ce niveau : avant=avant->suivant (cf edit)

Reply

Marsh Posté le 17-12-2002 à 18:32:03    

quel genre d'erreur, plantage je suppose ? un malloc n'initialise pas les données qu'il alloue. le pointeur suivant d'une nouvelle structure sera donc n'importe quoi.

Reply

Marsh Posté le 17-12-2002 à 18:35:29    

erreur :
la memoire ne peut pas etre read

Reply

Marsh Posté le 17-12-2002 à 19:36:56    

Merci, le problème est résolu !!
 
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
struct struct_pile
{
 char caractere;
 struct struct_pile *suivant;
};
 
typedef struct struct_pile *pile;
 
pile empiler(pile une_pile, char elem)
{
 pile nouveau, avant, actuel;
 nouveau = (pile) malloc(sizeof(struct_pile));
 nouveau->caractere = elem;
 if (une_pile == NULL)
 {
  printf("cas : pile null\n" );
  nouveau->suivant = NULL;
  une_pile = nouveau;
 }
 else
 {
  printf("cas : pile avec au moins 1 elem\n" );
  avant = une_pile;
  actuel = une_pile->suivant;
  while (actuel != NULL)
  {
   avant = actuel;
   actuel = actuel->suivant;
  }
  avant->suivant = nouveau;
  nouveau->suivant = actuel;
 }
 return une_pile;
}
 
//Programme principal
main()
{
 pile ma_pile,q;
 ma_pile=(pile)malloc(sizeof(struct_pile));
 printf("Creation de la pile\n" );
 ma_pile=NULL;
 printf("Empilage 1\n" );
 ma_pile=empiler(ma_pile,'a';);
 printf("Empilage 2\n" );
 ma_pile=empiler(ma_pile,'b';);
 printf("Empilage 3\n" );
 ma_pile=empiler(ma_pile,'1';);
 printf("Empilage 4\n" );
 ma_pile=empiler(ma_pile,'f';);
 printf("Affichage\n" );
 q=ma_pile;
 while (q!=NULL)
 {
  printf("...........\n" );
  printf("pile : %c\n",q->caractere);
  q=q->suivant;
 }
}

Reply

Marsh Posté le 17-12-2002 à 19:46:25    

nikko a écrit :

ma_pile=(pile)malloc(sizeof(struct_pile));
printf("Creation de la pile\n" );
ma_pile=NULL;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed