probleme avec liste chainée

probleme avec liste chainée - C - Programmation

Marsh Posté le 28-02-2005 à 14:53:29    

Bonjour,
 
Pour les besoisn d'un projet j'ai créé un type pile dans lequel je stoke des chaines de caracteres et le nombre de fois où elles apparaissent dans un fichier.
Je viens de me rendre compte que lorsque je rentre une chaine trop longue elle est ensuite coupée, lors de l'ajout d'une nouvelle...
 
Le type pile (extrait de pile.h)

Code :
  1. typedef struct
  2. {
  3.   int valeur;
  4.   char *token;
  5.   struct pile *prec;
  6. } pile ;


 
Fichier pile.c

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "pile.h"
  5. /*************************************************************************/
  6. void insererElement(pile **p, char *t)
  7. {
  8.   pile *suiv = malloc(sizeof(pile));
  9.   pile *present;
  10.   if(!suiv) return;     /* Si l'allocation a échouée. */
  11.   if ((present=existe(*p, t)) != NULL ){
  12.     incrementerElement(present);
  13.     }else{
  14.   suiv->token = malloc(sizeof(char));
  15.   strcpy(suiv->token, t);
  16.   suiv->valeur = 1;
  17.   suiv->prec = *p;
  18.   *p = suiv;       /* Le pointeur pointe sur le dernier élément. */
  19.   }
  20. }
  21. /*************************************************************************/
  22. pile* existe(pile *p, char *t)
  23. {
  24.   while(p){
  25.     if(strcmp((p)->token,t)==0) return p;           
  26.     p = p->prec;
  27.   }
  28.   return NULL;
  29. }
  30. /*************************************************************************/
  31. void incrementerElement(pile *p)
  32. {
  33.   (p)->valeur = (p)->valeur +1;
  34. }
  35. /*************************************************************************/
  36. int obtenirTotal(pile *p)
  37. {
  38.   int total = 0;
  39.   while(p){           
  40.     total = total + p->valeur;
  41.     p = p->prec;
  42.   }
  43.   return total;
  44. }
  45. /*************************************************************************/
  46. int obtenirNbApparition(pile *p, char *t)
  47. {
  48.   pile *present;
  49.   if ((present=existe(p, t)) != NULL )
  50.     return ((present)->valeur);
  51.   else
  52.     return 0;
  53. }
  54. /*************************************************************************/
  55. void afficherElements(pile *p)
  56. {
  57.     while(p){           
  58.     printf("\n%s : %d\n", p->token, p->valeur);
  59.     p = p->prec;
  60.   }
  61. }
  62. /*************************************************************************/
  63. void viderPile(pile **p)
  64. {
  65.   pile *tmp;
  66.   while(*p)
  67.     {
  68.       tmp = (*p)->prec;
  69.       free(*p);
  70.       *p = tmp;
  71.     }
  72. }


 
fichier main.c

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "pile.h"
  4. int main()
  5. {
  6.   pile *MaPile = NULL;   /* Impératif de l'initialiser à NULL */
  7.   char *chaine = malloc(sizeof(char));
  8.   strcpy(chaine,"test" );
  9.   insererElement(&MaPile, chaine);
  10.   insererElement(&MaPile, "pouet" );
  11.   insererElement(&MaPile, "pouetfghfhjfhgftyffhgvjhkbuyrtydhfcjguyfyf" );
  12.   insererElement(&MaPile, "pouetfghfhjfhgftyffhgvjhkbuyrtydhfcjguyfyf" );
  13.   insererElement(&MaPile, "pouetfghfhjfhgftyffhgvjhkbuyrtydhfcjguyfyf" );
  14.   insererElement(&MaPile, "pouetfghfhjfhgftyffhgvjhkbuyrtydhfcjguyfyf" );
  15.   afficherElements(MaPile);


 
et l'affichage resultant :

pouetfghfhjfhgftyffhgvjhkbuyrtydhfcjguyfyf : 1
 
pouetfghfhjf : 1
 
pouetfghfhjf : 1
 
pouetfghfhjf : 1
 
pouet : 1
 
test : 1

 
Je continue à chercher dans mon code d'où peut venir l'erreur, mais peut etre qu'un oeil exterieur trouvera plus rapidement...
Je vous remercie d'avance

Reply

Marsh Posté le 28-02-2005 à 14:53:29   

Reply

Marsh Posté le 28-02-2005 à 15:14:16    

bon c'est bon j'ai trouvé :
dans ma fonction insererElement je faisais un strcpy(suiv->token, t);
et ça ne passais pas.
Maintenant je fais : suiv->token = t
et ça marche. Surement un problème d'allocation de mémoire

Reply

Marsh Posté le 28-02-2005 à 15:42:03    

Ha!
ligne 16:

Code :
  1. suiv->token = malloc(sizeof(char));


i.e. tu alloue 1 octets! Je pense que tu voulais

Code :
  1. suiv->token = malloc(sizeof(char)*(strlen(t)+1));


mais ...

Code :
  1. suiv->token = t;


mais en plus, il est suicidaire...
 
Question indiscrète: où utilise-tu ton appli?

Reply

Marsh Posté le 28-02-2005 à 15:56:37    

ha ouai !!!
Woula ça va plus moi !! Besoin de repos des le lundi...
 
En fait je suis censé tokenizer des pages html et stoker ces tokens dans la pile.
 
Merci de m'avoir ouvert les yeux...

Reply

Marsh Posté le 28-02-2005 à 16:08:16    

est ce que tu saurais pourquoi j'ai ces remarques a la compilations ?

pile.c: In function `insererElement':
pile.c:19: attention : affectation d'un type pointeur incompatible
pile.c: In function `existe':
pile.c:30: attention : affectation d'un type pointeur incompatible
pile.c: In function `obtenirTotal':
pile.c:49: attention : affectation d'un type pointeur incompatible
pile.c: In function `afficherElements':
pile.c:71: attention : affectation d'un type pointeur incompatible
pile.c: In function `viderPile':
pile.c:82: attention : affectation d'un type pointeur incompatible

est-ce qu'il me manque un include qqpart ?


Message édité par peyrouz le 28-02-2005 à 16:08:54
Reply

Marsh Posté le 28-02-2005 à 16:37:34    

peyrouz a écrit :

est ce que tu saurais pourquoi j'ai ces remarques a la compilations ?

pile.c: In function `insererElement':
pile.c:19: attention : affectation d'un type pointeur incompatible
<...>

est-ce qu'il me manque un include qqpart ?


 
Il manque le 'tag' de la structure (c'est une structure récursive) :


typedef struct pile
{
   int valeur;
   char *token;
   struct pile *prec;
} pile ;


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2005 à 16:38:55    

Merci beaucoup !!

Reply

Sujets relatifs:

Leave a Replay

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