[ Foro de C ]
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;
}
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;
}
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.)