Affichage du conntenu d'une liste chainée C

stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -  
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai un probleme, ( je developpe en C)
j'ai une fonction qui parcourt toute la liste chainee qui contient des mots , jai reussi à faire l'affichage de la liste mais le probleme c'est qu'il n ya pas un espace entre les differents mot :(
exple il affiche "lebateau " au lieu du "le bateau".
j'attends vos reponse.
merci
A voir également:

4 réponses

stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
int main()
{
  FILE *F;
  char mot[100];
  int i;
  unsigned int cle,pt;
  int nl, pos;
  nl=pos=1;
  char c;
  int seuil;
  Liste **L;
 
  Liste **TableHash;
  TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
  for(i=0;i<TAILLEHASH;++i)
    TableHash[i] = NULL;
 
  pt=hash_cle(".");
  //printf("%d",pt);
 
  printf("debut du programme \n----------------------------------\n");  
  F=fopen("C:\\Documents and Settings\\siril\\Bureau\\projet\\text.txt","r");
  while(fscanf(F,"%s",mot)==1){
       cle = hash_cle(mot);
      if ((cle!=pt ) && (! ChercherMotDansTableHash(TableHash,mot)))
            TableHash[cle] = InsertionEnTete(TableHash[cle],mot);     
  }
  fclose(F );
  F=fopen("C:\\Documents and Settings\\siril\\Bureau\\projet\\text.txt","r");
  PosLigne(F,TableHash);
  
  //filtrage 
  printf("\nla liste filtre :\n----------------------------------\n");
  FiltreListe(TableHash,2);
  AfficherTableHash(TableHash);
 
  //géneration des 2seq
  Liste *seq=NULL;
  Generer2seq(TableHash, 2, &seq);
  printf("\nla liste des 2seq :\n----------------------------------\n");
  AfficherListe(seq);
  
  scanf("%c",c);
    
  return 0;
}
 
 
void AfficherListe(Liste *L){
  Liste *p;
  for(p=L;p!=NULL;p=p->suivant){
    AfficheMot(p->mot);
    AfficherCoordonnees(p->c);
  }
}
 
 
void AfficheMot(char *mot){
  printf("%s ",mot);
}
 
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
pas de reponses :(
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

affiche le code complet puisque j'ai oublié
et aussi le fichier sur lequel tu testes

merci
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
POSTMOT.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include "table_hash.h"
#define TAILLEHASH 307


int main()
{
  FILE *F;
  char mot[100];
  int i;
  unsigned int cle,pt;
  int nl, pos;
  nl=pos=1;
  char c;
  int seuil;
  Liste **L;

  Liste **TableHash;
  TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *));
  for(i=0;i<TAILLEHASH;++i)
    TableHash[i] = NULL;

  pt=hash_cle(".");
  //printf("%d",pt);

  printf("debut du programme \n----------------------------------\n");  
  F=fopen("C:\\Documents and Settings\\siril\\Bureau\\projetcyrine\\text.txt","r");
  while(fscanf(F,"%s",mot)==1){
       cle = hash_cle(mot);
      if ((cle!=pt ) && (! ChercherMotDansTableHash(TableHash,mot)))
            TableHash[cle] = InsertionEnTete(TableHash[cle],mot);     
  }
  fclose(F );
  F=fopen("C:\\Documents and Settings\\siril\\Bureau\\projetcyrine\\text.txt","r");
  PosLigne(F,TableHash);
  
  //filtrage 
  printf("\nla liste filtre :\n----------------------------------\n");
  FiltreListe(TableHash,2);
  AfficherTableHash(TableHash);

  //géneration des 2seq
  Liste *seq=NULL;
  Generer2seq(TableHash, 2, &seq);
  printf("\nla liste des 2seq :\n----------------------------------\n");
  AfficherListe(seq);
  //printf("Chercher mot : ");
  //scanf("%s",mot);
  //if(cle = ChercherMotDansTableHash(TableHash,mot))
  //  printf("%s existant dans le conteneur %u\n",mot,hash_cle(mot));
  //else
  //  printf("%s inexistant dans la table de hash\n");
  scanf("%c",c);
    
  return 0;
}




void ParcourirElementTableHash(Liste **TableHash,char *mot){
  int cle;
  Liste *p;
  cle = hash_cle(mot);

  for(p=TableHash[cle];p!=NULL;p=p->suivant)
    if(strcmp(mot,p->mot) == 0){
      printf("%s : ",mot);
      AfficherCoordonnees(p->c);
    }
}









Liste *InsertionEnTete(Liste *L,char *mot){
  Liste *nouveau;
  nouveau = (Liste *) malloc (sizeof(Liste));
  strcpy(nouveau->mot,mot);
  nouveau->suivant = L;
  nouveau->c = NULL;
  return nouveau;
}

Coordonnees *InsertionEnTeteCoordonnee(Coordonnees *C,int nl ,int pos){
  Coordonnees *nouveau;
  nouveau = (Coordonnees *) malloc (sizeof(Coordonnees));
  nouveau->pos = pos;
  nouveau->nl = nl;
  nouveau->suivant = C;
  return nouveau;
}

void AfficherListe(Liste *L){
  Liste *p;
  for(p=L;p!=NULL;p=p->suivant){
    AfficheMot(p->mot);
    AfficherCoordonnees(p->c);
  }
}

void AfficherCoordonnees(Coordonnees *C){
  Coordonnees *p;
  for(p=C;p!=NULL;p=p->suivant)
	  printf(" (%d,%d) ",p->nl,p->pos);
  printf("\n");
}

void AfficheMot(char *mot){
  printf("%s ",mot," ");
}

unsigned int hash_cle(char *mot){
  unsigned int val = 0;
  for(;*mot!='\0';++mot)
    val = *mot + 31 * val;
  return val % TAILLEHASH;
}

void AfficherTableHash(Liste **TableHash){
  int i;
  for(i=0;i<TAILLEHASH;++i)
    if(TableHash[i] != NULL){
      printf("Conteneur %d \n",i);
      AfficherListe(TableHash[i]);
      printf("----------------------------------\n");
    }
}

unsigned int ChercherMotDansTableHash(Liste **TableHash,char *mot){
  
  Liste *p;
  unsigned int cle;
  
  cle = hash_cle(mot);
  for(p=TableHash[cle];p!=NULL;p=p->suivant)
    if(strcmp(p->mot,mot)==0)
      return 1;
  return 0;
}

void FiltreListe(Liste **TableHash, int seuil){

  Liste *p ,*last;
  Coordonnees *c;
  int i,supp=0,nb=0;
  for(i=0;i<TAILLEHASH;++i)
    if(TableHash[i] != NULL){
     nb=0;
     last=TableHash[i];
     for(p=TableHash[i];p!=NULL;p=p->suivant){
      supp=0;
      nb++;
      for(c=p->c;c!=NULL;c=c->suivant)
	     supp++;
  
     if( supp <seuil){ // mot n'est pas frequent
       if (last==p) // cas du première mot
         {
            TableHash[i]=p->suivant;
            last=p->suivant;
         }
       else
          last->suivant=p->suivant;
       nb--;
    }else
   last=p;
   }
   if (nb==0)
      TableHash[i] = NULL;
  }
}

void Generer2seq(Liste **TableHash, int seuil, Liste **seq){

  Liste *p1, *p2, *ss,*t;
  Coordonnees *c1,*c2;
  int i,j,supp1=0,supp2=0,nb=0;
  char s1[50], s2[50],*t1,*t2;
  ss=*seq;
  printf("\nconstruction des 2seq \n---------------\n");
  for(i=0;i<TAILLEHASH;++i)
    if(TableHash[i] != NULL)
     for(p1=TableHash[i];p1!=NULL;p1=p1->suivant)
         for(j=i;j<TAILLEHASH;++j)
             if(TableHash[j] != NULL){
                if (j==i)
                    t=p1;
                    else
                    t=TableHash[j];
                for(p2=t;p2!=NULL;p2=p2->suivant){
                       
                       if (strcmp(p1->mot,p2->mot)!=0){   // si 2 mots differents trouvés
                        Liste *tmp1=NULL, *tmp2=NULL;
                        strcpy(s1,p1->mot);
                        strcpy(s2,p2->mot);
                        t1=strcat(s1,p2->mot);
                        t2=strcat(s2,p1->mot);
                        tmp1=InsertionEnTete(tmp1,s1);
                        tmp2=InsertionEnTete(tmp2,s2);
                        
                        printf("creation TMP1 et TMP2 : %s ,%s\n",s1,s2);
                        supp1=0;supp2=0;
                        for(c1=p1->c;c1!=NULL;c1=c1->suivant)  // calcule de supp
                         for(c2=p2->c;c2!=NULL;c2=c2->suivant){
                           if (c1->nl == c2->nl){
                             if(c1->pos < c2->pos){
                                 tmp1->c=InsertionEnTeteCoordonnee(tmp1->c,c1->nl ,c2->pos);    
                                 supp1++;
                                 }
                             else{
                                 tmp2->c=InsertionEnTeteCoordonnee(tmp2->c,c1->nl ,c1->pos);
                                 supp2++;
                                 }
                             }
                         }   // fin calcul supp
                         if(supp1>=seuil){
                            //printf("%d ",supp1);
                            if (*seq==NULL)
                              *seq=tmp1;
                            else  
                              ss->suivant=tmp1;
                            ss=tmp1;
                          //printf("%s : OK1\n",tmp1->mot);
                         }
                         if(supp2>=seuil){
                            //printf("%d ",supp2);
                            if (*seq==NULL)
                              *seq=tmp2;
                            else  
                              ss->suivant=tmp2;
                            ss=tmp2;
                          //printf("%s : OK2\n",tmp2->mot);
                        }
                    } // fin de traitement des mot
                 //printf("fin");
                 }
             }
             printf("////fin calcule 2seq\n");
}



void PosLigne(FILE *F,Liste **TableHash){
  char s[50];
  int nl,pos,i;
  Liste *p;
  nl=pos=1;

  while(fscanf(F,"%s",s)==1){
    for(i=0;i<TAILLEHASH;++i)
      if(TableHash[i]!=NULL)
        for(p=TableHash[i];p!=NULL;p=p->suivant)
          if(strcmp(p->mot,s)==0)
            p->c=InsertionEnTeteCoordonnee(p->c,nl ,pos);
    if(fgetc(F)=='\n'){
      ++nl;
      pos=0;
    }
    ++pos;
  }
  printf("\n");
}




table_hash.h


#ifndef TABLE_HASH
#define TABLE_HASH

typedef struct c{
	int pos;
	int nl;
	struct c *suivant;
}Coordonnees;

typedef struct L{
	char mot[50];
	Coordonnees *c;
	struct L *suivant;
}Liste;


Liste *InsertionEnTete(Liste *L,char *mot);
Coordonnees *InsertionEnTeteCoordonnee(Coordonnees *C,int nl,int pos);
void AfficherListe(Liste *L);
void AfficherCoordonnees(Coordonnees *C);
void AfficheMot(char *mot);
unsigned int hash_cle(char *mot);
void AfficherTableHash(Liste **TableHash);
unsigned int ChercherMotDansTableHash(Liste **TableHash,char *mot);
void PosLigne(FILE *F,Liste **TableHash);
void frequent( Liste **TableHash , int mc);
void ParcourirElementTableHash(Liste **TableHash,char *mot);
void FiltreListe(Liste **L, int seuil);
void Generer2seq(Liste **TableHash, int seuil, Liste **seq);
#endif




fichier texte


Support for RTSP authentication
Support for adding subtitles on the fly
Fixed MPEG-PS duration calculation
ATSC support for DVB input
Partial reading support for DVR-ms recordings
Partial reading support for MXF and GXF fileformat
Improved support for Flash Video files



ctout
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Le problème c'est ta fonction Generer2seq
Par exemple Supportfor et enregistrer comme un mot et pas deux
Je vois que tu as compliquer beaucoup ce que a déjà été fait.

J'ai mis un ; juste pour voir s'il y a un problème de séparation. Et non, le problème viens de ta fonction.
debut du programme

----------------------------------


la liste filtre :
----------------------------------
Conteneur 17
Support ;  (2,1)  (1,1)
----------------------------------
Conteneur 95
reading ;  (6,2)  (5,2)
----------------------------------
Conteneur 133
Partial ;  (6,1)  (5,1)
----------------------------------
Conteneur 205
support ;  (7,2)  (6,3)  (5,3)  (4,2)
----------------------------------
Conteneur 267
for ;  (7,3)  (6,4)  (5,4)  (4,3)  (2,2)  (1,2)
----------------------------------

construction des 2seq
---------------
creation TMP1 et TMP2 : Supportreading ,readingSupport
creation TMP1 et TMP2 : SupportPartial ,PartialSupport
creation TMP1 et TMP2 : Supportsupport ,supportSupport
creation TMP1 et TMP2 : Supportfor ,forSupport
creation TMP1 et TMP2 : readingPartial ,Partialreading
creation TMP1 et TMP2 : readingsupport ,supportreading
creation TMP1 et TMP2 : readingfor ,forreading
creation TMP1 et TMP2 : Partialsupport ,supportPartial
creation TMP1 et TMP2 : Partialfor ,forPartial
creation TMP1 et TMP2 : supportfor ,forsupport
////fin calcule 2seq

la liste des 2seq :
----------------------------------
Supportfor ;  (1,2)  (2,2)
Partialreading ;  (5,2)  (6,2)
readingsupport ;  (5,3)  (6,3)
readingfor ;  (5,4)  (6,4)
Partialsupport ;  (5,3)  (6,3)
Partialfor ;  (5,4)  (6,4)
supportfor ;  (4,3)  (5,4)  (6,4)  (7,3)

0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2
 
merci Lami
ta une idée comment faire stp?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention  
 
Ben, tu reprends ta fonction et tu vois où ça coince.

Je n'ai vraiment pas le temps pour regarder.
Peut être dans week-end.
Je suis très occupé ce dernier temps au boulot.
0
stroumpf Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   2 > lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
 
ok merci :)
0