• Miércoles 3 de Julio de 2024, 06:36

Autor Tema:  Ahora Tengo Dudas Con Una Lista Enlazada  (Leído 2535 veces)

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Ahora Tengo Dudas Con Una Lista Enlazada
« en: Jueves 21 de Diciembre de 2006, 11:47 »
0
Hola, como dice el título, ahora lo que me trae por el camino de la amargura es una lista enlazada.

Tengo varios problemas:

El primero (que no tiene nada que ver con la lista, pero me tiene hasta donde yo me sé) es que yo declaro constantes y luego declaro arrays y entre los corchetes pongo el nombre de esa constante (ahora, cuando ponga la definicion de la clase verán a qué me refiero).
Código: Text
  1. class Typeisbn{
  2.  public:
  3.   Typeisbn(const char* isbn);
  4.   ~Typeisbn();
  5.   bool operator == (const Typeisbn isbn);
  6.   friend istream &operator >>(istream is, Typeisbn isbn);
  7.   friend ostream &operator <<(ostream os,const Typeisbn &isbn);
  8.   friend class Libro;
  9.  private:
  10.   const int TAM_ISBN = 11;
  11.   char ISBN [TAM_ISBN];
  12. };
  13.  
  14. class Libro{
  15.  public:
  16.   Libro *next;
  17.   Libro();
  18.   ~Libro();
  19.   bool Es_Vacia(Libro l);
  20.   Libro Insertarlibro (Libro l);
  21.   Libro Eliminarlibro(Libro l);
  22.   friend istream &operator >>(istream is, Libro &r);
  23.   friend ostream &operator <<(ostream os,const Libro &r);
  24.   friend void Listar (Libro l);
  25.   Libro Buscar (Libro l);
  26.  private:  
  27.   const int TAM_AUTOR = 40;
  28.   const int TAM_LIBRERIA = 20;
  29.   const int TAM_TITULO = 105;
  30.   char Titulo [TAM_TITULO];
  31.   char Libreria [TAM_LIBRERIA];
  32.   char Autor [TAM_AUTOR];
  33.   Typeisbn isbn;
  34.   unsigned fechaedicion;
  35. };
  36.  

Pues el compilador, para todas estas constantes me dice lo mismo (así que solo voy a poner uno de los mensajes):
Libro.h:16: error: ISO C++ prohíbe la inicialización del miembro ‘TAM_ISBN’
Libro.h:16: error: haciendo a ‘TAM_ISBN’ static

Otro problema que tengo, es que el constructor es vacío (de esos que pones las llaves y ya está), pues el compilador va y suelta:
Libro.C: In constructor ‘Libro::Libro()’:
Libro.C:4: error: no se encuentra una función coincidente para la llamada a ‘Typeisbn::Typeisbn()’
 :huh:

Y el último problema que tengo, es que , por lo que se ve, no estoy manejando los punteros del todo bien:

Código: Text
  1. Libro Libro::Insertarlibro (Libro l){
  2.   cin >> *this;
  3.   if (!Es_Vacia (l)){
  4.     if (atoi(&isbn) <atoi(&l.isbn)){
  5.       *next = l;
  6.       l = *this;
  7.     }
  8.     else{
  9.       Libro* ult;
  10.       new ult;
  11.       *ult = l;
  12.       do
  13.   ult = ult*next;
  14.       while  (ult *next != NULL);
  15.       if (atoi(&isbn) > atoi(&ult.isbn)){
  16.   ult*next = *this;
  17.   *next = NULL;
  18.       }
  19.       else{
  20.   Libro ant,sig;
  21.   new ant;
  22.   ant = l;
  23.   new sig;
  24.   sig = l;
  25.   sig = sig*next;
  26.   do{
  27.     *next = sig;
  28.     ant*next = *this;
  29.   }while (atoi(&isbn) > atoi(&sig.isbn));        
  30.       };
  31.     };
  32.   };
  33.   if (Es_Vacia (l))
  34.     l = *this;
  35.   return l;
  36. }
  37.  

Aquí el compilador se vuelve loco y me llama de todo menos bonita... (bueno, si hablara, lo haría   :lol: ):
Libro.C: In member function ‘Libro Libro::Insertarlibro(Libro)’:
Libro.C:18: nota: se requirió primero el método sintetizado ‘std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)’ aquí
Libro.C:18: error:   argumento de inicialización 1 de ‘std::istream& operator>>(std::istream, Libro&)’
Libro.C:20: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:20: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:26: error: expected type-specifier before ‘ult’
Libro.C:26: error: expected `;' before ‘ult’
Libro.C:29: error: operadores inválidos de tipos ‘Libro*’ y ‘Libro*’ para el binario ‘operator*’
Libro.C:30: error: operadores inválidos de tipos ‘Libro*’ y ‘Libro*’ para el binario ‘operator*’
Libro.C:31: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:31: error: solicitud por el miembro ‘isbn’ en ‘ult’, el cual es del tipo ‘Libro*’ que no es clase
Libro.C:32: error: operadores inválidos de tipos ‘Libro*’ y ‘Libro*’ para el binario ‘operator*’
Libro.C:33: error: no match para ‘operator=’ en ‘*((Libro*)this)->Libro::next = 0’
Libro.h:20: nota: los candidatos son: Libro& Libro::operator=(const Libro&)
Libro.C:37: error: expected type-specifier before ‘ant’
Libro.C:37: error: expected `;' before ‘ant’
Libro.C:39: error: expected type-specifier before ‘sig’
Libro.C:39: error: expected `;' before ‘sig’
Libro.C:41: error: no match para ‘operator*’ en ‘sig * ((Libro*)this)->Libro::next’
Libro.C:44: error: no match para ‘operator*’ en ‘ant * ((Libro*)this)->Libro::next’
Libro.C:45: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:45: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’


Los atoi, ya veré como los resuelvo, no es que me preocupen demasiado. Lo que me preocupa es el manejo en sí de los punteros. Mi problema es que, el año pasado aprendí pascal, y parece que tengo una empanada mental del tamaño de un estadio olímpico...

Como siempre, agradezco toda ayuda, consejo o tirón de orejas.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #1 en: Jueves 21 de Diciembre de 2006, 14:39 »
0
En tu clase Typeisbn creo que obligatoriamente tienes que poner el constructor Typeisbn() aparte del que tienes con parametro.

Has probado a dejar las declaracion de constantes fuera de la clase?

Tampoco estoy seguro de si con eso quitaras esos errores, pero se puede probar  :rolleyes:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #2 en: Jueves 21 de Diciembre de 2006, 20:26 »
0
No es posible inicializar elementos dentro de una clase al declararlos. Por lo tanto no es posible declarar constantes dentro de una clase.

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #3 en: Domingo 24 de Diciembre de 2006, 13:36 »
0
Vale... ya se ha arreglado lo de las constantes. Pero sigo teniendo problemas con el manejo en sí de los punteros. Si alguien me pudiera dar un empujoncito... no pido una explicación en detalle.. simplemente que me digan si la forma de'moverlos' e insertar los objetos en la lista está bien o mal (y si está mal qué es lo que estoy haciendo mal, para poder corregirlos)

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #4 en: Jueves 28 de Diciembre de 2006, 20:40 »
0
Vaya... Por lo que veo, el empujoncito que necesito no es tan fácil de dar... :P

En serio, un empujoncito o un empujonazo, pero que alguien me eche una mano, porque tengo que hacer 5 programas antes del día 8 de Enero, y no puedo dejar este y seguir con los demás porque los demás toman a este (y a los siguientes a este) como base  :(

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #5 en: Lunes 22 de Enero de 2007, 11:42 »
0
Hola de nuevo... Ya he conseguido pillarle el tranquillo a los punteros... (por lo menos, eso creo, ya que el compilador no chilla... tanto :D )

El caso es que ahora me da dos mensajitos que no sé como subsanarlos.
El código me ha quedado así:

Código: Text
  1. /* **********************Libro.h******************** */
  2. #ifndef Libro_H
  3. #define Libro_H
  4. #include &#60;iostream&#62;
  5. using namespace std;
  6.  
  7.  
  8. const int TAM_ISBN = 11;
  9. const int TAM_AUTOR = 40;
  10. const int TAM_LIBRERIA = 20;
  11. const int TAM_TITULO = 105;
  12.  
  13. class Typeisbn{
  14.  public:
  15.   Typeisbn(const char* isbn);
  16.   Typeisbn();
  17.   ~Typeisbn();
  18.   bool operator == (const Typeisbn isbn);
  19.   friend istream &operator &#62;&#62;(istream &is, Typeisbn isbn);
  20.   friend ostream &operator &#60;&#60;(ostream &os,const Typeisbn &isbn);
  21.   friend class Libro;
  22.  private:
  23.   char ISBN [TAM_ISBN];
  24. };
  25.  
  26. class Libro{
  27.  public:
  28.   Libro *next;
  29.   Libro();
  30.   ~Libro();
  31.   bool Es_Vacia(Libro l);
  32.   void Insertarlibro (Libro l);
  33.   Libro EliminarLibro(Libro l,Typeisbn busc);
  34.   friend istream &operator &#62;&#62;(istream &is, Libro &r);
  35.   friend ostream &operator &#60;&#60;(ostream &os,const Libro &r);
  36.   friend void Listar (Libro l);
  37.   friend Libro* Buscar (Libro l, Typeisbn busc);
  38.   void Listar (Libro l);
  39.  private:  
  40.   char Titulo [TAM_TITULO];
  41.   char Libreria [TAM_LIBRERIA];
  42.   char Autor [TAM_AUTOR];
  43.   Typeisbn isbn;
  44.   unsigned fechaedicion;
  45. };
  46. #endif
  47.  
  48. /* *******************Libro.C**************** */
  49. #include &#34;Libro.h&#34;
  50.  
  51.  
  52. Libro::Libro(){
  53. }
  54.  
  55. Libro::~Libro(){
  56. }
  57.  
  58. bool Libro::Es_Vacia(Libro l){
  59.   if (!l.Titulo)
  60.     return true;
  61.   else
  62.     return false;
  63. }
  64.  
  65. void Libro::Insertarlibro (Libro l){
  66.   if (!Es_Vacia (l))
  67.     *this-&#62;next = l;
  68.   l = *this;
  69. }
  70.  
  71. Libro EliminarLibro (Libro l,Typeisbn busc){
  72.   Libro *aux,*ant;
  73.   aux = Buscar(l,busc);
  74.   *ant = l;
  75.   do
  76.     ant = ant-&#62;next;
  77.   while (ant-&#62;next != aux);
  78.   ant-&#62;next = aux-&#62;next;
  79.   delete aux;
  80. }
  81.  
  82. Libro* Buscar (Libro l, Typeisbn busc){
  83.   Libro *aux,aux2;
  84.   *aux = l;
  85.   aux2 = *aux;
  86.   bool salida = false;
  87.   do{
  88.     if(aux2.isbn == busc)
  89.       break;
  90.     if (aux -&#62; next != NULL){
  91.       aux = aux -&#62;next;
  92.       aux2 = *aux;
  93.     };
  94.     if ((aux -&#62; next == NULL) && !(aux2.isbn == busc))
  95.       salida = true;
  96.   }while (!salida);
  97.   return aux;
  98. }
  99.  
  100. void Libro::Listar (Libro l){
  101.   Libro *aux;
  102.   *aux = l;
  103.   bool salida = false;
  104.   do{
  105.     cout &#60;&#60; aux;
  106.     if (aux -&#62; next == NULL)
  107.       salida = true;
  108.     else
  109.       aux = aux -&#62; next;
  110.   }while (!salida);
  111. }
  112.  
  113.  
  114. istream &operator &#62;&#62;(istream &is, Libro& r){
  115.   cout &#60;&#60; &#34;Escribe el titulo del libro &#34;;
  116.   is &#62;&#62; r.Titulo;
  117.   cout &#60;&#60;endl&#60;&#60; &#34;Dime el autor del libro &#34;;
  118.   is &#62;&#62; r.Autor;
  119.   cout &#60;&#60;endl&#60;&#60;  &#34;Libreria &#34;;
  120.   is &#62;&#62; r.Libreria;
  121.   cout &#60;&#60;endl&#60;&#60; &#34;Fecha de edicion &#34;;
  122.   is &#62;&#62; r.fechaedicion;
  123.   cout &#60;&#60;endl&#60;&#60;  &#34;Escribe el isbn del libro &#34;;
  124.   is &#62;&#62; r.isbn;
  125. }
  126.  
  127.  
  128. ostream &operator &#60;&#60;(ostream &os,const Libro &r){
  129.   os &#60;&#60; &#34;Libreria: &#34; &#60;&#60; r.Libreria &#60;&#60;endl;
  130.   os &#60;&#60; &#34;Titulo: &#34; &#60;&#60; r.Titulo &#60;&#60;endl;
  131.   os &#60;&#60; &#34;Autor: &#34; &#60;&#60; r.Autor &#60;&#60;endl;
  132.   os &#60;&#60; &#34;Fecha de edicion&#34; &#60;&#60; r.fechaedicion &#60;&#60; endl;
  133.   os &#60;&#60; &#34;ISBN: &#34; &#60;&#60; r.isbn &#60;&#60; endl;
  134. return os;
  135. }
  136.  
  137. bool operator == (const Typeisbn isbn1,const Typeisbn isbn2){
  138.   if (isbn1  == isbn2)
  139.     return true;
  140.   else
  141.     return false;
  142. }
  143.  
  144. istream &operator &#62;&#62;(istream &is, Typeisbn isbn){
  145.   is &#62;&#62; isbn.ISBN;
  146.   return is;
  147. }
  148.  
  149. ostream &operator &#60;&#60;(ostream &os,const Typeisbn &isbn){
  150.   os &#60;&#60; isbn.ISBN;
  151.   return os;
  152. }
  153.  
  154. Typeisbn::Typeisbn(const char* isbn){
  155.   ISBN = *isbn;
  156. }
  157.  
  158. Typeisbn::Typeisbn(){
  159. }
  160.  
  161. Typeisbn::~Typeisbn(){
  162. }
  163.  
  164.  
  165. /* *****************Prac4.C (main)**************** */
  166. #include &#34;Libro.h&#34;
  167.  
  168. void Menu (bool s,Libro Lista){
  169.   cout &#60;&#60; &#34;Elija la accion a realizar&#34;&#60;&#60; endl;
  170.   cout &#60;&#60; &#34;0:Salir    1:Insertar libro  2: Borrar libro&#34; &#60;&#60; endl;
  171.   cout &#60;&#60; &#34;3:Buscar libro  4:Listado de libros&#34; &#60;&#60; endl;
  172.   int opt;
  173.   cin &#62;&#62; opt;
  174.   switch (opt){
  175.     case 0:{
  176.             s = true;
  177.       break;
  178.            };
  179.     case 1:{
  180.             Libro Lib;
  181.             cin &#62;&#62;Lib;
  182.             Lib.Insertarlibro (Lista);
  183.       break;
  184.            };
  185.     case 2:{
  186.             cout &#60;&#60; &#34;Escribe el ISBN del libro que quieres eliminar&#34; &#60;&#60;endl;
  187.             Typeisbn busc;
  188.             cin &#62;&#62; busc;
  189.             Lista = EliminarLibro(Lista,busc);
  190.             break;
  191.            };
  192.     case 3:{
  193.             cout &#60;&#60; &#34;Escribe el ISBN del libro que quieres buscar&#34; &#60;&#60;endl;
  194.             Typeisbn busc;
  195.             cin &#62;&#62; busc;
  196.             Libro* Lib = Buscar (Lista,busc);
  197.             cout &#60;&#60;&#34;El libro buscado es: &#34;&#60;&#60; Lib;
  198.       break;
  199.            };
  200.     case 4:{
  201.             Listar (Lista);
  202.             break;
  203.            };
  204.   };
  205. }
  206.  
  207. int Main (){
  208.   bool salida = false;
  209.   Libro List;
  210.   do
  211.     Menu (salida,List);
  212.   while (!salida);
  213.   return (0);
  214. }
  215.  
  216.  

Y los mensajes que da el compilador son:

pract04.C: In function ‘void Menu(bool, Libro)’:
pract04.C:25: error: ‘EliminarLibro’ no se declaró en este ámbito
Libro.C: In constructor ‘Typeisbn::Typeisbn(const char*)’:
Libro.C:107: error: tipos incompatible en la asignación de ‘const char’ a ‘char [11]’
 
Llegados a este punto, me dan ganas de coger el ordenador y tirarlo por la ventana...  :angry: Cabe destacar que el constructor no lo puedo cambiar para pasarle un vector de caracteres, ya que la cabecera me la dieron así (y el campo isbn de la clase libro tampoco lo puedo cambiar)

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #6 en: Lunes 22 de Enero de 2007, 21:32 »
0
"EliminarLibro" es una funcion miembro de libro, no la puedes invocar sin que este asociada a una variable Libro. Prueba con Lib.EliminarLibro(..).

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Ahora Tengo Dudas Con Una Lista Enlazada
« Respuesta #7 en: Jueves 25 de Enero de 2007, 13:43 »
0
Vale... un compañero me ha dicho que, aunque la práctica pide una lista, no hace falta implementar una lista en el sentido extricto... Es decir, que me puedo olvidar de los punteros que tantos dolores de cabeza me están dando; ya que, una definición no extricta de lista sería 'estructura que almacena objetos de manera secuencial'  Así que, me he ido a la STL y estoy usando un vector.  La cosa se ha simplificado enoooooooooooooormente. Pero ahora tengo un problema. Tendría que eliminar elementos de ese vector, y a lo mejor coincide, pero lo más probable es que no esté ni al final ni al principio. El caso es que tengo una función que devuelve un entero y ese entero es la posición del elemento que quiero borrar. Pero no sé como hacer para borrarlo... He mirado y dicen que con erase() se puede hacer. Pero he intentado Vector.erase(i) y Vector.erase(Vector) y en ambos casos el compilador dice que nones... dice no sé qué de un iterador... Llevo una hora buscando info sobre como se usa erase y no consigo sacar nada en claro... ¿Alguien me puede echar un cable? Gracias.