Hola este es mi primer tema y me gustaria si alguine podria ayudarme por que estoy haciendo un programa y se me esta colgando todo el rat, no encuentro ningun error si alguien es tan amable para ayudarme, se lo agradeceria mucho.
Soy relativamente nuevo en este mundo de la programacion y cualquier consejo para solucionar este problema se lo agradeceria mucho
creo que el problema tiene que ver con algo de punteros pero no estoy seguro
este es el main cpp
#include <iostream>
#include "usalibro.h"
#include "UsaBibliografia.h"
#include "bibliografia.h"
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void menu();
int main()
{
menu();
return 0;
}
void menu(){
int opcion, control=0;
tbibliografia bd;
tlibro t;
do{
cout<< "1.- Crear bibliografía" << endl;
cout<< "2.- Añadir libro "<< endl;
cout<< "3.- Modificar año de libro" << endl;
cout<< "4.- Listar libros por ISBN" << endl;
cout<< "5.- Listar libros por orden decreciente de año" << endl;
cout<< "6.- Terminar" << endl;
cout<< "Elegir opción:"<< endl;
cin >> opcion;
switch(opcion){
case 1:{
if(control==0){
crear(bd);
control=1;
cout<<"Se ha creado la bibliogarfia"<<endl;
}else
cout<<"Ya habia sido creada la bibliografia, el sistema solo puede manterner a una"<<endl;
}
break;
case 2:{
if(control==0){
cout<<"Primero tiene que crear la bibliografia, use opcion 1"<<endl;
}else{
leerLibro(t);
anadir(bd,t);
}
}
break;
case 3:{
if(control==0)
cout<<"Primero tiene que crear la bibliografia, use opcion 1"<<endl;
else{
cout<<"Introduce ISBN del libro a modificar año"<<endl;
cin>>t.isbn;
if(existe(bd,t.isbn)){
cout<<"Introduce el año que desea intruducir"<<endl;
cin>>t.ano;
modificarAnoLibro(bd, t.isbn, t.ano);
}else
cout<<"El libro no esta en la bibliografia"<<endl;
}
}
break;
case 4:{
if(control==0)
cout<<"Primero tiene que crear la bibliografia, use opcion 1"<<endl;
else{
mostrarOrdenisbn (bd);
}
}
break;
case 5:{
if(control==0)
cout<<"Primero tiene que crear la bibliografia, use opcion 1"<<endl;
else{
mostrarOrdenAno(bd);
}
}
break;
}
}while(opcion!=6);
}
este es el UsaBibliogrsafia.h
#ifndef USABIBLIOGRAFIA_H_INCLUDED
#define USABIBLIOGRAFIA_H_INCLUDED
#include <iostream>
#include "bibliografia.h"
#include "usalibro.h"
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void copiaBibliografia (tbibliografia &nuevo,tbibliografia viejo);
void mostrarOrdenisbn (tbibliografia li);
void mostrarOrdenAno(tbibliografia bibli);
#endif
este es UsaBibliografia.cpp
#include "UsaBibliografia.h"
void copiaBibliografia (tbibliografia &nuevo,tbibliografia viejo){
int conta,conta2=0;
crear(nuevo);
tlibro t;
conta= numeroLibros (viejo);
while(conta2<=conta){
extraerPosicion(viejo, conta2,t);
anadir(nuevo,t);
conta2++;
}
};
void mostrarOrdenisbn (tbibliografia li){
int conta,conta2=0;
tlibro t;
conta= numeroLibros (li);
while(conta2<=conta){
extraerPosicion(li, conta2,t);
mostrarLibro(t);
conta2++;
}
};
void mostrarOrdenAno(tbibliografia bibli) {
int conta,conta2=0;
tlibro t;
conta= numeroLibros (bibli);
tbibliografia prueba, prueba2;
copiaBibliografia(prueba, bibli);
crear(prueba2);
while(conta2<=conta){
masNuevo(prueba,t);
eliminar(prueba,t.isbn);
mostrarLibro(t);
conta2++;
}
};
este es bibliografia.h
#ifndef BIBLIOGRAFIA_H_INCLUDED
#define BIBLIOGRAFIA_H_INCLUDED
#include <iostream>
#include "usalibro.h"
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
typedef struct _nodo {
tlibro t;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *tbibliografia;
void crear(tbibliografia &nuevo);
void anadir(tbibliografia &b, tlibro l);
void eliminar(tbibliografia &b, char isbn[]);//mirar
bool bibliografiaSinLibros(tbibliografia b);
void extraer(tbibliografia b, char isbn[], tlibro & l);
int numeroLibros (tbibliografia b);
void extraerPosicion(tbibliografia b, int pos, tlibro &l);
bool existe (tbibliografia b, char isbn[]);
void modificarAnoLibro(tbibliografia &b, char isbn[], int ano);
void masNuevo(tbibliografia b, tlibro &l);
#endif
este es bobliografia.cpp
#include "bibliografia.h"
void crear(tbibliografia &nuevo){
nuevo=NULL;
}
void anadir(tbibliografia &b, tlibro l){
pNodo nuevo, anterior;
crear(nuevo);
copiaLibro((*nuevo).t,l);
// Si la lista está vacía
if(bibliografiaSinLibros(b)==true || strcmp(b->t.isbn, l.isbn)>0) {
/* Añadimos la lista a continuación del nuevo nodo */
nuevo->siguiente = b;
/* Ahora, el comienzo de nuestra lista es en nuevo nodo */
b = nuevo;
}
else {
/* Buscar el nodo de valor menor al isbn */
anterior = b;
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga
un valor mayor que el isbn*/
while(anterior->siguiente && strcmp(anterior->siguiente->t.isbn,l.isbn) <=0)
anterior = anterior->siguiente;
/* Insertamos el nuevo nodo después del nodo anterior */
nuevo->siguiente = anterior->siguiente;
anterior->siguiente = nuevo;
}
}
void eliminar(tbibliografia &b, char isbn[]){
pNodo anterior, nodo;
nodo = b;
crear(anterior);
while(nodo && strcmp(nodo->t.isbn, isbn)<0) {
anterior = nodo;
nodo = nodo->siguiente;
}
if(!nodo || strcmp(nodo->t.isbn, isbn)!=0) return;
else { /* Borrar el nodo */
if(!anterior) /* Primer elemento */
b = nodo->siguiente;
else /* un elemento cualquiera */
anterior->siguiente = nodo->siguiente;
free(nodo);
}
}
bool bibliografiaSinLibros(tbibliografia b){
return (b == NULL);
}
void extraer(tbibliografia b, char isbn[], tlibro & l){
pNodo anterior;
anterior = b;
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga un valor mayor de isbn*/
while(anterior->siguiente && strcmp(anterior->t.isbn,isbn) <=0){
if(strcmp(anterior->t.isbn,isbn) ==0)
copiaLibro(l,anterior->t);
anterior = anterior->siguiente;
}
}
int numeroLibros (tbibliografia b){
pNodo anterior;
anterior = b;
int conta=0;
/* Avanzamos hasta el último elemento */
while(anterior->siguiente){
conta++;
anterior = anterior->siguiente;
}
return conta;
}
void extraerPosicion(tbibliografia b, int pos, tlibro &l){
pNodo anterior;
anterior = b;
int conta=0;
while(anterior->siguiente && pos>=conta){
if(pos==conta)
copiaLibro(l,anterior->t);
conta++;
anterior = anterior->siguiente;
}
}
bool existe (tbibliografia b, char isbn[]){
pNodo anterior;
anterior = b;
bool sal=false;
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga un valor mayor de isbn*/
while(anterior->siguiente && strcmp(anterior->t.isbn,isbn) <=0){
if(strcmp(anterior->t.isbn,isbn)==0){
sal=true;}
anterior = anterior->siguiente;
}
return sal;
}
void modificarAnoLibro(tbibliografia &b, char isbn[], int ano){
pNodo anterior;
anterior = b;
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga un valor mayor de isbn*/
while(anterior->siguiente && strcmp(anterior->t.isbn,isbn) <=0){
if(strcmp(anterior->t.isbn,isbn) ==0){
anterior->t.ano=ano;
}
anterior = anterior->siguiente;
}
}
void masNuevo(tbibliografia b, tlibro &l){
pNodo anterior;
anterior = b;
copiaLibro(l,anterior->t);
anterior = anterior->siguiente;
/* Avanzamos hasta el último elemento */
while(anterior->siguiente){
if(anterior->t.ano > l.ano)
copiaLibro(l,anterior->t);
anterior = anterior->siguiente;
}
}
este usalibro.cpp
#include "usalibro.h"
void leerLibro(tlibro &t){//COMPROBADO
char isbn[10];
char titulo[20];
int ano;
cin.clear();
cout<<"Introduce el isbn del libro"<<endl;
cin>>isbn;
cout<<"Introduce el titulo del libro"<<endl;
cin>>titulo;
cout<<"Introduce el año de publicacion del libro"<<endl;
cin>>ano;
crearLibro(titulo,t,isbn,ano);
}
void mostrarLibro(tlibro t){
char isbn[10];
char titulo[20];
int ano;
obtenerTitulo(titulo,t);
obtenerAno(ano,t);
obtenerisbn(isbn,t);
cout<<isbn<<" "<<titulo<<" "<<ano<<endl;
}
void copiaLibro(tlibro &nuevo,tlibro t){
char isbn[10];
char titulo[20];
int ano;
obtenerTitulo(titulo,t);
obtenerAno(ano,t);
obtenerisbn(isbn,t);
crearLibro(titulo,nuevo,isbn,ano);
}
este es usalibro
#ifndef USALIBRO_H_INCLUDED
#define USALIBRO_H_INCLUDED
#include <iostream>
#include "libro.h"
#include <cstring>
using namespace std;
void leerLibro(tlibro &t);
void mostrarLibro(tlibro t);
void copiaLibro(tlibro &nuevo, tlibro t);
#endif
este libro.h
#ifndef LIBRO_H_INCLUDED
#define LIBRO_H_INCLUDED
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <string.h>
using namespace std;
struct tlibro{
char isbn[10];
char titulo[20];
int ano;
};
void crearLibro(char titulo[],tlibro &t,char isbn[],int ano);
void modificarAno(int ano,tlibro &t);
void obtenerTitulo(char titulo[],tlibro t);
void obtenerAno(int &ano,tlibro t);
void obtenerisbn(char isbn[],tlibro t);
#endif
este libro.cpp
#include "libro.h"
void crearLibro(char titulo[],tlibro &t,char isbn[],int ano){//comprabado
strcpy(t.isbn,isbn);
strcpy(t.titulo,titulo);
t.ano=ano;
cout<<"sal";
};
void modificarAno(int ano,tlibro &t){
t.ano=ano;
};
void obtenerTitulo(char titulo[],tlibro t){
strcpy(titulo,t.titulo);
};
void obtenerAno(int &ano,tlibro t){
ano=t.ano;
};
void obtenerisbn(char isbn[],tlibro t){
strcpy(isbn,t.isbn);
};