Ordenar una lista alfabeticamente

Iniciado por maferavagar, 17 Mayo 2015, 13:10 PM

0 Miembros y 1 Visitante están viendo este tema.

maferavagar

Buenas Noches, alguien que me pudiera ayudar en mi código. Lo estoy haciendo en Dev, y al momento de compilar me manda Done, me aparece la ventana negra y despues me sale otra ventana diciendome , que mi proyecto.exe dejo de funcionar.
// LISTA SIMPLEMENTE ENLAZADA CON MEMORIA DINAMICA
// QUE INSERTA ORDENADO LOS DATOS
// CON FUNCION QUE DESPLIEGA LOS DATOS Y RETORNA UN PUNTERO
// CON FUNCION QUE INVIERTE EL ORDEN DE LA LISTA SIMPLE
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#define n 3
using namespace std;
struct nodo_lista {
  public:
                char nom[31];
          char bol[10];
          float cal[n];
          float prom;
          struct nodo_lista *sig;  // puntero a estructura

           
            nodo_lista(nodo_lista *S=NULL)
          {
       prom=0.0;
       strcpy(bol,S->bol);
       strcpy(nom,S->nom);
       for(int i=0;i<n;i++)
       {   cal=S->cal;
      prom=prom+cal;
      }
      prom=prom/n;
      sig=NULL;
  } //constructor que inicializa las variables del nodo

};

class lista1{
private:
    class nodo_lista *primero, * final, *nvo, *recorre;

public :
   lista1(){primero=final=recorre=nvo=NULL; }
   void inserta_nodo_ord(nodo_lista *D);
   nodo_lista *ver_nodos();
   void invertir(nodo_lista *lista);
   void eliminar_dato(char boleta[10]);
};

//funcion que inserta ordenado en la lista
void lista1::inserta_nodo_ord(nodo_lista *D) {
nvo= new nodo_lista(D);
if(nvo==NULL){cout<<"error en asignacion de memoria\n";getch();exit(1);}
if(primero == NULL) primero=final=nvo ;
// INICIALIZA LA PRIMERA DIRECCION Y LA FINAL
else
  {
    if(strcmpi(nvo->bol,primero->bol)<=0)
    {  //el dato a insertar es menor al primero
      nvo->sig=primero;  // enlaza el nuevo nodo al inicio
      primero = nvo;   // inicio apunta al nodo nuevo
    }
    else
    {   // de otra forma se busca su lugar
      recorre= primero;                 // condicion de ubicacion
      while( (recorre->sig != NULL) && (strcmpi(nvo->bol,recorre->sig->bol)>0) )
         {
          recorre = recorre->sig;
         }
      nvo->sig = recorre->sig; //inserta y/o enlaza el nuevo nodo al nodo siguiente
      recorre->sig= nvo;   // inserta y/o enlaza al nuevo nodo al nodo anterior
    }
  }
}
void lista1::invertir(nodo_lista *lista)
{
  recorre=lista;
  nodo_lista *nva_lista=NULL;
  while(lista!=NULL)
  {
    recorre=lista->sig;
    lista->sig=nva_lista;
    nva_lista=lista;
    lista=recorre;
  }
  primero=nva_lista;
}
   // Elimina un numero de la lista
void lista1::eliminar_dato(char boleta[10]) {
   nvo=recorre=primero;
   if(strcmpi(nvo->bol,boleta) == 0){
      primero=nvo->sig;
      delete(nvo);
   }
   while((nvo->sig != NULL) && (primero!=NULL)){
       nvo=recorre;
       recorre=recorre->sig;
      if(strcmpi(recorre->bol,boleta) == 0){
         nvo->sig = recorre->sig;
         delete(recorre);
      }
   }
}
// MUESTRA EL CONTENIDO DE LA LISTA Y RETORNA UN PUNTERO DE LA LISTA SIMPLE
nodo_lista *lista1::ver_nodos() {
   recorre=primero;
   cout<<"entra a ver"<<endl;
   while((recorre != NULL) && (primero != NULL))
   {
     cout<<"\nBOLETA : "<<  recorre->bol<<endl;
     cout<<"NOMBRE : "<<  recorre->nom<<endl;
     for(int i=0;i<n;i++)
       cout<<"CALIFICACION["<<i<<"] = "<<  recorre->cal<<endl;
     cout<<"PROMEDIO = "<<  recorre->prom<<endl;

    recorre=recorre->sig;
   }
   return(primero);
}

int main()
{
int i=0;char m,borra[10];
int opc;
lista1 Obj1C;     // objeto de la clase
nodo_lista *Obj2E,*Obj3E;  // objeto de la estructura
Obj2E=new nodo_lista;
if(Obj2E==NULL)exit(1);
clrscr();
do
{
     cout<<"\n\nBOLETA : ";     cin>>Obj2E->bol;
     cout<<"\nNOMBRE : ";     gets(Obj2E->nom);
     for(i=0;i<n;i++)
      {
       cout<<"\nCALIFICACION["<<i<<"] = ";
       cin>>Obj2E->cal;
      }

   Obj1C.inserta_nodo_ord(Obj2E); // inserta dato
   cout<<"  Salir de Insertar s/n ? ";
   m=getch();i++;
  }
   while(toupper(m) != 'S');
clrscr();
  //visualiza la lista y entrega la direccion inicial de la lista simple
Obj3E=Obj1C.ver_nodos();
cout<<"\n\nDesea ver invertida la lista? s(1),n(0) ";cin>>opc;
  if(opc)
{
  //invierte la lista simple
  Obj1C.invertir(Obj3E);
  //visualiza la lista y pierde la direccion inicial de la lista simple
  Obj1C.ver_nodos();
   }
  cout<<"\n\nDesea borrar un registro de la lista? s(1),n(0) ";cin>>opc;
  if(opc)
{
  cout<<"\nBoleta a borrar? : ";cin>>borra;
    Obj1C.eliminar_dato(borra);
    Obj1C.ver_nodos();
   }
getch();
}

ivancea96

La ventana negra es la consola.
Si hubo un error, y viendo que usas memoria dinámica, intuyo que es por un acceso a memoria mal practicado.

Como dato, estás usando librerias de C y de C++ a la vez. Si les quitas el .h y le pones una 'c' al comienzo, la mayoria serán de C++. ("stdio.h" -> "cstdio")

Mete el código en etiquetas GeSHi.