Ir para conteúdo
Fórum Script Brasil
  • 0

Retirar Substring utilizando lista duplamente encadeada


Danicontieri

Pergunta

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

 

 

 

Editado por Danicontieri
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...