[ Foro de C++ ]

me gustaria que me ayudaran con este codigo, quisiera que no se repitieran los numeros de la lista, cuando ingrese uno que ya existe marque error y me regrese al menu

08-Apr-2020 03:40
daniel rochez salgado
1 Respuestas

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <conio.h>
#include <string.h>
struct dato{
   char num[100];
   int matricula;
   int edad;
   float promedio;
   int sexo;
   struct dato *sig; //puntero a la siguiente entrada
   struct dato *ante; //puntero al registro anterior
}alumno;
struct dato *raizd; //puntero a la primera entrada de la lista
struct dato *ulti_dato; //puntero a la ultima entrada de la lista
struct dato *buscar(char *); //puntero a una funcion

void intro(void),buscar(void);
void listar(void);
void borrar(struct dato **,struct dato **);
void insertar(struct dato *i,struct dato **raizd, struct dato **ulti_dato);
void mostrar(struct dato *);
int menu (void);

main(){
raizd=ulti_dato=NULL; //inicializar los punteros
   char OP;
   do{
   menu();
       OP=toupper (getch ());
       switch (OP){
           case '1':intro();break;
       case '2':borrar(&raizd,&ulti_dato);break;
       case '3':listar();getch();break;
       }
   }while (OP!=27);
}

//seleccionar una operacion
int menu(void){
   printf("\n1. Insertar un numero\n");
   printf("2. Borrar un numero\n");
   printf("3. Ver lista completa\n");
   printf("4. Buscar Numero\n");
   printf("\nopc: ");
}

//introducir elementos
void intro(void){
struct dato *p;
p=(struct dato *)malloc (sizeof(alumno)); //new(alumno)
fflush(stdin);
   printf("\nintroduzca numero: "); gets(p->num);
   printf("introduzca matricula: ");scanf(" %d",&p->matricula);
   printf("introduzca edad: ");scanf(" %d",&p->edad);
   printf("introduzca promedio: ");scanf(" %f",&p->promedio);
   printf("hombre(1), mujer(0): ");scanf(" %d",&p->sexo);
   insertar(p,&raizd,&ulti_dato);
}

//crea una lista doblemente enlazada ordenadamente
void insertar(struct dato *i,/*nuevo elemento*/struct dato **raizd,/*primer elemento de la lista*/struct dato **ulti_dato /*ultimo elemento de la lista*/){
struct dato *ant,*p;
if(*ulti_dato==NULL){  //primer elemento de la lista
       i->sig=NULL;
       i->ante=NULL;
       *ulti_dato=i;
       *raizd=i;
       return;
   }
p=*raizd; //principio de la lista
   ant=NULL;
   while (p){
       if(strcmp(p->num,i->num)<=0){
           ant=p;
           p=p->sig;
       }
       else
           if(p->ante){
               p->ante=i;
               i->sig=p;
               i->ante=ant; //p->ante;
               ant->sig=i; //p->ante=i;
               return;
           }else
i->sig=p; //nuevo primer elemento
           i->ante=NULL;
           p->ante=i;
           *raizd=i;
           return;*/
       }
   
   ant->sig=i; //ponerlo en el ulti_dato
   i->sig=NULL;
   i->ante=ant;
   *ulti_dato=i;
   return;
}

//elimina un elemento de la lista
void borrar(struct dato **raizd, struct dato **ulti_dato){
   struct dato *p, *buscar(char *num);
   char s[80];
   fflush(stdin);
   printf("\nintroduzca numero: ");
   gets(s);
   p=buscar(s);
   if(p){
   if(*raizd==p){
           *raizd=p->sig;
           if (*raizd)
               (*raizd)->ante=NULL;
           else
               *ulti_dato=NULL;
       }
       else{
           p->ante->sig=p->sig;
           if (p!=*ulti_dato)
               p->sig->ante= p->ante;
           else
               *ulti_dato=p->ante;
       }
       free(p); //devolver memoria al sistema
       printf("elemento borrado\n");
   }
}

//buscar una direccion
struct dato *buscar(char *num){
   struct dato *p;
   p=raizd;
   while(p){
       if(!strcmp(num,p->num))
       return p;
       p=p->sig; //obtener siguiente direccion
   }
   printf("numero no encontrado\n");
   return NULL; //no encontrado
}

//mostrar la lista entera
void listar(void){
struct dato *p;
p=raizd;
if (!p){
       printf("\n Lista Vacía\n");
       return;
   }
    printf("     \nContenido de la lista\n");
   printf("numero  matricula  edad  promedio  sexo");
   while(p){
       mostrar(p);
       p=p->sig; //obtener siguiente direccion
   }
   printf("\n Fin de Lista\n");
}

//esta funcion imprime realmente los campos de cada direccion
void mostrar(struct dato *p){
   printf("\n  %s ",p->num);
   printf("    %d ",p->matricula);
   printf("   %d ",p->edad);
   printf("    %.1f ",p->promedio);
   printf("     %d ",p->sexo);
}


08-Apr-2020 03:46
daniel rochez salgado



#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <conio.h>
#include <string.h> 
struct dato{
    char num[5];
    int matricula;
    int edad;
    float promedio;
    int sexo;
    struct dato *sig; //puntero a la siguiente entrada
    struct dato *ante; //puntero al registro anterior
}alumno;
struct dato *raizd; //puntero a la primera entrada de la lista
struct dato *ulti_dato; //puntero a la ultima entrada de la lista
struct dato *buscar(char *); //puntero a una funcion
 
void intro(void),buscar(void);
void listar(void);
void borrar(struct dato **,struct dato **);
void insertar(struct dato *i,struct dato **raizd, struct dato **ulti_dato);
void mostrar(struct dato *);
int menu (void);
 
main(){
	raizd=ulti_dato=NULL; //inicializar los punteros
    char OP;
    do{ 
	    menu();
        OP=toupper (getch ());
        switch (OP){
            case '1':intro();break;
	        case '2':borrar(&raizd,&ulti_dato);break;
	        case '3':listar();getch();break;
	        case '4':buscar();getch();break; //encuentra un nombre
        }
    }while (OP!=27);
}
 
//seleccionar una operacion
int menu(void){
    printf("\n1. introducir un nombre\n");
    printf("2. borrar un nombre\n");
    printf("3. listar el archivo\n");
    printf("4. buscar\n");
    printf("\nopc: ");
}

//introducir elementos
void intro(void){
	struct dato *p;
	p=(struct dato *)malloc (sizeof(alumno)); //new(alumno)
	fflush(stdin);
    printf("\nintroduzca numero: "); gets(p->num);
    printf("introduzca matricula: ");scanf(" %d",&p->matricula);
    printf("introduzca edad: ");scanf(" %d",&p->edad);
    printf("introduzca promedio: ");scanf(" %f",&p->promedio);
    printf("hombre(1), mujer(0): ");scanf(" %d",&p->sexo);
    insertar(p,&raizd,&ulti_dato);
}

//crea una lista doblemente enlazada ordenadamente 
void insertar(struct dato *i,/*nuevo elemento*/struct dato **raizd,/*primer elemento de la lista*/struct dato **ulti_dato /*ultimo elemento de la lista*/){
	struct dato *ant,*p;
    if (*ulti_dato==NULL){  //primer elemento de la lista
        i->sig=NULL;
        i->ante=NULL;
        *ulti_dato=i;
        *raizd=i;
        return;
    }
    p=*raizd; //principio de la lista
    ant=NULL;
    while (p){
        if(strcmp(p->num,i->num)<=0){
            ant=p;
            p=p->sig;
        }
        else{
            if(p->ante){
                p->ante=i;
                i->sig=p;
                i->ante=ant; //p->ante;
                ant->sig=i; //p->ante=i;
                return;
            }
            i->sig=p; //nuevo primer elemento
            i->ante=NULL;
            p->ante=i;
            *raizd=i;
            return;
        }
    }
    ant->sig=i; //ponerlo en el ulti_dato
    i->sig=NULL;
    i->ante=ant;
    *ulti_dato=i;
}

//elimina un elemento de la lista
void borrar(struct dato **raizd, struct dato **ulti_dato){
    struct dato *p, *buscar(char *num);
    char s[80];
    fflush(stdin);
    printf("\nintroduzca numero: ");
    gets(s);
    p=buscar(s);
    if(p){
	    if(*raizd==p){
            *raizd=p->sig;
            if (*raizd)
                (*raizd)->ante=NULL;
            else
                *ulti_dato=NULL;
        }
        else{
            p->ante->sig=p->sig;
            if (p!=*ulti_dato)
                p->sig->ante= p->ante;
            else
                *ulti_dato=p->ante;
        }
        free(p); //devolver memoria al sistema
        printf("elemento borrado\n");
    }
}
 
//buscar una direccion
struct dato *buscar(char *num){
    struct dato *p;
    p=raizd;
    while(p){
        if(!strcmp(num,p->num))
        return p;
        p=p->sig; //obtener siguiente direccion
    }
    printf("numero no encontrado\n");
    return NULL; //no encontrado
}
 
//mostrar la lista entera
void listar(void){
	struct dato *p;
	p=raizd;
	if (!p){
        printf("\n Lista Vacía\n");
        return;
    }printf("     \nContenido de la lista\n");
	    printf("numero  matricula  edad  promedio  sexo");
    while(p){
        mostrar(p);
        p=p->sig; //obtener siguiente direccion
    }
    printf("\n Fin de Lista\n");
}
 
//esta funcion imprime realmente los campos de cada direccion
void mostrar(struct dato *p){
    printf("\n  %s ",p->num);
    printf("    %d ",p->matricula);
    printf("   %d ",p->edad);
    printf("    %.1f ",p->promedio);
    printf("     %d \n",p->sexo);
}
 
//buscar un nombre en la lista
void buscar(void){
    char num[10];
    struct dato *p, *buscar(char *num);
    fflush(stdin);
    printf("\nintroduzca numero: ");
    gets(num);
    p=buscar(num);
    if (!p)
        printf("no encontrado\n");
    else{
        printf("numero  matricula  edad  promedio  sexo");
        mostrar(p);
    }
}


este codigo es el ultimo






(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.)