Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
484 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°271677
nikko
Posté le 17-12-2002 à 17:58:15  profilanswer
 

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
mood
Publicité
Posté le 17-12-2002 à 17:58:15  profilanswer
 

n°271684
youdontcar​e
Posté le 17-12-2002 à 18:07:58  profilanswer
 

(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.

n°271701
nikko
Posté le 17-12-2002 à 18:26:45  profilanswer
 

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

n°271705
youdontcar​e
Posté le 17-12-2002 à 18:32:03  profilanswer
 

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.

n°271710
nikko
Posté le 17-12-2002 à 18:35:29  profilanswer
 

erreur :
la memoire ne peut pas etre read

n°271755
nikko
Posté le 17-12-2002 à 19:36:56  profilanswer
 

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;
 }
}

n°271765
youdontcar​e
Posté le 17-12-2002 à 19:46:25  profilanswer
 

nikko a écrit :

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[résolu - C & Linux] Compilation du C sous Mandrake[Java / Swing] Boite de dialogue avec JDialog ? [Résolu]
Comment récupérer la liste des utilisateurs d'un domaine Windows ?imageloadfont() quelle type de police utiliser ?? [résolu]
concaténation objet+entier [resolu]notice avec $_GET[variable] [Résolu]
[C / Algo] - Tri d'une liste chainée par nom [ résolu... oufff ! ]Ou puis-je trouver une liste de ts les pays pr mettre dans un combo?
Plus de sujets relatifs à : [C] Liste chainée que j'arrive pas à parcourir [resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR