Liste chainee

merlyone Messages postés 26 Statut Membre -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
en faite j'essaie de faire un petit programme en C++ en utillisant les liste chainees .
mon programme consiste a creer et afficher la liste chainée mais quand je compile ça m'affiche l'erreur " la memoire ne peut pas etre written " . J'ai beau cherché mais j'arrive pas a trouver l'erreur ! je fait donc appel a vous ! voici mon code

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

typedef struct liste
{
int val;
struct liste *suivant;

}liste ;

struct liste *tete=NULL;
struct liste *queue=NULL;

int main(){
char rep[20];
int taille;
int valeur,i;

if (tete==NULL) {
tete=(liste *)malloc(sizeof(liste));
queue=tete;

printf("donner la taille \n");
scanf("%d",taille);
for(i=1;i<=taille;i++){

printf("saisir la valeur \n");
scanf("%d",&valeur);
queue->val=valeur;
queue=queue->suivant;
}

/*do{
printf("saisir la valeur");
scanf("%d",&valeur);
queue->val=valeur;
queue=queue->suivant;
printf("voulez vous continuer ? O/N \n");
scanf("%s",&rep);
}
while(rep!="n" && rep!="N");*/}
else {
queue->suivant=(liste *)malloc(sizeof(liste));
queue=queue->suivant;
printf("saisir la valeur");
scanf("%d",&valeur);
queue->val=valeur;
queue=queue->suivant;
}
queue=tete;
while(queue!=NULL){

printf("%d\n",queue->val);
queue = queue->suivant;
}
getch();
return 0;

}

3 réponses

  1. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
     
    *do{
    printf("saisir la valeur");
    scanf("%d",&valeur);
    queue->val=valeur;
    queue=queue->suivant;
    printf("voulez vous continuer ? O/N \n");
    scanf("%s",&rep);
    }
    while(rep!="n" && rep!="N");*/}

    ici tu ne fais pas de malloc pour créer ton nouveau noeud, non ?
    0
    1. merlyone Messages postés 26 Statut Membre
       
      non le do while est en commentaire l'erreur n'est pas ici
      0
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    bonjour,
    je vois où est l'erreur, tu utilises le membre "suivant" sans l'initialiser.
    Reposte nous un code propre, c'est à dire en conservant l'indentation (utilise pour ça les balises de code. à droite de souligner) en supprimant les parties commenté qui ne servent à rien et encore mieux, avec une algorithme cohérent. Ton premier if ne sert à rien car tu mets tete à 0 dès le début.
    Ensuite, je te ferai les corrections nécessaire pour que tu comprennes l'erreur.
    0
    1. merlyone Messages postés 26 Statut Membre
       
      voici en propre comme demandé !!!



      #include<stdio.h>
      #include<stdlib.h>
      #include<conio.h>




      typedef struct liste
      {
      int val;
      struct liste *suivant;

      }liste ;

      struct liste *tete=NULL;
      struct liste *queue=NULL;



      int main(){
      char rep[20];
      int taille;
      int valeur,i;

      if (tete==NULL) {
      tete=(liste *)malloc(sizeof(liste));
      queue=tete;

      printf("donner la taille \n");
      scanf("%d",taille);
      for(i=1;i<=taille;i++){

      printf("saisir la valeur \n");
      scanf("%d",&valeur);
      queue->val=valeur;
      queue=queue->suivant;
      }

      }
      else {
      queue->suivant=(liste *)malloc(sizeof(liste));
      queue=queue->suivant;
      printf("saisir la valeur");
      scanf("%d",&valeur);
      queue->val=valeur;
      queue=queue->suivant;
      }
      queue=tete;
      while(queue!=NULL){

      printf("%d\n",queue->val);
      queue = queue->suivant;
      }
      getch();
      return 0;

      }
      0
    2. Info
       
      if (tete==NULL)
      // tete est forecement egal a null au debut vu que tu l'initialises a null. Tu n'iras donc jamais dans le else


      ensuite, ta boucle devrait plutôt ressembler à ça (allocation de mémoire à chaque nouveau maillon crée, si c'est le dernier, alors on met queue->suivant à NULL)..
      for(i=1;i<=taille;i++){ 
      
          printf("saisir la valeur \n"); 
          scanf("%d",&valeur); 
          queue->val=valeur; 
          if (i != taille) 
          { 
              queue->suivant = (liste *)malloc(sizeof(liste)); 
              queue=queue->suivant; 
          } 
          else 
          { 
              queue->suivant = NULL; 
          } 
      } 
       


      Il y a d'autre fautes dans ton code, mais je n'ai pas de compilo sous la main pour tester, donc je vais plutôt te laisser chercher :) n'hésite pas à débuguer ton programme en affichant les valeurs de tes variables au fil de l'éxecution de ton programme à grand coup de printf.
      0
    3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      bof, il manque toujours l'indentation, je suis tenté de ne pas répondre. Ce n'est pourtant pas compliquer à faire ! (à moins que tu soit un programmeur maso qui aligne tout à gauche).

      if (tete==NULL) {
      tete=(liste *)malloc(sizeof(liste));
      queue=tete;
      tete->suivant=NULL; // il faut initialisé suivant à 0 sinon tu ne sais pas quelle valeur il aura (enmerdant pour les futurs tests)
      
      printf("donner la taille \n");
      scanf("%d",taille);
      for(i=1;i<=taille;i++){
      
      printf("saisir la valeur \n");
      scanf("%d",&valeur);
      queue->suivant=(liste *)malloc(sizeof(liste));// il faut bien CRÉER un nouvel élément à un moment ou un autre, donc là tu crées un nouvel élément que tu mets à la suite
      queue=queue->suivant;// tu déplace ton pointeur de queue
      queue->val=valeur;
      queue->suivant=NULL;// toujours initialisé le membre "suivant", sinon lors du while de ton printf tu risque de ne jamais satisfaire la condition de sortie et donc générer une erreur.
      }
      
      } 

      remarque général, le terme de liste n'est pas très bien choisi pour ta struct, le terme noeud conviendrai mieux.
      0
    4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      Je viens de relire, ton else était mieux fait, dommage que tu n'y passes pas... (enfin, il manque tout de même l'initialisation, et il y a un déplacement de pointeur en trop (enfin vu qu'il ne sert plus après, ce n'est pas grave).
      0
    5. merlyone Messages postés 26 Statut Membre
       
      ah merci lé gars mais meme avec l'application de vos solution l'erreur reste la meme !
      0
  3. Mickael86480 Messages postés 698 Statut Membre 41
     
    Je ne suis pas sur mais je pense que le problème peut venir de :

    typedef struct liste
    {
    int val;
    struct liste *suivant;

    }liste ;

    struct liste *tete=NULL;
    struct liste *queue=NULL;

    surtout de la ligne en gras. Tu créé une variable de type structure qui est en en faite une autre structure déjà créée, je pense que ceci pose problème
    -2
    1. merlyone Messages postés 26 Statut Membre
       
      meme sans le struct j'ai le meme erreur ! :(
      0