Aide MAJ Liste chainée Langage C
Sephirius
-
Sephirius -
Sephirius -
Bonjour, j'ai un examen de programmation C demain, et je n'arrive pas à corriger un exercice avc des listes chainées.
C'est très simple normalement mais j'ai constamment une erreur sur la mise à jour du pointeur du chainon précédent.
dans la fonction "ajoutliste" dans le second else, c'est la que ce situe mon problème.
J'ai l'impression d'avoir fait ce qu'il faut mais cela échoue...
A titre d'information je travaille sous borland 5.0
Merci de m'aider (sans me renvoyer vers un site pr apprendre le C... )
C'est très simple normalement mais j'ai constamment une erreur sur la mise à jour du pointeur du chainon précédent.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define NB 3 //********** structure typedef struct tabgroupes{ char tLibGrp[50]; int tAgeMin; int tAgeMax; int tNbrInsc; struct liste *tPTRDebInsc; }tabgroupes; typedef struct liste{ char nomE[20]; char prenomE[20]; struct liste *pEnfSuiv; }liste; typedef struct fiche{ char nomF[20]; char prenomF[20]; int ageF; }fiche; //********** prototype void initabgroupes(tabgroupes []); fiche obtention(void); int rechtabgroupes(tabgroupes [], int); void ajoutliste(tabgroupes [],int,fiche); void imprimer(tabgroupes tab[]); //********** fonction principale void main(void) { tabgroupes tabgr[NB]; fiche fiche; int indice; initabgroupes(tabgr); fiche = obtention(); while(strcmp(fiche.nomF,"zzz")) { indice = rechtabgroupes(tabgr,fiche.ageF); ajoutliste(tabgr,indice,fiche); fiche = obtention(); } imprimer(tabgr); getch(); } //********** Fonctions associées void initabgroupes(tabgroupes Tab[]) { int i; char tlib[50]; for(i=0;i<NB;i++) { printf("Entrez le libelle du groupe %d : ",i+1); scanf("%s",tlib); strcpy(Tab[i].tLibGrp,tlib); printf("Entrez l'age minimum de ce groupe: "); scanf("%d",&Tab[i].tAgeMin); printf("Entre l'age maximum de ce groupe: "); scanf("%d",&Tab[i].tAgeMax); Tab[i].tNbrInsc = 0; Tab[i].tPTRDebInsc = NULL; } clrscr(); } fiche obtention() { fiche fiche; printf("Entrez le nom de l'enfant: "); scanf("%s",fiche.nomF); printf("Entrez le prenom de l'enfant: "); scanf("%s",fiche.prenomF); printf("Entre l'age de l'enfant: "); scanf("%d",&fiche.ageF); clrscr(); return fiche; } int rechtabgroupes(tabgroupes tab[], int ageF) { int i=0; while(ageF>tab[i].tAgeMax) { i++; } return i; } void ajoutliste(tabgroupes tab[], int ind,fiche fiche) { liste *ptr, *saveptr, *ptrnew; ptr = tab[ind].tPTRDebInsc; while(ptr != NULL && fiche.nomF>ptr->nomE) { saveptr = ptr; ptr=ptr->pEnfSuiv; } ptrnew = (liste *) malloc (sizeof(liste)); if(ptrnew == NULL) { printf("Memoire full"); } else { strcpy(ptrnew->nomE,fiche.nomF); strcpy(ptrnew->prenomE,fiche.prenomF); ptrnew->pEnfSuiv = ptr; tab[ind].tNbrInsc ++; if(ptr==NULL) { tab[ind].tPTRDebInsc = ptrnew; } else { saveptr->pEnfSuiv = ptrnew; } } } void imprimer(tabgroupes tab[]) { liste *ptr; int i; for(i=0;i<NB;i++) { ptr=tab[i].tPTRDebInsc; printf("Tableau %d\n",i+1); while(ptr != NULL) { printf("%s\t%s\n",ptr->nomE,ptr->prenomE); ptr=ptr->pEnfSuiv; } } }
dans la fonction "ajoutliste" dans le second else, c'est la que ce situe mon problème.
J'ai l'impression d'avoir fait ce qu'il faut mais cela échoue...
A titre d'information je travaille sous borland 5.0
Merci de m'aider (sans me renvoyer vers un site pr apprendre le C... )
A voir également:
- Aide MAJ Liste chainée Langage C
- Liste déroulante excel - Guide
- Langage ascii - Guide
- È maj - Guide
- Maj chrome - Accueil - Applications & Logiciels
- Maj windows 10 - Accueil - Mise à jour
4 réponses
http://www.apprendreleC.com
Je plaisante !
Je ne sais pas si ça joue mais je ne vois pas le malloc sur saveptr.
De plus tu ne fais jamais de free()
free(ptr);
ptr=NULL;
Je plaisante !
Je ne sais pas si ça joue mais je ne vois pas le malloc sur saveptr.
De plus tu ne fais jamais de free()
free(ptr);
ptr=NULL;
Merci d'avoir répondu si vite.
Alors, en faite, saveptr est un pointeur de type liste (structure définie en entête).
Je ne dois pas le déclarer via malloc, vu que je ne joue pas sur la structure mais seulement sur son adresse.
pour ce qui est de libérer ptr, je ne vois pas vraiment à quoi cela sert, vu que je ne l'utilise plus dans la fonction, et à la seconde exécution de la fonction (comme au suivante, il est modifié pour reprendre le pointeur de la liste correspondante via la structure tabgroupes.
Je concois qu'il est très difficile de corriger un code que l'on a pas sois mm concu mais bon j'espère comprendre, je suis sur d'avoir ca à l'exam... (triste)
Alors, en faite, saveptr est un pointeur de type liste (structure définie en entête).
Je ne dois pas le déclarer via malloc, vu que je ne joue pas sur la structure mais seulement sur son adresse.
pour ce qui est de libérer ptr, je ne vois pas vraiment à quoi cela sert, vu que je ne l'utilise plus dans la fonction, et à la seconde exécution de la fonction (comme au suivante, il est modifié pour reprendre le pointeur de la liste correspondante via la structure tabgroupes.
Je concois qu'il est très difficile de corriger un code que l'on a pas sois mm concu mais bon j'espère comprendre, je suis sur d'avoir ca à l'exam... (triste)
free sert à libérer la mémoire, justement si tu es sur de ne plus l'utiliser libère la mémoire.
Je peux t'assurer que sur des grosses exécution, sans free() ton programme plante !
Là je suis en stage et donc je ne peux pas tester ton programme, ensuite je suis pas là de la soirée !
Désolé !
Mais ton code m'a l'air bon !!
J'espère que d'autres seront là!
Bon courage !
Je peux t'assurer que sur des grosses exécution, sans free() ton programme plante !
Là je suis en stage et donc je ne peux pas tester ton programme, ensuite je suis pas là de la soirée !
Désolé !
Mais ton code m'a l'air bon !!
J'espère que d'autres seront là!
Bon courage !
Merci à toi, dommage que tu ne puisses m'aider plus.
Pour le free() je connaissais la fonction mais je l'utilise uniquement pr les fichiers...
Mon niveau de programmation C se limite à suivre le cours de 1ère année lol.
Je continuer à chercher jusqu'à ce que je trouve alors...
Pour le free() je connaissais la fonction mais je l'utilise uniquement pr les fichiers...
Mon niveau de programmation C se limite à suivre le cours de 1ère année lol.
Je continuer à chercher jusqu'à ce que je trouve alors...
Moi pour déboguer (je pars dans 1m,) j'utilise des printf massivement. Avant chaque ligne de code
par exemple
printf("Avant le if");
if(toto)
{
printf("après le if");
}
printf("la variable toto vaut %d...
Autant que tu peux, ça te permet de savoir où tu es et surtout où ça plante !
Et pour le C évite d'être sous Windows ! J'ai remarqué que la plupart de mes codes marchent mieux sous Unix que Win.
Par contre pour le C++ c'est l'inverse ^^
Enfin je parle en terme d'expérience de galérage ^^
Bon courage !
redonne des news quand même !
par exemple
printf("Avant le if");
if(toto)
{
printf("après le if");
}
printf("la variable toto vaut %d...
Autant que tu peux, ça te permet de savoir où tu es et surtout où ça plante !
Et pour le C évite d'être sous Windows ! J'ai remarqué que la plupart de mes codes marchent mieux sous Unix que Win.
Par contre pour le C++ c'est l'inverse ^^
Enfin je parle en terme d'expérience de galérage ^^
Bon courage !
redonne des news quand même !