Liste chainee
merlyone
Messages postés
26
Statut
Membre
-
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
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;
}
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
-
*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 ? -
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.-
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;
} -
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. -
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. -
-
-
-
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