Problema con lista enlazada

Iniciado por Lain0x, 8 Julio 2011, 00:35 AM

0 Miembros y 1 Visitante están viendo este tema.

Lain0x

Hola, la verdad es que tengo problemas con la función buscar, probé mil formas pero no me resulta. Espero me puedan ayudar.


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct ElementoLista
{
        int *dato;
        struct ElementoLista *siguiente;
        }Elemento;
       
typedef struct ListaIdentificar
{
        Elemento *inicio;
        Elemento *fin;
        int tam;
        }Lista;
       
void inicializar(Lista *lista);
int insertalistavacia(Lista *lista, int *dato);
int insertalistainicio(Lista *lista, char *dato);
int inserta_final(Lista *lista, char *dato, Elemento *actual);
void visualizar(Lista *lista);
int sup_inicio (Lista * lista);
void buscar(Lista *lista, int dato);

int main()
{
    Lista lista;
    Elemento actual;
    inicializar(&lista);
    int d = 2;
    insertalistavacia(&lista, &d);
    buscar(&lista, d);
     
    visualizar(&lista);
    system("pause");
    return 0;
}

void inicializar(Lista *lista)
{
     lista->inicio=NULL;
     lista->fin=NULL;
     int tam=0;
}

int insertalistavacia(Lista *lista, int *dato)
{
    Elemento *nuevo_elemento;
    if((nuevo_elemento=(Elemento *)malloc(sizeof(Elemento)))==NULL)
    return -1;
    if((nuevo_elemento->dato=(int *)malloc(50*sizeof(int)))==NULL)
    return -1;
    nuevo_elemento->dato=dato;
    nuevo_elemento->siguiente=NULL;
    lista->inicio=nuevo_elemento;
    lista->fin=nuevo_elemento;
    lista->tam++;
    return 0;
}

int insertalistainicio(Lista *lista, int *dato)
{
     Elemento *nuevo_elemento;
     if((nuevo_elemento=(Elemento *)malloc(sizeof(Elemento)))==NULL)
     return -1;
     if((nuevo_elemento->dato=(int *)malloc(50*sizeof(int)))==NULL)
     return -1;
     nuevo_elemento->dato=dato;
     nuevo_elemento->siguiente=lista->inicio;
     lista->inicio=nuevo_elemento;
     lista->tam++;
     return 0;
}
   
int inserta_final(Lista *lista, int *dato, Elemento *actual)
{
    Elemento *nuevo_elemento;
    if((nuevo_elemento = (Elemento *)malloc(sizeof(Elemento)))==NULL)
    return -1;
    if((nuevo_elemento->dato = (int *)malloc(50*sizeof(int)))==NULL)
    return -1;
    nuevo_elemento->dato=dato;
    actual->siguiente = nuevo_elemento;
    nuevo_elemento->siguiente=NULL;
    lista->fin = nuevo_elemento;
    lista->tam++;
    return 0;
}

int sup_inicio (Lista *lista)
{
  if (lista->tam == 0)
    return -1;
  Elemento *sup_elemento;
  sup_elemento = lista->inicio;
  lista->inicio = lista->inicio->siguiente;
  if (lista->tam == 1)
    lista->fin = NULL;
  free (sup_elemento->dato);
  free (sup_elemento);
  lista->tam--;
  return 0;
}

void buscar(Lista *lista, int dato)
{
     
     Elemento *actual;
     actual = lista->inicio;
     
     while(actual!=NULL)
     {
         if(dato==actual)
         {
             sup_inicio (&lista);
         }
         else
         {
             actual = actual->siguiente;
         }
     }
}

void visualizar(Lista *lista)
{
     Elemento *actual;
     actual = lista->inicio;
     while(actual!=NULL)
     {
        printf("%s\n", actual->dato);
        actual = actual->siguiente;
     }
}   
                                         


rir3760

Lo primero que debes aclarar de una forma precisa es el objetivo de la funcion, si bien esta se llama "buscar" la operacion que realiza (de forma incorrecta) es "eliminar el primero".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Valkyr

Esta comparación:

Código (cpp) [Seleccionar]

if(dato==actual)
         {
             sup_inicio (&lista);
         }


¿No debería ser:

Código (cpp) [Seleccionar]

if(dato == actual->dato)...
?

Porque actual es un Elemento y tienes que acceder a "dato" de Elemento.