I am not able to develop a function inside my code that removes the duplicate values within a double-chained list, could you help me?
Here is the code I have done so far, the function I need to fix is retiraValor
:
#include <stdio.h>
#include <stdlib.h>
typedef struct lista {
float valor;
struct lista* anterior;
struct lista* proximo;
} Lista;
/* Criar uma lista vazia */
Lista* criarLista(){
return NULL;
}
/* Insere no inicio da lista*/
Lista* inserirNaLista(Lista* list, float valor){
Lista* novo = (Lista*) malloc(sizeof(Lista));
novo->valor = valor;
if (!list){
novo->anterior = NULL;
novo->proximo = NULL;
}
else {
novo->anterior = NULL;
novo->proximo = list;
list->anterior=novo;
}
return novo;
}
/* Imprime na tela os valores*/
void imprimirLista(Lista* lista){
Lista* proximaLista;
for (proximaLista=lista; proximaLista!=NULL; proximaLista = proximaLista->proximo){
printf("\nO valor da lista e: %.2f", proximaLista->valor);
}
}
/* Busca um determinado valor na pilha*/
Lista* buscarNo(Lista* list, float valor){
Lista* proximaLista;
for(proximaLista = list; proximaLista != NULL; proximaLista = proximaLista->proximo){
if (proximaLista->valor == valor){
return proximaLista;
}
}
}
Lista* retornaTopo(Lista* list){
Lista* temp = list->anterior;
if (temp->anterior != NULL){
return retornaTopo(temp);
}
else{
return temp;
}
}
/* Retira um nó conforme o valor informado*/
Lista* retirarNo(Lista* list, float valor){
/*Ponteiro para o n? anterior*/
Lista* anteriorLista;
anteriorLista = criarLista();
/*Ponteiro para percorrer a lista*/
Lista* proximaLista;
proximaLista = criarLista();
proximaLista = list;
while (proximaLista != NULL && proximaLista->valor != valor){
anteriorLista = proximaLista;
proximaLista = proximaLista->proximo;
}
// Nao achamos o valor
if (proximaLista == NULL){
return list;
}
if (anteriorLista == NULL){
list = proximaLista->proximo;
proximaLista->proximo->anterior = NULL;
}
else{
if (proximaLista->proximo == NULL){
anteriorLista->proximo = NULL;
if (anteriorLista->anterior != NULL){
anteriorLista = retornaTopo(anteriorLista);
}
return anteriorLista;
}
else{
anteriorLista->proximo = proximaLista->proximo;
if (anteriorLista->anterior != NULL){
anteriorLista = retornaTopo(anteriorLista);
}
return anteriorLista;
}
}
}
//ESSA EH A FUNCAO QUE NAO ESTOU CONSEGUINDO DESENVOLVER
void retiraValor(Lista* lista){
Lista* proximaLista;
float numero = proximaLista->valor;
for(proximaLista = lista; proximaLista != NULL; proximaLista = proximaLista->proximo){
if (proximaLista->valor == numero){
retirarNo(proximaLista, numero);
}
}
}
int main(int argc, char *argv[]) {
Lista *lista;
lista = criarLista();
Lista *lista2;
lista2 = lista;
lista = inserirNaLista(lista, 6);
lista = inserirNaLista(lista, 10);
lista = inserirNaLista(lista, 7.25);
lista = inserirNaLista(lista, 5);
lista = inserirNaLista(lista, 10);
lista = inserirNaLista(lista, 23);
imprimirLista(lista);
printf("\n\n");
Lista* retira_n(lista2);
imprimirLista(lista2);
return 0;
}