axelle3003 | 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 :
- typedef struct Tocc
- {
- int posOcc;
- //double* tableResultPSSM;
- struct Tocc *nxt;
- }Tocc;
- typedef Tocc* llistOcc;
- typedef struct Tseq
- {
- int numSeq;
- struct Tocc *pllistOcc;
- struct Tseq *nxt;
- }Tseq;
- typedef Tseq* llistSeq;
- typedef struct Tkmer
- {
- char* seqKmer;
- struct Tseq *pllistSeq;
- struct Tkmer *nxt;
- }Tkmer;
- typedef Tkmer* llistKmer;
|
Et voici les fonctions qui me permettent d'implémenter mes structures:
Code :
- int kmerControl(llistKmer listeKmer, char* seqKmer)
- {
- Tkmer* tmp=listeKmer;
- int existKmer=0;
- while(tmp!=NULL && existKmer!=1){
- if(strcmp(tmp->seqKmer, seqKmer)==0){
- existKmer=1;
- return existKmer;
- }
- tmp=tmp->nxt;
- }
- return existKmer;
- };
- llistOcc AjouterEnFinOcc(llistOcc listeOcc, int posOcc)
- {
- Tocc* nouvelTocc =(Tocc*)malloc(sizeof(Tocc));
- nouvelTocc->posOcc = posOcc;
- nouvelTocc->nxt = listeOcc;
- /*if(listeOcc == NULL)
- {
- return nouvelTocc;
- }else{
- Tocc *tmp=listeOcc;
- while(tmp->nxt != NULL)
- {
- tmp = tmp->nxt;
- }
- tmp->nxt = nouvelTocc;*/
- //afficherListeOcc(listeOcc);
- return nouvelTocc;
- };
- llistSeq AjouterEnTeteSeq(llistSeq listeSeq, int numSeq, int posOcc)
- {
- Tseq* nouvelTseq = (Tseq*)malloc(sizeof(Tseq));
- nouvelTseq->numSeq=numSeq;
- nouvelTseq->pllistOcc=(Tocc*)malloc(sizeof(Tocc));
- //nouvelTseq->pllistOcc=NULL;
- nouvelTseq->pllistOcc=AjouterEnFinOcc(nouvelTseq->pllistOcc, posOcc);
- nouvelTseq->nxt = listeSeq;
- return nouvelTseq;
- };
- llistKmer ajouterKmer(int existKmer, llistKmer listKmer,char* seqKmer, int numSeq, int posOcc)
- {
- int existSeq=0;
- if (existKmer == 0){
- printf("Kmer n'existe pas\n" );
- Tkmer* nouvelTkmer = (Tkmer*)malloc(sizeof(Tkmer));
- nouvelTkmer->seqKmer=(char*)malloc(sizeof(char));
- strcpy(nouvelTkmer->seqKmer, seqKmer);
- nouvelTkmer->pllistSeq=(Tseq*)malloc(sizeof(Tseq));
- //nouvelTkmer->pllistSeq = NULL;
- nouvelTkmer->pllistSeq = AjouterEnTeteSeq(nouvelTkmer->pllistSeq, numSeq, posOcc);
- nouvelTkmer->nxt = listKmer;
- return nouvelTkmer;
- }else{//Kmer existe déjà mais existe - il pour la séq donnée ?
- while(listKmer != NULL)
- {
- if (strcmp(listKmer->seqKmer, seqKmer) == 0){
- llistSeq tmpSeq=listKmer->pllistSeq;
- while (tmpSeq != NULL){
- if (tmpSeq->numSeq == numSeq && existSeq==0){
- existSeq=1;
- //Seq existe mais pas posOcc donc ajout posOcc
- printf("Kmer %s et Seq %d existent \n", listKmer->seqKmer, tmpSeq->numSeq);
- tmpSeq->pllistOcc=AjouterEnFinOcc(tmpSeq->pllistOcc, posOcc);
- listKmer->pllistSeq=tmpSeq;
- return listKmer;
- }
- tmpSeq=tmpSeq->nxt;
- }
- }
- listKmer=listKmer->nxt;
- }
- if (existSeq==0){
- while(listKmer != NULL){
- if (strcmp(listKmer->seqKmer, seqKmer) == 0){
- printf("Kmer exist mais pas seq\n" );
- //listKmer->pllistSeq=(Tseq*)malloc(sizeof(Tseq));
- //listKmer->pllistSeq=NULL;
- listKmer->pllistSeq=AjouterEnTeteSeq(listKmer->pllistSeq, numSeq,posOcc);
- return listKmer;
- }
- listKmer=listKmer->nxt;
- }
- }
- }
- return listKmer;
- };
- void afficherListes(llistKmer listeKmer)
- {
- Tkmer* tmp = listeKmer;
- while(tmp != NULL)
- {
- printf("\n\n==== Kmer = %s\n", tmp->seqKmer);
- Tseq* ptrSeq=tmp->pllistSeq;
- while(ptrSeq != NULL)
- {
- printf("*Seq %d =\n", ptrSeq->numSeq);
- Tocc* ptrOcc=ptrSeq->pllistOcc;
- while(ptrOcc != NULL)
- {
- printf(" pos %d, ", ptrOcc->posOcc);
- ptrOcc=ptrOcc->nxt;
- }
- ptrSeq=ptrSeq->nxt;
- }
- tmp = tmp->nxt;
- }
- };
|
Et enfin la partie du main qui fait appel aux fonctions d'implémentation :
Code :
- llistKmer listKmer=(Tkmer*)malloc(sizeof(Tkmer));
- listKmer=NULL;
- char* temp1=(char*)malloc(sizeof(char)*(longseq));
- char* seqOcc;
- char* seqKmer;
- int* masque;
- masque=(int*)malloc(sizeof(int)*kfen);
- GenererMasque(masque,longMotif, kfen);
- int x =masque[0];
- int y =masque[1];
- printf("Pos masque %d, %d\n", x,y);
- for(int ns=0; ns<nSeq; ns++)
- {
- seqOcc = (char*)malloc(sizeof(char)*(longMotif + 1));
- memset(seqOcc, '0',longMotif);
- seqOcc[longMotif]='\0';
- seqKmer = (char*)malloc(sizeof(char)*(kfen+1));
- memset(seqKmer, '0',kfen);
- seqKmer[kfen]='\0';
- temp1=matSeq[ns];
- printf("\n\n----SEQUENCE = %s\n",temp1);
- for ( int posOcc = 0; posOcc <(longseq-longMotif+1); posOcc++)
- {
- int pos1=posOcc+x;
- int pos2=posOcc+y;
- if (pos1<pos2)
- {//Pour avoir le kmer dans le bon ordre
- seqKmer[0]=temp1[pos1];
- seqKmer[1]=temp1[pos2];
- } else {
- seqKmer[0]=temp1[pos2];
- seqKmer[1]=temp1[pos1];
- }
- printf("KMER = %s\n", seqKmer);
- for (int i = 0; i< longMotif; i++) {
- seqOcc[i]=temp1[posOcc+i];
- }
- printf("PosOcc %d = %s\n",posOcc,seqOcc);
- int existKmer=0;
- //Implémentation dans les structures de la seqKmer, de la numeroseq ns et de la position Occurrence à partir de la liste Kmer.
- existKmer=kmerControl(listKmer, seqKmer);
- listKmer=ajouterKmer(existKmer, listKmer, seqKmer, ns, posOcc);
- }
- printf("\n----Affichage Listes----\n\n" );
- afficherListes(listKmer);
- printf("\n" );
- }
- printf("\n----Affichage Listes----\n\n" );
- afficherListes(listKmer);
- 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 |