Liste chainee

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

  • Votes
  • Date
  • Date décroissante
  1. *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 ?
    1. non le do while est en commentaire l'erreur n'est pas ici
  2. Contributeur
    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.
    1. 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;

      }
    2. 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.
    3. Contributeur
      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.
    4. Contributeur
      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).
    5. ah merci lé gars mais meme avec l'application de vos solution l'erreur reste la meme !
  3. 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
    1. meme sans le struct j'ai le meme erreur ! :(