Aide MAJ Liste chainée Langage C

Fermé
Sephirius - 3 juin 2009 à 16:25
 Sephirius - 3 juin 2009 à 17:14
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.

#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:

4 réponses

Utilisateur anonyme
3 juin 2009 à 16:32
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;
0
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)
0
Utilisateur anonyme
3 juin 2009 à 16:53
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 !
0
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...
0
Utilisateur anonyme
3 juin 2009 à 17:02
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 !
0
Ce que je fait aussi généralement, des printf plein mon code bien propre lol
Mais justement ca ne m'avance pas, je sort bien ce que je devrais mais ca bug au changement d'adresse...
0