Affichage du conntenu d'une liste chainée C

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 2 juil. 2008 à 15:33
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 2 juil. 2008 à 23:44
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

4 réponses

stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
2 juil. 2008 à 17:46
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
2 juil. 2008 à 19:48
pas de reponses :(
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 juil. 2008 à 22:54
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
2 juil. 2008 à 23:10
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 juil. 2008 à 23:28
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
2 juil. 2008 à 23:38
merci Lami
ta une idée comment faire stp?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
2 juil. 2008 à 23:40
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 mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
2 juil. 2008 à 23:44
ok merci :)
0