Olá pessoal. Sou nova em programação e estou tentando fazer o seguinte programa utilizando lista duplamente encadeada:
O usuário entrará com uma string de tamanho até N = 1023 e uma substring que poderá ter até o mesmo tamanho. E no final
terei que remover a substring da minha string principal todas as vezes que a mesma aparecer e imprimir a mesma com as
remoções e o número de remoções.
Exemplo de Entrada:
String :AGAGACTGACAAAGTCTGATAGAAGAGTGAC
Substring: AGA
Exemplo de Saída:
GACTGACAAAGTCTGATGTGAC
3
----------------------------------------------------------------------------------------------------------------
Porém o meu programa não remove a última ocorrência da Substring e não consigo entender o porquê.
Para a entrada do exemplo o resultado é: GACTGACAAAGTCTGATAGAGTGAC
Isso sempre ocorre quando preciso remover mais de duas vezes.
Agradeço desde já caso alguém possa me ajudar
aqui vai o código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1023
typedef struct dna dna;
typedef struct gerencia gerencia;
void imprimefila(gerencia *fila);
void inicializa(gerencia *fila);
int verifica( gerencia *fila);
void inserenafila(gerencia *fila, char cadeiabases);
void procura (gerencia *fila,char bases[],int tamanhobase);
void remover(gerencia *fila,dna *guardaprimeiro,dna *guardaultimo);
struct dna{
char caractere;
dna *proximo;
dna *anterior;
};
struct gerencia{
dna *primeiro;
dna *ultimo;
int tamanho;
int quantidaderemocao;
};
void inicializa(gerencia *fila)
{
fila->primeiro = NULL;
fila->ultimo = NULL;
fila->tamanho = 0;
fila->quantidaderemocao =0;
}
int verifica( gerencia *fila)
{
if(fila->primeiro == NULL) return 1;
else return 0;
}
void inserenafila(gerencia *fila, char cadeiabases)
{
dna *novocarac;
novocarac = (dna *) malloc(sizeof(dna));
novocarac->caractere = cadeiabases;
if(verifica(fila))
{
fila->primeiro = novocarac;
fila->ultimo = fila->primeiro;
novocarac->proximo =NULL;
novocarac->anterior =NULL;
fila->tamanho++;
}
else
{
novocarac->anterior = fila->ultimo;
fila->ultimo->proximo =novocarac;
fila->ultimo =novocarac;
novocarac->proximo = NULL;
fila->tamanho++;
}
}
void imprimefila(gerencia *fila)
{
dna *aux;
aux = fila->primeiro;
while(aux!= NULL)
{
printf("%c",aux->caractere);
aux=aux->proximo;
}
printf("\n%d",fila->quantidaderemocao);
} void procura (gerencia *fila,char bases[],int tamanhobase)
{
int i=0,d=0;
dna *aux, *guardaprimeiro,*guardaultimo;
aux= fila->primeiro;
while(aux!= NULL)
{
d=0;
i=0;
if(aux->caractere==bases) guardaprimeiro=aux; while(aux->caractere==bases&&aux!=NULL) {
guardaultimo = aux; aux=aux->proximo; i++; d++; if(d==tamanhobase) remover(fila,guardaprimeiro,guardaultimo);
}
aux=aux->proximo;
}
imprimefila(fila);
} void remover(gerencia *fila,dna *guardaprimeiro,dna *guardaultimo) { dna *aux; aux=fila->primeiro; fila->quantidaderemocao++;
if(guardaprimeiro == fila->primeiro) { fila->primeiro=guardaultimo->proximo; fila->primeiro->anterior =NULL; fila->quantidaderemocao++; } else { while(aux!=NULL) { if(aux==guardaprimeiro) { aux = aux->anterior; aux->proximo= guardaultimo->proximo;
} aux=aux->proximo; }
}
} int main() { gerencia fila; char cadeiabases[N] , bases[N]; int tamanhocadeia, tamanhobase,i;
scanf("%s %s",cadeiabases,bases); tamanhocadeia= strlen(cadeiabases); tamanhobase =strlen(bases);
inicializa(&fila); for(i=0;i<tamanhocadeia;i++) inserenafila(&fila,cadeiabases); if(tamanhocadeia<tamanhobase) imprimefila(&fila); else { procura(&fila,bases,tamanhobase); }
return 0; }