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; }