Liste chainee

merlyone Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 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;

}
A voir également:

3 réponses

Pacorabanix Messages postés 3248 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
merlyone Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
non le do while est en commentaire l'erreur n'est pas ici
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
merlyone Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
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
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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
merlyone Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
ah merci lé gars mais meme avec l'application de vos solution l'erreur reste la meme !
0
Mickael86480 Messages postés 660 Date d'inscription   Statut Membre Dernière intervention  
 
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
merlyone Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
meme sans le struct j'ai le meme erreur ! :(
0