elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Eliminar todos los repetidos de una lista
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Eliminar todos los repetidos de una lista  (Leído 4,698 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Eliminar todos los repetidos de una lista
« en: 20 Junio 2020, 17:37 pm »

Buenos Dias.
Queria consultar como podia hacer para eliminar todos los elementos repetidos de una lista.
En este caso lo que hice fue crear una lista que contenga a una estructura y lo que tengo que hacer es que elimine todos los nodos cuyo apellido sea "Lopez".
Lo intento hacer y elimina algunos elementos pero no todos,  el problema esta en la función eliminar pero no se como modificarla para que elimine todos y no algunos.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct s_datos
  4. {
  5.    char*nombre;
  6.    char*apellido;
  7.    int dni;
  8. };
  9. typedef struct s_datos t_dato;
  10. struct s_nodo
  11. {
  12.    t_dato dato;
  13.    struct s_nodo*sig;
  14. };
  15. typedef struct s_nodo*t_nodo;
  16. void agregar(t_nodo*,t_dato);
  17. void imprimir(t_nodo);
  18. void eliminar(t_nodo*,char*);
  19. t_dato cargarstruct();
  20. char*cargatexto();
  21. int main()
  22. {
  23.    t_nodo lista=NULL;
  24.    agregar(&lista,cargarstruct());
  25.    agregar(&lista,cargarstruct());
  26.    agregar(&lista,cargarstruct());
  27.    agregar(&lista,cargarstruct());
  28.    agregar(&lista,cargarstruct());
  29.    imprimir(lista);
  30.    eliminar(&lista,"Lopez");
  31.    printf("\nLista con eliminados\n");
  32.    imprimir(lista);
  33.  
  34.    return 0;
  35. }
  36. t_dato cargarstruct()
  37. {
  38.    t_dato datito;
  39.    ///CARGAR ESTRUCTURA
  40.    printf("\nIngrese Nombre:\n");
  41.    datito.nombre=cargatexto();
  42.    printf("\nIngrese Apellido:\n");
  43.    datito.apellido=cargatexto();
  44.    printf("\nIngrese DNI:\n");
  45.    scanf("%d",&datito.dni);
  46.    return datito;
  47. }
  48. void agregar(t_nodo*nodo,t_dato datito)
  49. {
  50.    if(*nodo==NULL)
  51.    {
  52.        *nodo=(t_nodo)malloc (sizeof(struct s_nodo));
  53.        (*nodo)->dato=datito;
  54.        (*nodo)->sig=NULL;
  55.    }
  56.    else
  57.    {
  58.        agregar(&(*nodo)->sig,datito);
  59.    }
  60. }
  61. void imprimir(t_nodo lista)
  62. {
  63.    if(lista!=NULL)
  64.    {
  65.        printf("\nNombre: %s - Apellido: %s - DNI: %d",lista->dato.nombre,lista->dato.apellido,lista->dato.dni);
  66.        imprimir(lista->sig);
  67.    }
  68. }
  69. void eliminar(t_nodo*nodo,char*texto)
  70. {
  71.    t_nodo aux=NULL;
  72.    if(*nodo==NULL)
  73.    {
  74.        return;
  75.    }
  76.    else if((strcmp((*nodo)->dato.apellido,texto))==0)
  77.    {
  78.        aux=(*nodo);
  79.        *nodo=(*nodo)->sig;
  80.        free(aux);
  81.        eliminar(&(*nodo)->sig,texto);
  82.    }
  83.    else
  84.    {
  85.          eliminar(&(*nodo)->sig,texto);
  86.    }
  87. }
  88. char*cargatexto()
  89. {
  90.    char letra;
  91.    int i=0;
  92.    char*txt=NULL;
  93.    txt=malloc(sizeof(char));
  94.    letra=getche();
  95.    while(letra!='\r')
  96.    {
  97.        *(txt+i)=letra;
  98.        i++;
  99.        txt=realloc(txt,(i+1)*sizeof(char));
  100.        letra=getche();
  101.    }
  102.    *(txt+i)='\0';
  103.    return txt;
  104.  
  105. }

Muchas gracias.


En línea

Mecanma

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Eliminar todos los repetidos de una lista
« Respuesta #1 en: 28 Junio 2020, 09:56 am »

Hola, creo que deberías hacer la comparación fuera de la función así solo se encarga de borrar el nodo. También veo que en la linea 81 y 85 llamas la función de manera recursiva, no sé si tu profesor te lo pidió explicitamente de esta forma.


En línea

98Fran

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Eliminar todos los repetidos de una lista
« Respuesta #2 en: 3 Julio 2020, 12:25 pm »

No se de C pero puede que la nomenclatura en punteros sea la misma que en C++ asíi que por si acaso te dejo aquí unos consejos (si funcionan en C xD).

Primero: Yo usaría más los espacios, cuesta de leer el código:
Código:
char *nombre;
//o
char* nombre;

Se leen mejor que:
Código:
char*nombre;

y eso se aplicaría para las funciones o cualquier declaración con punteros.

Segundo: para hacer typedef de struct(al menos en C++) no hace falta poner struct
Código:
char *nombre
//o
char* nombre

Tercero: Cuando pasas un t_nodo estas pasando el puntero del nodo, por tanto no hace falta que lo desreferencies para luego pasar la dirección de memoria en el main y lo mismo. Si lo declaras asi:
Código:
void agregar(t_nodo &, t_dato);

Te evitas poner & en el main y queda más fácil de leer.

Cuarto: Por lo que he visto, podrías usar un puntero fin para evitar el coste de O(n) que supone recorrer toda la lista. Como no hay clases en C podrias crear una struct extra:
Código:
struct s_nodo_ini
{
    t_dato dato;
    struct s_nodo*sig;
    struct s_nodo *fin;
}
para el nodo cabeza y cuando añades un nodo al fin lo haces desde fin y luego actualizas el nodo fin y si quieres recorrer toda la lista lo haces desde el nodo sig.



En cuestión a tu problema: usa el nodo aux para moverte, no hace falta usar recursividad de forma innecesaria. 

Código:
void eliminar(t_nodo*nodo,char*texto)
{
    t_nodo aux= &nodo; //siendo nodo la cabeza/inicio

    while(aux != NULL) //recorres todo la lista
    {
        //Aqui haces la comprobación y en caso positivo lo eliminas
         
        aux = aux->sig; //no se si se escribe asi en C pero el concepto es el mismo
    }
}
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Eliminar elementos repetidos de un vector
Programación General
GaLaN GaLaNaSo 3000 2 62,999 Último mensaje 16 Noviembre 2011, 06:44 am
por osolmm
Eliminar Caracteres Repetidos « 1 2 »
.NET (C#, VB.NET, ASP)
birdez 11 16,439 Último mensaje 31 Mayo 2012, 18:21 pm
por birdez
Eliminar duplicados o repetidos « 1 2 »
.NET (C#, VB.NET, ASP)
luis456 15 11,352 Último mensaje 1 Mayo 2015, 19:36 pm
por luis456
Eliminar elementos repetidos en un Array
.NET (C#, VB.NET, ASP)
okik 2 9,403 Último mensaje 23 Junio 2015, 03:16 am
por Eleкtro
eliminar números repetidos de dos vectores
Programación C/C++
creiko 4 3,313 Último mensaje 15 Abril 2016, 20:05 pm
por HardForo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines