Dev - C++ - Problema con punteros

 
Vista:

Problema con punteros

Publicado por Antc (1 intervención) el 13/05/2009 18:55:54
Weno mi problema es el siguiente,en el siguiente algoritmo intento cargar unos datos en un sitema de datos un pelin complejo espero k lo entendais, y perdonen si les molesto por esta tonteria pero estoy empezado a programar y por mas vueltas k le doy no encuetro solucion. La cuestio esta en la linea 79 que da fallo de acceso a memoria cuando en verdad ni siquiera deberia entrar en ese si ya que la lista deberia estar a nulo. El programa basicamente compuesto por una declaracio de tipos y la biblioteca a parte del programa pricipal, lo k hace es k una vez se carga el programa introduces datos de asignaturas de alumnos, y mas cosas lo k pasa k falla hay.

Biblioteca(dode da el fallo):
#ifndef _ACTAS_
#define _ACTAS_
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cctype>
#include <string>

using namespace std;

namespace ACTAS {
const int MAX=20;



typedef struct lau* Alumnos;
struct lau{
string nombre;
int DNI,num;
char pago;
Alumnos sig;
};
typedef struct Nodo* ptr;
struct Nodo{
Alumnos alu;
ptr sig;
};

struct asignatura{
int codigo;
string Nombre;
ptr lista;
};

typedef asignatura Asignaturas[MAX];

struct Datos{
Alumnos alumnos;
int gestion;
Asignaturas asignaturas;
};
//
//Carga al inicio todos los datos nesesarios
//
void cargar_datos(Datos Actas);
//
//Libera toda la memoria dinamica
//
void liberar_nodos(Datos Actas);
//
//Muestra todos los datos almacenados
//
void mostrar_datos(Datos Actas);
//
//Cambia el estado del pago
//
void pago(Datos Actas,int DNI);
//
//Elimina todos los alumnos que no han pagado
//
void cierre_pago(Datos Actas);
//
//Muetra un listado de alumnos ordenados de mayor a menor por el numero de asignaturas en las que estan matriculados
//
void listado_ordenado(Datos Actas);


}

#endif


aqui el codigo:

#include "ACTAS.h"

#include <iostream>

using namespace std;

namespace ACTAS{
//
//Elimina asignaturas asociadas al alumno
//
void eliminarasig(Datos Actas,Alumnos aux)
{
ptr aux1,aux2;

for(int i=0;i<=MAX-1;i++){
aux1=Actas.asignaturas[i].lista;
while(aux1->sig!=NULL){
if((aux1->alu==aux->sig)&&(aux1=Actas.asignaturas[i].lista)){
Actas.asignaturas[i].lista=Actas.asignaturas[i].lista->sig;
delete aux1;
aux=Actas.asignaturas[i].lista->alu;
}
else{
if(aux1->alu=aux->sig){
aux2=aux1->sig;
aux1->sig=aux2->sig;
delete aux2;
}
else{
aux1=aux1->sig;
}
}
}
}
}
//
//Une el alumno con la asignatura
//
void unir_asignatura(int asig,Alumnos aux,Datos Actas)
{
int num,i;
ptr aux1,aux2;
i=0;

while(asig!=1){
cin>>num;
while((num!=Actas.asignaturas[i].codigo)&&(i<=MAX-1)){
i=i+1;
if((i=MAX-1)&&(num!=Actas.asignaturas[i].codigo)){
cout<<"asignatura no encontrada";
}
}
if(Actas.asignaturas[i].lista=NULL){
aux1=new Nodo;
Actas.asignaturas[i].lista=aux1;
aux1->sig=NULL;
aux1->alu=aux;
asig=asig-1;
}
else{
aux1=Actas.asignaturas[i].lista;
aux2=new Nodo;
Actas.asignaturas[i].lista=aux2;
aux2->sig=aux1;
aux2->alu=aux;
asig=asig-1;
}
}
}
//
//Crea los nodos con los alumnos
//
void introducir_alumnos(int DNI,string alumno,int asig,char p,Datos Actas)
{
Alumnos aux,aux1;

if(Actas.alumnos!=NULL){
aux=new lau;
aux1=Actas.alumnos->sig;
Actas.alumnos=aux;
aux->sig=aux1;
aux->DNI=DNI;
aux->pago=p;
aux->nombre=alumno;
aux->num=asig;
unir_asignatura(asig,aux,Actas);
}
else{
cout<<"entro";
aux=new lau;
aux->sig=NULL;
Actas.alumnos=aux;
aux->DNI=DNI;
aux->pago=p;
aux->nombre=alumno;
aux->num=asig;
unir_asignatura(asig,aux,Actas);
}

}
//
//Inicializa la estructura
//
void inic(Datos Actas)
{
for(int i=0;i<=MAX-1;i++){
Actas.asignaturas[i].codigo=0;
Actas.asignaturas[i].lista=NULL;
}
Actas.gestion=0;
Actas.alumnos=NULL;

}
//
//Carga al inicio todos los datos nesesarios
//
void cargar_datos(Datos Actas)
{
int codigo,i,DNI,asig;
string alumno,nombre;
char p;
inic(Actas);
cout<<"Escribe las asignaturas: ";
cin>>codigo;
cin>>nombre;
i=0;
while((codigo!=0)&&(i<=MAX-1)){
Actas.asignaturas[i].codigo=codigo;
Actas.asignaturas[i].Nombre=nombre;
i=i+1;
Actas.gestion=Actas.gestion+1;
cin>>codigo;
cin>>nombre;
}
cout<<"Escribe los alumnos: ";
cin>>DNI;
cin>>alumno;
cin>>asig;
cin>>p;
while(DNI!=0){
introducir_alumnos(DNI,alumno,asig,p,Actas);
cin>>DNI;
cin>>alumno;
cin>>asig;
cin>>p;
}
}
//
//Libera toda la memoria dinamica
//
void liberar_nodos(Datos Actas)
{
ptr aux;
Alumnos aux1;

for(int i =0;i<=MAX-1;i++){
while(Actas.asignaturas[i].lista!=NULL){
aux= Actas.asignaturas[i].lista;
while((*aux).sig!=NULL){
aux=aux->sig;
}
delete aux;
}
}
while (Actas.alumnos!=NULL){
aux1=Actas.alumnos;
while(aux->sig!=NULL){
aux=aux->sig;
}
delete aux1;
}
}
//
//Muestra todos los datos almacenados
//
void mostrar_datos(Datos Actas)
{
Alumnos aux;

for(int i=0;i<=MAX-1;i++){
cout<<Actas.asignaturas[i].codigo<<endl;
cout<<Actas.asignaturas[i].Nombre<<endl<<endl;
aux=Actas.asignaturas[i].lista ->alu;
while(aux!=NULL){
cout<<aux->nombre<<endl;
cout<<aux->DNI<<endl;
cout<<aux->pago<<endl;

}
}

}
//
//Cambia el estado del pago
//
void pago(Datos Actas,int DNI)
{
int i;
i=0;
Alumnos aux;

cout<<"Introduzca el DNI del alumno: ";
aux=Actas.alumnos;
while((aux->sig!=NULL)&&((*aux).sig->DNI!=DNI)){
i=i+1;
}
(*aux).sig->pago='y';

}
//
//Elimina todos los alumnos que no han pagado
//
void cierre_pago(Datos Actas)
{
Alumnos aux,aux1;

aux=Actas.alumnos;
while(aux->sig!=NULL){
if((aux==Actas.alumnos)&&(aux->pago!='y')){
Actas.alumnos=Actas.alumnos->sig;
eliminarasig(Actas,aux);
delete aux;
aux= Actas.alumnos;
}
else {
if((*aux).sig->pago!='y'){
aux1=aux->sig;
aux->sig=aux1->sig;
eliminarasig(Actas,aux);
delete aux1;
}
else{
aux=aux->sig;
}
}
}
}
//
//Muetra un listado de alumnos ordenados de mayor a menor por el numero de asignaturas en las que estan matriculados
//
void listado_ordenado(Datos Actas)
{

}

}

Si nesesitais algo mas pedilo, decir tambien k agradeceria mucho vuestra ayuda, ya k nesesito hacer esto urgentemente.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder