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 -
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;
}
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:
- Liste chainee
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Site dangereux liste - Guide
- Liste site streaming illégal - Accueil - Services en ligne
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 ?
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 ?
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
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.
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;
}
#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)..
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.
// 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).
remarque général, le terme de liste n'est pas très bien choisi pour ta struct, le terme noeud conviendrai mieux.
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
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