Danicontieri Postado Abril 12, 2017 Denunciar Share Postado Abril 12, 2017 (editado) 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 Abril 12, 2017 por Danicontieri Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Danicontieri
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;
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.