HELP ME!

Iniciado por edgemx, 12 Julio 2011, 06:30 AM

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

edgemx

hola, espero me puedan ayudar, me pasa algo bien raro, estoy aprendiendo a usar las listas.
mi problema aki es el sig.
tengo este código

libreria

/*********************
**********************
**                  **
**    stlist.h      **
**                  **
**********************
*********************/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//Definimos el tipo de dato a ingresarse en la lista
struct ElementoLista
{
  int valor;                        // -> Dato que guardara la lista
  struct ElementoLista *sig;             // -> Apuntador permitirá el acceso al próximo elemento
};
typedef struct ElementoLista _dato;

struct ListaIdentificar{
_dato *inicio;
_dato *fin;
int tamano;
};
typedef struct ListaIdentificar _lista;
//hacemos la funcion que inicializa la lista en NULL
void iniciaLista(_lista *LISTA)
{
    LISTA->inicio=NULL;
    LISTA->fin=NULL;
    LISTA->tamano=0;

}
//funcion para ingresar un 1° valor
/* inserción en una lista vacía */
_lista *ins_en_lista(_lista *lista,int dato)
{


  _dato *nuevo,*inicio_lista;
  _lista *apuntadorAux;
    nuevo=(_dato *) malloc(sizeof(_dato));
    nuevo->valor=dato;
    nuevo->sig=NULL;//printf("\nCreamos un nuevo _dato con valor: %d *sig: %s",nuevo->valor,nuevo->sig);
    if (nuevo!=NULL)
        {
            if(lista->inicio==NULL && lista->fin==NULL)
            {
                lista->inicio=nuevo;
                lista->fin=nuevo;
                lista->tamano=lista->tamano+1;
                //printf("\nVALORES DE LA LISTA [%d]",dato);
                //printf("\nInicio->valor: %d",lista->inicio->valor);
                //printf("\nInicio->*sig: %s",lista->inicio->sig);
                //printf("\nFin->valor: %d",lista->fin->valor);
                //printf("\nFin->*sig: %s",lista->fin->sig);
            }
            else
            {   inicio_lista=lista->inicio;
                apuntadorAux=lista;
                //printf("\n\nVALORES AUXILIARES iniciales DE LA LISTA [%d]",dato);
                //printf("\nInicio->valor: %d",apuntadorAux->inicio->valor);
                //printf("\nInicio->*sig: %s",apuntadorAux->inicio->sig);
                //printf("\nFin->valor: %d",apuntadorAux->fin->valor);
                //printf("\nFin->*sig: %s",apuntadorAux->fin->sig);
                while(apuntadorAux->inicio->sig!=NULL)
                {
                    apuntadorAux->inicio=apuntadorAux->inicio->sig;
                }
                apuntadorAux->inicio->sig=nuevo;
                apuntadorAux->inicio=inicio_lista;
                lista->fin=nuevo;
                lista->tamano++;
                //printf("\n\nVALORES AUXILIARES finales DE LA LISTA [%d]",dato);
                //printf("\nInicio->valor: %d",apuntadorAux->inicio->valor);
                //printf("\nInicio->*sig: %s",apuntadorAux->inicio->sig);
                //printf("\nFin->valor: %d",apuntadorAux->fin->valor);
                //printf("\nFin->*sig: %s",apuntadorAux->fin->sig);
            }
        }
    else
        {
            printf("!!!!!!!!!!NO HAY MEMORIA!!!!!!!!!");
        }
return lista;


}
void imprime_lista(_lista *lista)
{
    _dato *nodo;
    nodo=lista->inicio;
    printf("\ninicio-> ");
    while(nodo!=NULL)
    {
        printf("%d-> ",nodo->valor);
        nodo=nodo->sig;
    }
    printf("fin de la lista\n");
    printf("\nCARDINALIDAD: %d",lista->tamano);
}

int pertenencia(_lista *lista,int busca)
{
    /*printf("XXX");*/
     _lista *apuntador_aux;
        int regresa;
        apuntador_aux=lista;
        while(apuntador_aux->inicio->valor!=busca && apuntador_aux->inicio->sig!=NULL)
        {
            apuntador_aux->inicio=apuntador_aux->inicio->sig;
        }
        if(apuntador_aux->inicio->valor==busca)
        {
            regresa=1;
        }
        if(apuntador_aux->inicio->sig==NULL)
        {
            regresa=0;
        }
return regresa;
}



codigo

/*********************
**********************
**                  **
**   conjuntos.c    **
**                  **
**********************
*********************/
#include<string.h>
#include<stlist.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void main()
{
    _lista *lista_A;
   _lista *lista_B;
    int opc,dat,pert;
    iniciaLista(lista_A);
    do{
        opc=0;
        printf("\nIngresa valor 1° conjunto");
        fflush(stdout);
        scanf("%d",&dat);
        /************************************/
        ins_en_lista(lista_A,dat);
        printf("\nDeseas ingresar otro valor ingresa 1\n");
        scanf("%d",&opc);
    }while(opc==1);
    imprime_lista(lista_A);
    /*****************/pert=pertenencia(lista_A,dat);

    iniciaLista(lista_B);
    do{opc=0;
        printf("\nIngresa valor 2° conjunto");
        scanf("%d",&dat);
        ins_en_lista(lista_B,dat);
        printf("\nDeseas ingresar otro valor ingresa 1");
        scanf("%d",&opc);
    }while(opc==1);


imprime_lista(lista_B);

}



:-\ ok funciona perfecto... pero  mi bronka es que si pongo el sig. código ya no jala
(nececito hacer que no se repita un mismo valor en un conjunto, por lo cual mando llamar a pertenencia para que me indique si el elemento existe o no y asi poder )



        /************************************/pert=pertenencia(lista_A,dat);
        ins_en_lista(lista_A,dat);
        printf("\nDeseas ingresar otro valor ingresa 1\n");
        scanf("%d",&opc);
    }while(opc==1);
    imprime_lista(lista_A);
    /*****************/


CAMBIE pert=pertenencia(lista_A,dat);  de los asteriscos cortos al mas largo



espero me puedan explicar por que demonios pasa eso... por su atencion gracias

rir3760

El programa no va a ejecutarse correctamente debido a las dos variables para las listas de la función principal:
_lista *lista_A;
_lista *lista_B;

No tienen un valor inicial, al no tenerlo inician con un valor no definido.

El error se genera con el primer uso de esas variables, al aplicar indireccion (acceder al objeto apuntado) en la función "iniciaLista"
LISTA->inicio = NULL;
LISTA->fin = NULL;
LISTA->tamano = 0;


En tu programa no necesitas que esas dos variables sean punteros, solo debes declararlas de tipo "struct ListaIdentificar" y pasar su dirección a las funciones que lo requieran mediante el operador "dirección de" (el '&').

Aparte de eso el programa tiene algunas deficiencias como nombres de variables iniciando con el carácter '_' (eso esta reservado), definición de la funcion "main" (deberia ser "int main(void) ..." o bien "int main() ..."), uso de conio (no es necesario), etc.

Por ultimo la función "pertenencia" esta mal implementada, revisa con cuidado que pasa si el valor buscado existe y se encuentra en el ultimo nodo.

El programa con esas y otras correcciones es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct nodo {
   int valor;
   struct nodo *sig;
};

struct lista {
   struct nodo *inicio;
   struct nodo *fin;
   int num_elem;
};

void inicializar(struct lista *lista);
void insertar(struct lista *lista, int valor);
void imprimir(struct lista lista);
int buscar(struct nodo *p, int valor);

int main(void)
{
   struct lista lista;
   int opc;
   int valor;
   
   inicializar(&lista);
   
   do {
      printf("Ingresa valor a insertar en la lista: ");
      fflush (stdout);
      if (scanf("%d", &valor) != 1)
         return EXIT_FAILURE;
     
      if (!buscar(lista.inicio, valor))
         insertar(&lista, valor);
     
      puts("Ingresar otro valor? (1 ==> si)");
      if (scanf("%d", &opc) != 1)
         return EXIT_FAILURE;
   }while (opc == 1);
   
   imprimir(lista);
   /* Falta liberar la memoria utilizada */
   
   return EXIT_SUCCESS;
}

void inicializar(struct lista *lista)
{
   lista->inicio = NULL;
   lista->fin = NULL;
   lista->num_elem = 0;
}

void insertar(struct lista *lista, int valor)
{
   struct nodo *nuevo;
   struct nodo *p;
   
   nuevo = malloc(sizeof *nuevo);
   nuevo->valor = valor;
   nuevo->sig = NULL;
   
   if (nuevo != NULL){
      if (lista->inicio == NULL){
         lista->inicio = nuevo;
         lista->fin = nuevo;
         lista->num_elem = 1;
      }else {
         for (p = lista->inicio; p->sig != NULL; p = p->sig)
            ;
         
         p->sig = nuevo;
         lista->fin = nuevo;
         lista->num_elem++;
      }
   }else
      exit(EXIT_FAILURE);
}

void imprimir(struct lista lista)
{
   struct nodo *p;
   
   printf("Inicio-> ");
   for (p = lista.inicio; p != NULL; p = p->sig)
      printf("%d -> ", p->valor);
   puts("NULL");
   
   printf("Cardinalidad: %d\n", lista.num_elem);
}

int buscar(struct nodo *p, int valor)
{
   while (p != NULL && p->valor != valor)
      p = p->sig;
   
   return p != NULL; /* 1 == existe, 0 == no se encuentra */
}


Falta liberar la memoria utilizada por la lista y agregar la segunda, eso te toca a ti.

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