LISTE CHAINÉES DE STRUCTURES

LISTE CHAINÉES DE STRUCTURES - C - Programmation

Marsh Posté le 04-12-2017 à 09:25:35    

Bonjour à tous,  
Pourriez-vous m'aider a comprendre pourquoi je n'arrive pas à implémenter  chainées des listes de structures en c.
Voici mes structures :  

Code :
  1. typedef struct Tocc
  2. {
  3.     int posOcc;
  4.     //double* tableResultPSSM;
  5.     struct Tocc *nxt;
  6. }Tocc;
  7. typedef Tocc* llistOcc;
  8. typedef struct Tseq
  9. {
  10.     int numSeq;
  11.     struct Tocc *pllistOcc;
  12.     struct Tseq *nxt;
  13. }Tseq;
  14. typedef Tseq* llistSeq;
  15. typedef struct Tkmer
  16. {
  17. char* seqKmer;
  18. struct Tseq *pllistSeq;
  19. struct Tkmer *nxt;
  20. }Tkmer;
  21. typedef Tkmer* llistKmer;


 
Et voici les fonctions qui me permettent d'implémenter mes structures:  
 

Code :
  1. int kmerControl(llistKmer listeKmer, char* seqKmer)
  2. {
  3. Tkmer* tmp=listeKmer;
  4.     int existKmer=0;
  5.     while(tmp!=NULL && existKmer!=1){
  6.         if(strcmp(tmp->seqKmer, seqKmer)==0){
  7.             existKmer=1;
  8.             return existKmer;
  9.         }
  10.         tmp=tmp->nxt;
  11.     }
  12.     return existKmer;
  13. };
  14. llistOcc AjouterEnFinOcc(llistOcc listeOcc, int posOcc)
  15. {
  16.     Tocc* nouvelTocc =(Tocc*)malloc(sizeof(Tocc));
  17.     nouvelTocc->posOcc = posOcc;
  18.     nouvelTocc->nxt = listeOcc;
  19.     /*if(listeOcc == NULL)
  20.     {  
  21.         return nouvelTocc;
  22.     }else{
  23.         Tocc *tmp=listeOcc;
  24.         while(tmp->nxt != NULL)
  25.         {
  26.             tmp = tmp->nxt;
  27.         }
  28.         tmp->nxt = nouvelTocc;*/
  29.     //afficherListeOcc(listeOcc);
  30.     return nouvelTocc;
  31. };
  32. llistSeq AjouterEnTeteSeq(llistSeq listeSeq, int numSeq, int posOcc)
  33. {
  34.     Tseq* nouvelTseq = (Tseq*)malloc(sizeof(Tseq));
  35.     nouvelTseq->numSeq=numSeq;
  36.     nouvelTseq->pllistOcc=(Tocc*)malloc(sizeof(Tocc));
  37.     //nouvelTseq->pllistOcc=NULL;
  38.     nouvelTseq->pllistOcc=AjouterEnFinOcc(nouvelTseq->pllistOcc, posOcc);
  39.     nouvelTseq->nxt = listeSeq;
  40.     return nouvelTseq;
  41. };
  42. llistKmer ajouterKmer(int existKmer, llistKmer listKmer,char* seqKmer, int numSeq, int posOcc)
  43. {
  44.     int existSeq=0;
  45.     if (existKmer == 0){
  46.         printf("Kmer n'existe pas\n" );
  47.         Tkmer* nouvelTkmer = (Tkmer*)malloc(sizeof(Tkmer));
  48.         nouvelTkmer->seqKmer=(char*)malloc(sizeof(char));
  49.         strcpy(nouvelTkmer->seqKmer, seqKmer);
  50.         nouvelTkmer->pllistSeq=(Tseq*)malloc(sizeof(Tseq));
  51.         //nouvelTkmer->pllistSeq = NULL;
  52.         nouvelTkmer->pllistSeq = AjouterEnTeteSeq(nouvelTkmer->pllistSeq, numSeq, posOcc);
  53.         nouvelTkmer->nxt = listKmer;
  54.         return nouvelTkmer;
  55.     }else{//Kmer existe déjà mais existe - il pour la séq donnée ?
  56.         while(listKmer != NULL)
  57.         {
  58.             if (strcmp(listKmer->seqKmer, seqKmer) == 0){
  59.                 llistSeq tmpSeq=listKmer->pllistSeq;
  60.                 while (tmpSeq != NULL){
  61.                     if (tmpSeq->numSeq == numSeq && existSeq==0){
  62.                         existSeq=1;
  63.                         //Seq existe mais pas posOcc donc ajout posOcc
  64.                         printf("Kmer %s et Seq %d existent \n", listKmer->seqKmer, tmpSeq->numSeq);
  65.                         tmpSeq->pllistOcc=AjouterEnFinOcc(tmpSeq->pllistOcc, posOcc);
  66.                         listKmer->pllistSeq=tmpSeq;
  67.                         return listKmer;
  68.                     }
  69.                     tmpSeq=tmpSeq->nxt;
  70.                 }
  71.             }
  72.             listKmer=listKmer->nxt;               
  73.         }   
  74.         if (existSeq==0){
  75.             while(listKmer != NULL){
  76.                 if (strcmp(listKmer->seqKmer, seqKmer) == 0){
  77.                     printf("Kmer exist mais pas seq\n" );
  78.                     //listKmer->pllistSeq=(Tseq*)malloc(sizeof(Tseq));
  79.                     //listKmer->pllistSeq=NULL;
  80.                     listKmer->pllistSeq=AjouterEnTeteSeq(listKmer->pllistSeq, numSeq,posOcc);
  81.                     return listKmer;
  82.                 }
  83.                 listKmer=listKmer->nxt;
  84.             }
  85.         }
  86.     }
  87.     return listKmer;
  88. };
  89. void afficherListes(llistKmer listeKmer)
  90. {
  91.     Tkmer* tmp = listeKmer;
  92.     while(tmp != NULL)
  93.     {
  94.         printf("\n\n==== Kmer = %s\n", tmp->seqKmer);
  95.         Tseq*   ptrSeq=tmp->pllistSeq;
  96.         while(ptrSeq != NULL)
  97.         {
  98.             printf("*Seq %d =\n", ptrSeq->numSeq);
  99.             Tocc*   ptrOcc=ptrSeq->pllistOcc;
  100.             while(ptrOcc != NULL)
  101.             {
  102.                 printf(" pos %d, ", ptrOcc->posOcc);
  103.                 ptrOcc=ptrOcc->nxt;
  104.             }
  105.             ptrSeq=ptrSeq->nxt;
  106.         }
  107.         tmp = tmp->nxt;
  108.     }
  109. };


 
Et enfin la partie du main qui fait appel aux fonctions d'implémentation :  

Code :
  1. llistKmer listKmer=(Tkmer*)malloc(sizeof(Tkmer));
  2.     listKmer=NULL;
  3.     char* temp1=(char*)malloc(sizeof(char)*(longseq));
  4.     char* seqOcc;
  5.     char* seqKmer;
  6.     int* masque;
  7.     masque=(int*)malloc(sizeof(int)*kfen);
  8.     GenererMasque(masque,longMotif, kfen);
  9.     int x =masque[0];
  10.     int y =masque[1];
  11.     printf("Pos masque %d, %d\n", x,y);
  12.     for(int ns=0; ns<nSeq; ns++)
  13.     {
  14.  seqOcc = (char*)malloc(sizeof(char)*(longMotif + 1));
  15.         memset(seqOcc, '0',longMotif);
  16.         seqOcc[longMotif]='\0';
  17.         seqKmer = (char*)malloc(sizeof(char)*(kfen+1));
  18.         memset(seqKmer, '0',kfen);
  19.         seqKmer[kfen]='\0';
  20.         temp1=matSeq[ns];
  21.         printf("\n\n----SEQUENCE = %s\n",temp1);
  22.         for ( int posOcc = 0; posOcc <(longseq-longMotif+1); posOcc++)
  23.         {
  24.             int pos1=posOcc+x;
  25.             int pos2=posOcc+y;
  26.             if (pos1<pos2)
  27.             {//Pour avoir le kmer dans le bon ordre
  28.               seqKmer[0]=temp1[pos1];
  29.               seqKmer[1]=temp1[pos2];
  30.             } else {
  31.               seqKmer[0]=temp1[pos2];
  32.               seqKmer[1]=temp1[pos1];
  33.             }
  34.             printf("KMER = %s\n", seqKmer);
  35.             for (int i = 0; i< longMotif; i++) {
  36.                 seqOcc[i]=temp1[posOcc+i];
  37.             }
  38.             printf("PosOcc %d = %s\n",posOcc,seqOcc);
  39.             int existKmer=0;
  40.             //Implémentation dans les structures de la seqKmer, de la numeroseq ns et de la position Occurrence à partir de la liste Kmer.
  41.             existKmer=kmerControl(listKmer, seqKmer);
  42.             listKmer=ajouterKmer(existKmer, listKmer, seqKmer, ns, posOcc);
  43.         }
  44.         printf("\n----Affichage Listes----\n\n" );
  45.         afficherListes(listKmer);
  46.         printf("\n" );
  47.     }
  48.     printf("\n----Affichage Listes----\n\n" );
  49.     afficherListes(listKmer);
  50.     printf("\n" );


 
Le Problème est que des que je passe fini une boucle de Séquence, il écrase la listKmer et je ne vois pas pourquoi donc je n'arrive pas a afficher  
Kmer = AT
*seq 1=
   pos1, pos3
*seq2=  
po5

Reply

Marsh Posté le 04-12-2017 à 09:25:35   

Reply

Marsh Posté le 04-12-2017 à 14:55:52    

Reply

Sujets relatifs:

Leave a Replay

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