elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Invertir Secuencia dinámica manteniendo el punto de interes en: 28 Junio 2012, 12:32 pm
Hola a todos.
Estoy haciendo un ejercicio en el que tengo que invertir una secuencia dinámica en c++.
Tengo que realizar este ejercicio para la universidad y tal como lo tengo hecho se me crea un bucle infinito al tratar de sacar los valores por pantalla despues de invertir. ¿Alguien me puede echar una mano?

Este es el código de mi función invertir:

Código
  1. template <class TElem>
  2. void CSecuencia<TElem>::invertir(){
  3. invertirAux(0, _pri->sig());
  4. };
  5. template <class TElem>
  6. void CSecuencia<TElem>::invertirAux(CNodoSecuencia<TElem> *act, CNodoSecuencia<TElem>*anterior){
  7. if (act==0)
  8. //caso base
  9. if (_ant->sig()==0){
  10. _ant=_pri->sig();
  11. _pri->_sig=anterior;
  12. anterior->_sig=_pri;
  13. }
  14. else {
  15. _pri->_sig=anterior;
  16. anterior->_sig=_pri;
  17. _ant=_ant->sig()->sig();//Para mantener el punto de interes
  18. }
  19. //fin caso base
  20. else if (act!=0){
  21. invertirAux(act, act->sig());
  22. act->_sig=_ant;
  23. }
  24.  
  25. };

Y esta es la definición de la secuencia (Está todo bien implementado menos el invertir):
Código
  1. class CSecuencia {
  2. public:
  3. CSecuencia ();
  4. CSecuencia(const CSecuencia<TElem> &other) {copia(other);};
  5. /*Constructor de copia de la secuencia; debe tener cuidado con la compartición de memoria, es decir, debe hacer una copia completa.
  6. Parámetros:
  7. other Objeto a copiar.
  8. */
  9. ~CSecuencia() {libera();};
  10. CSecuencia<TElem>& operator= (const CSecuencia<TElem> &rhs);
  11. /*Operador de asignación sobre secuencias; se preocupa de duplicar la estructura de la secuencia para que no exista compartición de memoria.
  12. Parámetros:
  13. rhs Secuencia a copiar.
  14. Devuelve:
  15. Una referencia a la nueva secuencia.*/
  16. void inserta(const TElem &e);
  17. /*Inserta un nuevo elemento en la secuencia, justo delante del punto de interés.
  18. Parámetros:
  19. e Elemento a añadir.
  20. */
  21. void borra();
  22. /*Elimina el elemento apuntado por el punto de interés.
  23. Excepciones:
  24. EAccesoIndebido si el punto de interés está al final, fuera de la secuencia.
  25. */
  26. const TElem& actual() const;
  27. /*Devuelve el elemento apuntado por el punto de interés.
  28. Devuelve:
  29. Elemento almacenado.
  30. Excepciones:
  31. EAccesoIndebido si el punto de interés está al final, fuera de la secuencia.*/
  32. void avanza();
  33. /*Avanza una posición el punto de interés.
  34. Excepciones:
  35. EAccesoIndebido si el punto de interés está al final, fuera de la secuencia, es decir, si esFin() == true.
  36. Ver también:
  37. CSecuencia::esFin().
  38. */
  39. void reinicia();
  40. /*Coloca el punto de interés al principio de la secuencia.*/
  41. bool esFin() const;
  42. /*Sirve para averiguar si el recorrido de la secuencia ha terminado, es decir, si el punto de interés ya no apunta a un elemento válido de la secuencia.
  43. Devuelve:
  44. true si el punto de interés está al final del recorrido.*/
  45. bool esVacio() const;
  46. /*Sirve para averiguar si la secuencia no tiene elementos.
  47. Devuelve:
  48. true si la secuencia está vacía.*/
  49. int numElems() const;
  50. /*Devuelve el número de elementos que tiene la secuencia.
  51. Esta operación debe tener coste constante (O(1)).
  52. Devuelve:
  53. Número de elementos dentro de la secuencia.*/
  54. void invertir();
  55. void invertirAux(CNodoSecuencia<TElem> *act, CNodoSecuencia<TElem>*anterior);
  56. private:
  57. CNodoSecuencia<TElem> *_pri, *_ant;
  58. int _longitud;
  59. void libera();
  60. void copia(const CSecuencia<TElem>& secuencia);
  61. };
  62.  
  63. template <class TElem>
  64. class CNodoSecuencia {
  65. friend CSecuencia<TElem>;
  66. public:
  67. const TElem& elem() const;
  68. CNodoSecuencia<TElem>* sig() const;
  69. private:
  70. TElem _elem;
  71. CNodoSecuencia<TElem>* _sig;
  72. CNodoSecuencia();
  73. CNodoSecuencia(const TElem&, CNodoSecuencia<TElem>* = 0);
  74. };
  75.  
2  Programación / Programación C/C++ / Re: Crear funcion para el TAP TCola en: 27 Enero 2012, 15:38 pm
Ya esta solucionado

me faltaba _ult=_prim; delante de _prim=tmp;
3  Programación / Programación C/C++ / Crear funcion para el TAP TCola en: 27 Enero 2012, 14:38 pm
Hola.
Estoy haciendo una funcion lShift (int n) que desplace los elementos de la cola a la izquierda n posiciones. Si movieramos una posicion, el primer elemento de la cola seria el que estaba segundo y el último el que estaba primero.

Esta es mi solucion:

Código
  1. //Cambiamos los punteros. movemos a la izquierda n posiciones.
  2. template <class TElem>
  3. void TCola<TElem>::lShift (int n) throw (EAccesoIndebido){
  4. if (esVacio()) throw EAccesoIndebido("Cola Vacía");
  5. else if (n>0) {
  6. _ult->_sig=_prim;//el primero pasa a ser el siguiente al ultimo;
  7. TNodoCola<TElem>* tmp;
  8. tmp=_prim->_sig;
  9. _prim->_sig=0;//el siguiente al primero pasa a NULL;
  10. _prim=tmp;
  11. lShift(n-1);
  12. }
  13.  
  14. }
  15.  
La historia es que no  me funciona como quiero.
Tengo una cola de 11 elementos: 1 2 3 4 5 6 7 8 9 10 11
y al moverlo dos posiciones a la izquierda (cola.lShift(2)) me devuelve
3 4 5 6 7 8 9 10 11 2

¿Alguien ve el error?

Gracias.
4  Programación / Programación C/C++ / Re: Implementar una pila con una cola en c++ en: 25 Enero 2012, 18:14 pm
Al final consegui resolverlo implementando una funcion invertir. Muchas gracias por tu ayuda.

Código
  1. template <class TElem>
  2. void TPila<TElem>::invertir() {
  3. TElem e;
  4. if(!esVacio()){
  5. e=_cola.primero();
  6. _cola.quitaPrim();
  7. invertir();
  8. _cola.ponDetras(e);
  9.  
  10. }//end if
  11. }
  12.  
  13. template <class TElem>
  14. const TElem& TPila<TElem>::cima() throw (EAccesoIndebido){
  15.  
  16. if(esVacio()) throw EAccesoIndebido("Error: no existe cima de la pila vacía");
  17. else {
  18. invertir();
  19. TElem e=_cola.primero();
  20. invertir();
  21. return e;}
  22. }
  23.  
5  Programación / Programación C/C++ / Re: Implementar una pila con una cola en c++ en: 25 Enero 2012, 01:12 am
Gracias por tu ayuda pero con un struct tampoco me vale. Alguna otra forma?
6  Programación / Programación C/C++ / Re: Implementar una pila con una cola en c++ en: 24 Enero 2012, 17:27 pm
La historia es que tampoco puedo acceder a los atributos ni operaciones privadas de la cola (prohibido por el ejercicio en cuestión).

La cola es el único atributo de la clase TPila y sólo puedo acceder a su parte pública.

En caso de cambiar la definición de la cima como lo harías (recursivamente)?
Me estoy volviendo loco...

EI: juntando mensajes.

De la cola puedo acceder a esto.
Código
  1. template <class TElem>
  2. class TCola {
  3. public:
  4. //constructora destructora y operador de asignacion
  5. TCola();
  6. TCola(const TCola<TElem>&);
  7. ~TCola();
  8. TCola<TElem>& operator=(const TCola<TElem>&);
  9. //Operaciones de las colas
  10.  
  11. void ponDetras(const TElem&);
  12. //Pre:true
  13. //post: se añade elem al final de la cola
  14.  
  15. const TElem& primero() const throw (EAccesoIndebido);
  16. //Pre:!esVacio()
  17. //Post: Devuelve el primer elementos de la Cola
  18. //Lanza Excepcion si la cola está vacía
  19.  
  20. void quitaPrim() throw (EAccesoIndebido);
  21. //Pre !esVacio();
  22. //Post Elimina el primer elemento de la cima
  23. //Lanza la excepción
  24.  
  25. bool esVacio() const;
  26. //Pre true
  27. //Posr Devuelve true o false dependiendo de si la cola esta o no vacia
7  Programación / Programación C/C++ / Re: Implementar una pila con una cola en c++ en: 24 Enero 2012, 16:26 pm
El caso es que con tipos auxiliares no hay problema pero no me dejan usarlos.
Código
  1. template <class TElem>
  2. const TElem& TPila<TElem>::cima() const throw (EAccesoIndebido){
  3. TCola <TElem> colaAux;
  4. colaAux=_cola;
  5. if(esVacio())
  6.    throw EAccesoIndebido("Error: no existe cima de la pila vacía");
  7. else {
  8. TElem aux;
  9. while (!colaAux.esVacio()) {
  10. aux=colaAux.primero();
  11. colaAux.quitaPrim();}
  12. return aux;
  13. } //fin else
  14. }
Existe alguna forma de hacerlo sin tipos auxiliares y sin cambiar la definición de la operación?
Quizás con una función auxiliar?? Yo lo he intentando pero tampoco me deja.
Código
  1. template <class TElem>
  2. TElem TPila<TElem>::cimaAux(){
  3. TElem aux;
  4. aux=_cola.primero();
  5. _cola.
  6. cimaAux();
  7. _cola.ponDetras(aux);
  8. return aux;
  9.  
  10. }
  11.  
  12. template <class TElem>
  13. const TElem& TPila<TElem>::cima() const throw (EAccesoIndebido){
  14.  
  15. if(esVacio())
  16.    throw EAccesoIndebido("Error: no existe cima de la pila vacía");
  17. else {
  18. return cimaAux();}
  19. //fin else
  20. }
8  Programación / Programación C/C++ / Implementar una pila con una cola en c++ en: 24 Enero 2012, 14:18 pm
Buenas, estoy intentando resolver un ejercicio en el que hay que implementar una pila usando como único atributo una cola y junto con la restricción de no poder usar TADs auxiliares.

Mi problema es que no se como obtener la cima sin utilizar una cola auxiliar. La definición de la operación es esta:
Código
  1. const TElem& cima() const throw (EAccesoIndebido);
  2. //pre: !esVacio
  3. //post: devuelve la cima
  4. //Lanza excepcion si la pila esta vacia
  5.  
  6. Tendrá que ser por recursión pero dentro de esta funcion no puedo usa _cola.quitaPrimero() ni _cola.ponUltimo()porque me da error C2662.
  7.  
  8. alguien me ayuda?
  9.  
  10. Yo había pensado algo así (pero da error C2662)
  11. template <class TElem>
  12. const TElem& TPila<TElem>::cima() const throw (EAccesoIndebido){
  13.  
  14. if(esVacio())
  15.    throw EAccesoIndebido("Error: no existe cima de la pila vacía");
  16. else {
  17. TElem aux;
  18. aux=_cola.primero();
  19. _cola.
  20. cima();
  21. _cola.ponDetras(aux);
  22. return aux;}
  23. //fin else
  24. }
  25.  
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines