[ Foro de C ]

listas con encabezado

16-May-2014 06:28
Invitado (Diego)
2 Respuestas

Hola! es la primera vez que tengo una duda con un programa y no puedo resolverla D:, ohjala me puedna ayudar.
AL imprimir un animal, imprime desde el segundo, y al eliminar, elimina el que quiere, ¿estan mal mis apuntadores?, ojala me puedan ayudar, de antemano gracias


//SUPRIMir
void suprimir(posicion p){
     animal *aux;

    if(p==NULL)
        printf("Elemento no encontrado\n");
     else{
        aux=p->sig->sig;
        delete(p->sig);
        p->sig=aux;
     }

}



//LOCALIZA
posicion localiza(inicio L){
     char x[30];
     printf("a quien busca");
     fflush(stdin);
     gets(x);
	 animal *q;
	 q=L->next;
	 while (q->sig!=NULL && (!strcmp(q->sig->dat.NombreAnimal,x)))
			 q=q->sig;
	 if (q->sig==NULL)
		 return NULL;
	 else
		 return q;
}


void imprimir (inicio L){
		animal *p;

		p=L->next;
		while (p->sig!=NULL)
		{
		 printf("Animal ");puts(p->dat.NombreAnimal);
         printf("\npropietario ");puts(p->dat.nombreprop);
         printf("\ndomocilio ");puts(p->dat.dom);
         printf("\ntelefono ");puts(p->dat.tel);
         printf("\nraza ");puts(p->dat.raza);
         printf("\nedad %d",p->dat.edad);
         printf("\nespecificaciones ");puts(p->dat.especificaciones);
		 p=p->sig;
		}
}

void menu(inicio Q)
{
    int op;

//clrscr();
printf ("\n");
printf ("1-Dar de alta.....\n");
printf ("2-Dar de baja.....\n");
printf ("3-Modificar....\n\n");
printf ("4-Imprimir.....\n");
printf ("5-consultar\n");
printf ("6 regresar.......\n");
scanf ("%d", &op);
switch(op){
	case 1:
           insertaanimal(Q);
		break;
	case 2:
            suprimir(localiza(Q));
		break;
	case 3:

    break;
	case 4:imprimir(Q);

		//getch();
		break;

	case 5: localiza(Q);

		break;
	case 6:

                break;
	default:
		printf("Opcion No Valida");



}
system("pause");
system("cls");
}



int main()
{
inicio perro, gato, hamster;
int opc;


do{
//clrscr();
printf ("...........Menu............\n");
printf ("1-Inicia perro.....\n");
printf ("2-Inicia gato.....\n");
printf ("3-Inicia hamster....\n\n\n");
printf ("4-Menu perro.....\n");
printf ("5-Menu gato\n");
printf ("6-Menu hamster.......\n\n\n");
printf ("7-Imprimir todo\n");
printf ("8-Salir.......\n");
printf ("Elige una opcion:....\n");
scanf ("%d", &opc);
switch(opc){
	case 1:
            inicializa(&perro);
		break;
	case 2:
            inicializa(&gato);
		break;
	case 3:
            inicializa(&hamster);
	case 4:menu(perro);

		break;

	case 5:
            menu(gato);

		break;
	case 6:
            menu(hamster);

        break;
	default:
		printf("Opcion No Valida");
}
} while(opc!=8);
return 0;
}



16-May-2014 09:26
Invitado (Diego)

No se copeo todo el codigo, aqui esta


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

struct animal{
       struct datos{
           char NombreAnimal[25], nombreprop[25], dom[25], tel[15+1];
           int edad;
           char raza[20];
           char especificaciones[100+1];

                }dat;
       animal*sig;

};

struct encabezado
{
    char describe[101], comenta[50+1];
    int numelements;
    animal*next;
};


typedef animal *posicion;
typedef encabezado *inicio;
typedef int logico;



//generica
void inicializa(inicio *L){
	*L=new encabezado ;
	(*L)->next=NULL;
	(*L)->numelements=0;
	(*L)->next=NULL;

	printf("ingrese descripcion");
	fflush(stdin);
	gets ((*L)->describe);
    printf("ingrese comentarios");
    fflush(stdin);
    gets ((*L)->comenta);


}


//perros
void insertaanimal( inicio L){
      animal *aux;
      animal *p;
      p=L->next;
      aux=new animal;
      printf("propietario\n");
      fflush(stdin);
      gets(aux->dat.nombreprop);

      printf("perro\n");
      gets(aux->dat.NombreAnimal);
      fflush(stdin);
      printf("Domicilio\n");
      gets(aux->dat.dom);
      fflush(stdin);
      printf("Telefono\n");
      gets(aux->dat.tel);
      fflush(stdin);
      printf("Raza\n");
      gets(aux->dat.raza);
      fflush(stdin);
      printf("edad\n");
      scanf("%d",&aux->dat.edad);
      printf("especificaciones (max 100)\n");
      fflush(stdin);
      gets(aux->dat.especificaciones);
      if(L->next==NULL)
      L->next=aux;
      else
      {
     aux->sig=p;
     L->next=aux;



      }
      }

//FUNCION VACIA GENERICA
logico vacia(inicio p){

	 if (p->next==NULL)
		 return 1;
	 else
		 return 0;
}

//FUNCION SUPRIMir
void suprimir(posicion p){
     animal *aux;

    if(p==NULL)
        printf("Elemento no encontrado\n");
     else{
        aux=p->sig->sig;
        delete(p->sig);
        p->sig=aux;
     }

}



//LOCALIZA
posicion localiza(inicio L){
     char x[30];
     printf("a quien busca");
     fflush(stdin);
     gets(x);
	 animal *q;
	 q=L->next;
	 while (q->sig!=NULL && (!strcmp(q->sig->dat.NombreAnimal,x)))
			 q=q->sig;
	 if (q->sig==NULL)
		 return NULL;
	 else
		 return q;
}


void imprimir (inicio L){
		animal *p;

		p=L->next;
		while (p->sig!=NULL)
		{
		 printf("Animal ");puts(p->dat.NombreAnimal);
         printf("\npropietario ");puts(p->dat.nombreprop);
         printf("\ndomocilio ");puts(p->dat.dom);
         printf("\ntelefono ");puts(p->dat.tel);
         printf("\nraza ");puts(p->dat.raza);
         printf("\nedad %d",p->dat.edad);
         printf("\nespecificaciones ");puts(p->dat.especificaciones);
		 p=p->sig;
		}
}

void menu(inicio Q)
{
    int op;

//clrscr();
printf ("\n");
printf ("1-Dar de alta.....\n");
printf ("2-Dar de baja.....\n");
printf ("3-Modificar....\n\n");
printf ("4-Imprimir.....\n");
printf ("5-consultar\n");
printf ("6 regresar.......\n");
scanf ("%d", &op);
switch(op){
	case 1:
           insertaanimal(Q);
		break;
	case 2:
            suprimir(localiza(Q));
		break;
	case 3:

    break;
	case 4:imprimir(Q);

		//getch();
		break;

	case 5: localiza(Q);

		break;
	case 6:

                break;
	default:
		printf("Opcion No Valida");



}
system("pause");
system("cls");
}



int main()
{
inicio perro, gato, hamster;
int opc;


do{
//clrscr();
printf ("...........Menu............\n");
printf ("1-Inicia perro.....\n");
printf ("2-Inicia gato.....\n");
printf ("3-Inicia hamster....\n\n\n");
printf ("4-Menu perro.....\n");
printf ("5-Menu gato\n");
printf ("6-Menu hamster.......\n\n\n");
printf ("7-Imprimir todo\n");
printf ("8-Salir.......\n");
printf ("Elige una opcion:....\n");
scanf ("%d", &opc);
switch(opc){
	case 1:
            inicializa(&perro);
		break;
	case 2:
            inicializa(&gato);
		break;
	case 3:
            inicializa(&hamster);
	case 4:menu(perro);

		break;

	case 5:
            menu(gato);

		break;
	case 6:
            menu(hamster);

        break;
	default:
		printf("Opcion No Valida");
}
} while(opc!=8);
return 0;
}



17-May-2014 18:22
Nacho Cabanes (+83)

Hay algunos fallos menores, como que unas veces usas "fflush" (que es una solución poco portable) antes de los gets (el sitio en el que es más fácil que funcione) y otras veces después.

Es un poco más peligroso que al insertar datos no pones a NULL el puntero del siguiente, de modo que el sistema puede creer que existen más datos en direcciones de memoria falsas, y funciones como el "localiza" pueden hacer cualquier cosa.

Lo de que te muestre a partir del segundo es fácil, porque lo primero que hace "imprimir" es "p=L->next;".

A la hora de eliminar, no entiendo por qué le dices que elimine "p" pero luego haces "delete(p->sig);" y borras el siguiente.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)