Rechercher : dans
Par :

Aide MAJ Liste chainée Langage C

Dernière réponse le 3 jun 2009 à 17:14:58 Sephirius, le 3 jun 2009 à 16:25:22 
 Signaler ce message aux modérateurs

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... )
Configuration: Windows
Firefox 3.0.10

Meilleures réponses pour « Aide MAJ Liste chainée Langage C » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Introduction au langage C VoirPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

ahmet0851, le 3 jun 2009 à 16:32:13

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;
Si quelqu'un vous aide un merci et un résolu (petite case à ­droite de votre 1er message) !! 

Répondre à ahmet0851

2

Sephirius, le 3 jun 2009 à 16:41:11

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)

Répondre à Sephirius

3

ahmet0851, le 3 jun 2009 à 16:53:43

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 ! Si quelqu'un vous aide un merci et un résolu (petite case à ­droite de votre 1er message) !! 

Répondre à ahmet0851

4

Sephirius, le 3 jun 2009 à 16:57:27

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

Répondre à Sephirius

5

ahmet0851, le 3 jun 2009 à 17:02:00

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 ! Si quelqu'un vous aide un merci et un résolu (petite case à droite de votre 1er message) !! 

Répondre à ahmet0851

6

 Sephirius, le 3 jun 2009 à 17:14:58

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

Répondre à Sephirius