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

  FORUM HardWare.fr
  Programmation
  C

  probleme avec liste chainée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme avec liste chainée

n°995845
peyrouz
Posté le 28-02-2005 à 14:53:29  profilanswer
 

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

mood
Publicité
Posté le 28-02-2005 à 14:53:29  profilanswer
 

n°995870
peyrouz
Posté le 28-02-2005 à 15:14:16  profilanswer
 

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

n°995909
western
AJMM
Posté le 28-02-2005 à 15:42:03  profilanswer
 

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?

n°995936
peyrouz
Posté le 28-02-2005 à 15:56:37  profilanswer
 

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

n°995954
peyrouz
Posté le 28-02-2005 à 16:08:16  profilanswer
 

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
n°996011
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2005 à 16:37:34  profilanswer
 

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/
n°996017
peyrouz
Posté le 28-02-2005 à 16:38:55  profilanswer
 

Merci beaucoup !!


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

  probleme avec liste chainée

 

Sujets relatifs
Probleme de requet SQL php[PHP] Petit problème avec les checkbox
LE problème des philosophesListe des codec
[REGLE ] Probleme de couleurProblème popup image
Problème de Procedure avec liste chainée et fichier[C] Liste chaînée / pointeur : problème !
petit probleme sur liste chainée simpleprobleme sur liste chainée
Plus de sujets relatifs à : probleme avec liste chainée


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