Aide MAJ liste chainée

Aide MAJ liste chainée - C - Programmation

Marsh Posté le 03-06-2009 à 14:49:21    

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 précédent.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #define NB 3
  6. /********** structure*/
  7. typedef struct tabgroupes{
  8. char tLibGrp[50];
  9.    int tAgeMin;
  10.    int tAgeMax;
  11.    int tNbrInsc;
  12.    struct liste *tPTRDebInsc;
  13. }tabgroupes;
  14. typedef struct liste{
  15. char nomE[20];
  16.    char prenomE[20];
  17.    struct liste *pEnfSuiv;
  18. }liste;
  19. typedef struct fiche{
  20.  char nomF[20];
  21.    char prenomF[20];
  22.    int ageF;
  23. }fiche;
  24. //********** prototype*/
  25. void initabgroupes(tabgroupes []);
  26. fiche obtention(void);
  27. int rechtabgroupes(tabgroupes [], int);
  28. void ajoutliste(tabgroupes [],int,fiche);
  29. void imprimer(tabgroupes tab[]);
  30. //********** fonction principale*/
  31. void main(void)
  32. {
  33. tabgroupes tabgr[NB];
  34.    fiche fiche;
  35.    int indice;
  36.    initabgroupes(tabgr);
  37.    fiche = obtention();
  38.    while(strcmp(fiche.nomF,"zzz" ))
  39.     {
  40.        indice = rechtabgroupes(tabgr,fiche.ageF);
  41.          ajoutliste(tabgr,indice,fiche);
  42.        fiche = obtention();
  43.       }
  44.    imprimer(tabgr);
  45.    getch();
  46. }
  47. //********** Fonctions associées*/
  48. void initabgroupes(tabgroupes Tab[])
  49. {
  50. int i;
  51.    char tlib[50];
  52.    for(i=0;i<NB;i++)
  53.     {
  54.         printf("Entrez le libelle du groupe %d : ",i+1);
  55.          scanf("%s",tlib);
  56.          strcpy(Tab[i].tLibGrp,tlib);
  57.          printf("Entrez l'age minimum de ce groupe: " );
  58.          scanf("%d",&Tab[i].tAgeMin);
  59.          printf("Entre l'age maximum de ce groupe: " );
  60.          scanf("%d",&Tab[i].tAgeMax);
  61.          Tab[i].tNbrInsc = 0;
  62.        Tab[i].tPTRDebInsc = NULL;
  63.       }
  64.    clrscr();
  65. }
  66. fiche obtention()
  67. {
  68.    fiche fiche;
  69.    printf("Entrez le nom de l'enfant: " );
  70.    scanf("%s",fiche.nomF);
  71.    printf("Entrez le prenom de l'enfant: " );
  72.    scanf("%s",fiche.prenomF);
  73.    printf("Entre l'age de l'enfant: " );
  74.    scanf("%d",&fiche.ageF);
  75.    clrscr();
  76.    return fiche;
  77. }
  78. int rechtabgroupes(tabgroupes tab[], int ageF)
  79. {
  80. int i=0;
  81.    while(ageF>tab[i].tAgeMax)
  82.     {
  83.        i++;
  84.       }
  85.  return i;
  86. }
  87. void ajoutliste(tabgroupes tab[], int ind,fiche fiche)
  88. {
  89.    liste *ptr, *saveptr, *ptrnew;
  90.    ptr = tab[ind].tPTRDebInsc;
  91.    while(ptr != NULL && fiche.nomF>ptr->nomE)
  92.     {
  93.         saveptr = ptr;
  94.          ptr=ptr->pEnfSuiv;
  95.       }
  96.       ptrnew = (liste *) malloc (sizeof(liste));
  97.       if(ptrnew == NULL)
  98.        {
  99.          printf("Memoire full" );
  100.          }
  101.       else
  102.        {
  103.           strcpy(ptrnew->nomE,fiche.nomF);
  104.           strcpy(ptrnew->prenomE,fiche.prenomF);
  105.           ptrnew->pEnfSuiv = ptr;
  106.           tab[ind].tNbrInsc ++;
  107.           if(ptr==NULL)
  108.            {
  109.              tab[ind].tPTRDebInsc = ptrnew;
  110.             }
  111.           else
  112.            {
  113.                saveptr->pEnfSuiv = ptrnew;
  114.             }
  115.        }
  116. }
  117. void imprimer(tabgroupes tab[])
  118. {
  119.    liste *ptr;
  120. int i;
  121.    for(i=0;i<NB;i++)
  122.     {
  123.         ptr=tab[i].tPTRDebInsc;
  124.          printf("Tableau %d\n",i+1);
  125.          while(ptr != NULL)
  126.           {
  127.              printf("%s\t%s\n",ptr->nomE,ptr->prenomE);
  128.               ptr=ptr->pEnfSuiv;
  129.             }
  130.       }
  131. }


 
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... )

Reply

Marsh Posté le 03-06-2009 à 14:49:21   

Reply

Marsh Posté le 03-06-2009 à 18:29:28    

A la lecture succincte de ton code, je pense que tu ne passes pas dans le second else car ptr est NULL.
 

Code :
  1. //...
  2. Tab[i].tPTRDebInsc = NULL;   // Tous tes tPTRDebInsc de ton tableau vont être NULL
  3. //...
  4. ptr = tab[ind].tPTRDebInsc;   // donc ton ptr = NULL


 
Essaie de donner une valeur à ptr juste avant ton "if(ptr==NULL)" pour voir si y'a toujours le problème (qu'idéalement tu devrait définir car on ne sait pas bien ce qui se passe, on sait juste que ça ne marche pas comme tu veux)


---------------
If you think it could look good, then I guess it should
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed