CREATION D'UNE LISTE CHAINée en C

Voir le sujet précédent Voir le sujet suivant Aller en bas

CREATION D'UNE LISTE CHAINée en C

Message par nadya le Jeu 22 Jan - 16:56

Bonjour tout le monde,
Je viens de commencer a programmer en C.
Il faut que je cré une liste doublement chainée et je l'affiche.
J'ai pris un code d'internet et je l'ai adapter a mes besoins.
Je ne comrend pas ce qui se passe lors de la compilation: il ya 0erreurs et 0 warning
mais lorsque j'execute a mehode "ajouter element"
le programme s'arret en m'affichant Debug error!!
runtime error!!
Que dois je faire!!
J'ai vraiment besoin d'une aide!

nadya
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 11
Localisation : tunis
Réputation : 0
Points : 3301
Date d'inscription : 07/12/2008

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par Napoléon le Jeu 22 Jan - 21:13

Tu dois mettre ton code source ici pour qu'on puisse le commenter et le corriger.

Waiting ...

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par nadya le Jeu 22 Jan - 22:05

D'accord
alors
le code .h
#include
#include
#include
typedef struct objet
{
int data[2];
struct objet *suivant;
struct objet *precedent;
} objet;
objet *CreeListeVide();
int InsertionObjet(objet *,objet );
void AfficheListe(objet * );

le code .cpp

# include "MOMBS.h"

objet *CreeListeVide() {
objet * sentinelle;
sentinelle = (objet *)malloc(sizeof(objet));
sentinelle->precedent = sentinelle;
sentinelle->suivant = sentinelle;
sentinelle->data[0] = 0;
sentinelle->data[1] = 0;

return sentinelle;
}
void AfficheListe(objet* tete)
{
objet *temp=tete->suivant;
if(tete->suivant==tete)
printf(" la liste est vide\n");
else
while(temp!=tete)
{
printf("%d\n",temp->data[0]);
printf("%d\n",temp->data[1]);
temp=temp->suivant;
}
}

int InsertionObjet(objet *tete,objet nouvo)
{
objet* temp;
objet* acree;
int comp=-1,i;
acree=(objet*)malloc(sizeof(objet));
acree=tete->suivant;

/* *acree=nouvo; */
for (i=0; i<2 ; i++)
{
acree->data[i]=nouvo.data[i];
}
acree->suivant=nouvo.suivant;
acree->precedent=nouvo.precedent;

//while(strcmp(temp->nom,acree->nom)<0 && temp!=tete)
//{
// temp=temp->suivant;
//}
//if(strcmp(temp->nom,acree->nom)==0)
// {
// printf("ce nom est deja engistre\n");
// free(acree);/* point*/
// return comp ;
// }
//else
// {
acree->suivant=temp;
acree->precedent=temp->precedent;
(acree->precedent)->suivant=acree;
temp->precedent=acree;
comp=0;

return comp;
}

void remp(objet* tete)
{
int i,n,ko;
objet inter;
printf("combien d'items vous voulez ajouter?\n");
scanf("%d",&n);
for(i=0;i {
printf(" The weight :\n");
scanf("%d",&(inter.data[0]));
printf("The priority:\n");
scanf("%f",&(inter.data[1]));
ko=InsertionObjet(tete,inter);
}
AfficheListe(tete);
}




int Menu()
{
int Choix;

printf("1)Ajouter un element\n");
printf("2)Afficher le contenu d'une liste\n");
// printf("3)Vider une liste\n");
// printf("4)Supprimer un element\n");
// printf("5)Rechercher un element\n");
// printf("6)Fusion de 2 listes\n");
// printf("7)Charger un fichier\n");
printf("8)Quitter\n");
printf("Saisir votre choix:");
scanf("%d",&Choix);
while (Choix < 1 || Choix > Cool
{
printf("Votre choix doit etre compris entre 1 et 8.\n");
printf("Saisir votre choix:");
fflush(stdin);
scanf("%d",&Choix);
}
return Choix;
}

int main()
{
int ko,choix;
objet *tete1,*tete2,nouv;

tete1=CreeListeVide();
choix=14;

while(choix!=Cool
{
if(choix==1)
remp(tete1);
else
if(choix==2)
AfficheListe(tete1);

choix=Menu();
}
return 0;
}
En faite le code je l'ai pris d'internet et je l'ai adapter à mes besoins
Si vous avez un code plus simple!! je vous serai reconnaissabe
J'en ai vraiment besoin
Smile

nadya
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 11
Localisation : tunis
Réputation : 0
Points : 3301
Date d'inscription : 07/12/2008

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par Napoléon le Ven 23 Jan - 0:50

Ton erreur est très classique en programmation C/C++.

Tu as travaillé avec un objet statique créé dans la fonction "Remp" et tu as utilisé sa référence (@dresse) dans ta liste doublement chainée, alors que toute "chose" statique créée dans une fonction, disparait dès que la fonction termine. Ce qui fait que l'adresse de la variable "objet" a disparu, alors que tu l'as utilisée dans "InsertObjet"

Je te propose la version corrigée, plus tard. Réfléchis un peu...

a+


Dernière édition par nabiL le Jeu 12 Mar - 1:27, édité 1 fois

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par nadya le Ven 23 Jan - 1:01

Merci pour ta collabortion!!
En faite je suis débutante en C ,
Et je fais des efforts.. mais bon il ya des choses qui m'echappe Embarassed
J'attends ta proposition
a+

nadya
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 11
Localisation : tunis
Réputation : 0
Points : 3301
Date d'inscription : 07/12/2008

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par Napoléon le Ven 23 Jan - 1:14

Autre remarque, la notion de liste vide se traduit par "tete = NULL" et non pas par la création d'une "tete" dont les données "data" sont égales à zéro !!! révise ce point.

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par nadya le Ven 23 Jan - 13:42

Bonjour,
J'ai essayé un autre code aujourd'hui mais en vain Sad
Je saisie la liste, mais elle ne veux pas s'afficher!!
Par contre dans d'ou je me suis référé elle s'affiche normalement!!
Comme dans l'exemple précedent!!
(la version d'origine tourne sans aucun probleme)
J'ai pas compris ce que je doit faire!!!
please j'ai vraiment besoin de votre aide
Voici le code d'origine
#include
#include
#include
using namespace std;
typedef struct liste //structure d'une liste de nombres
{ int info;
struct liste *suiv;
} list, *plist;

typedef struct liste1 //structue d'une liste de caracteres
{ char info;
struct liste1 *suiv;
} list1, *plist1;

/*creation d'une liste chainee*/
plist creation()
{ int i, x, el;
plist deb=NULL, pl;
printf("Combien d'elements voulez-vous inserer des le debut dans la liste?\\n");
scanf("%d", &x);
for(i=1;i<=x;i++)
{ printf("Entrez l'element %d a inserer dans la liste: ", i);
scanf("%d", &el);
pl=(plist)malloc(sizeof(list)); //on alloue dynamiquement la cellule pointee pl
pl->info=el; //la cellule reçoit la valeur el
pl->suiv=deb; //la cellule suivante reçoit le pointeur deb, si c'est le premier caractere
//inséré, il est égal à NULL
deb=pl; //deb reçoit pl afin d'avoir une liste chainee puisue toutes les cellules
//suivantes vont renvoyer vers deb, ce sera en gros la tête de la liste
}
return(deb);
}
/*affichage de la liste chainee*/
void affiche(plist pl)
{ int i=1;

printf("\\n");
while(pl!=NULL)
{ printf("Voici l'element %d de la liste : %d\\n", i, pl->info);
pl=pl->suiv;
i++; //sert juste à indiquer à l'utilisateur la valeur qui lui est affichee
}
}
/*inserer un element dans la liste*/
plist insere(plist pl, int x)
{ plist aux;
aux=(plist)malloc(sizeof(list)); //on alloue dynamiquement une cellule pointee par aux
aux->info=x; //elle reçoit la valeur c
if(pl==NULL) //si il n'y a pas encore d'element dans la liste
aux->suiv=NULL; //il n'y a donc pas de cellule suivante
else
aux->suiv=pl; //sinon on la chaine a la liste pointee par pl
return(aux); //on retourne le pointeur de la nouvelle cellule
}
/*supprimer un element de la liste*/
plist suppr(plist pl, int x, int *drap)
{ plist tete=pl,temp;

if (pl==NULL) //s'il n'y a pas de liste
{ printf("Il n'y a pas de liste !\\n");
return(NULL);
}

if(pl->info==x) //si le nombre cherché est le premier de la list
{ temp=pl->suiv; //le pointeur temporaire reçoit l'adresse de la deuxiéme cellule de la liste
free(pl); //on libére la cellule pointée par pl
return(temp); //on retourne donc l'adresse de la deuxiéme devenue premiere cellule de la liste
}

plist prec=pl; //création d'un pointeur qui sera une cellule avant pl
pl=pl->suiv; //on passe a la cellule suivante

while(pl!=NULL) //tant que l'on est pas en fin de liste
{ if(pl->info==x)
{ prec->suiv=pl->suiv; //la cellule suivant la cellule pointee par prec devient la 2éme cellule suivante
free(pl); //on libére la cellule pointee par pl
return(tete); //on retourne l'adresse de la nouvelle liste modifiee
}
prec=prec->suiv; //si c'est pas le cas, on passe à la cellule suivante pour prec
pl=pl->suiv; //et pour pl
}
*drap=0; //la valeur drapeau reçoit 0, sa ve dir que le nombre à supprimer n'est plus dans la liste
return(tete); //on retourne tete qui pointe vers le début de la liste alors que pl il pointe vers une des cases de la liste
}
/*supprimer tous les elements identiques d'une liste*/
plist supprall(plist pl, int x)
{ plist tete=pl;
int drap=1;
while(drap==1)
tete=suppr(tete,x,&drap);
return(tete); //tete reçoit l'adresse de la nouvelle liste
}
/*inserer dans une liste triee*/
plist insere2(plist pl, int x)
{ plist aux;
aux=(plist)malloc(sizeof(list)); //on alloue tout d'abord une case
aux->info=x; //qui recevra la valeur à insérer

if((pl==NULL) || (pl->info>x)) //s'il n'y a rien dans la liste ou si la valeur à inserer est la plus petite de toute les valeurs
{ aux->suiv=pl; //la cellule suivant aux sera donc le début de la liste
return(aux); //et on renvoi aux, qui pointe vers la premiere cellule de la liste
}

plist cour=pl->suiv, prec=pl; //si c'est pas le cas, on cree deux pointeurs l'un qui pointera vers la cellule suivant celle pointee par pl
//et l'autre pointant vers la même cellule que pl
while(cour!=NULL && cour->info

nadya
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 11
Localisation : tunis
Réputation : 0
Points : 3301
Date d'inscription : 07/12/2008

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par nadya le Ven 23 Jan - 13:43

Et moi je l'ai un peu modifié la structure de a liste c'est tout!!!
Voici mon code
#include
#include
#include
using namespace std;
typedef struct liste //structure d'une liste de nombres
{ int weight;
int priority;
struct liste *suiv;
} list, *plist;
/*creation d'une liste chainee*/
plist creation()
{ int i, n, w, p;
plist deb=NULL, pl;
printf("combien d'objet vous voulez ajouter?\\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Weight:\\n");
scanf("%d",&w);
printf("Priority:\\n");
scanf("%d",&p);
pl=(plist)malloc(sizeof(list)); //on alloue dynamiquement la cellule pointee pl
pl->weight=w; //la cellule reçoit la valeur el
pl->priority=p;
pl->suiv=deb; //la cellule suivante reçoit le pointeur deb, si c'est le premier caractere
//inséré, il est égal à NULL
deb=pl; //deb reçoit pl afin d'avoir une liste chainee puisue toutes les cellules
//suivantes vont renvoyer vers deb, ce sera en gros la tête de la liste
}
return(deb);
}
/*affichage de la liste chainee*/
void affiche(plist pl)
{
printf("\\n");
while(pl!=NULL)
{
printf("%f\\n",pl->weight);
printf("%f\\n",pl->priority);
pl=pl->suiv;
}
}
/* PROGRAMME PRINCIPAL */
int main(int argc, char *argv[])
{ char choix[10], rps[20], a;
plist pl, deb, pl2;
int x, p=0;
// plist1 pl3;
while(1)
{ printf("Que voulez-vous faire?\\n");
printf("Si vous voulez Creer une liste d'objet, tapez nombre1\\n");
// printf("Si vous voulez utiliser une liste triee de nombres, tapez nombre2\\n");
// printf("Si vous voulez utiliser des caracteres, tapez caractere\\n");
// printf("Stop si vous voulez arreter le programme\\n");
scanf("%s", &choix);
printf("\\n");
if(strcmp(choix,"nombre1")==0)
{ fflush(stdin);
// printf("On va donc creer la liste chainee !\\n");
pl=creation();
printf("\\nVoici votre liste :\\n");
affiche(pl);
}
}
printf("\\n");
system("PAUSE");
return EXIT_SUCCESS;
}
Je ne comprend pas ce qui se passe.......
C toujour a meme erreur!!!

nadya
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 11
Localisation : tunis
Réputation : 0
Points : 3301
Date d'inscription : 07/12/2008

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par Napoléon le Ven 23 Jan - 13:51

Est-ce que sais faire un débogage de ton programme ????

Si tu ne sais pas, alors, tu DOIS le savoir surtout que tu es informaticienne, et que le débogage est la seule solution qui te sauverait la vie dans des situations pareilles !!!

Essaie d'utiliser les balises "[ code ]" lorsque tu postes un code source. C'est plus lisible.
Ca te permet d'écrire un message plus clair comme :


Code:
void main()
{
      printf("STP UTILISE LA BALISE [ code ]");
}
a+

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par nadya le Ven 23 Jan - 17:56

Code:
Bien Reçu ;)

nadya
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 11
Localisation : tunis
Réputation : 0
Points : 3301
Date d'inscription : 07/12/2008

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: CREATION D'UNE LISTE CHAINée en C

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum