Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2916 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Aide MAJ liste chainée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide MAJ liste chainée

n°1890916
wazaki
Posté le 03-06-2009 à 14:49:21  profilanswer
 

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

mood
Publicité
Posté le 03-06-2009 à 14:49:21  profilanswer
 

n°1891076
Turkleton
I don't quite understand you
Posté le 03-06-2009 à 18:29:28  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Aide MAJ liste chainée

 

Sujets relatifs
garder la Valeur d'une liste de choixAIDE créer une page en INTRANET
[Résolu-BATCH] aide sur la commande for /f delimsRangement d'une liste
aide pour un scriptzone de liste
liste déroulante et sous formulaireInverser une liste
Besoin d'aideAide modification de mon site
Plus de sujets relatifs à : Aide MAJ liste chainée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR