• Jueves 14 de Noviembre de 2024, 17:11

Autor Tema:  Matrices por listas doblemente enlazadas  (Leído 7948 veces)

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Matrices por listas doblemente enlazadas
« en: Jueves 12 de Marzo de 2009, 15:40 »
0
Buenas, les escribo porque tengo varias dudas sobre como enlazar varias listas.
Les explico, quiero hacer una Sopa de Letras en la que yo introduzca el numero de columnas y de filas y por supuesto la sopa de letras entera.
Para ello yo he creado 3 archivos:
matriz.h : definicion d las funciones y los structs
matriz.cpp : las funciones que utilizare.
sopa.cpp : dond esta el int y llamara a todas las dmas funciones.

en el matriz .h estan las siguientes structuras


Código: C++
  1. struct Filas{
  2.     char dato;        // char para introducir el caracter
  3.     Filas *sig_fila;  
  4. };
  5.  
  6. struct Columnas{
  7.     Filas *filas;
  8.     Columnas *sig_columna;
  9. };
  10.  
  11. struct Matriz {
  12.     int nf;    // numero filas
  13.     int nc;   //numero columnas
  14.     Columnas *m;   
  15. };
  16.  


En el matriz.cpp tengo las funciones:


Código: C++
  1. void CrearMatriz (Matriz &M,int f, int c)
  2. {
  3.     M.nf=f;
  4.     M.nc=c;
  5.  
  6.     M.m = new Columnas[c];
  7.    
  8.     Columnas *aux;
  9.     aux = new Columnas[c];
  10.  
  11.     aux = M.m -> sig_columna;
  12.     Filas *aux1;
  13.  
  14.     for (int i=0;i<f;i++)
  15.     {
  16.         aux1 = new Filas[f];
  17.         aux1 = aux1 -> sig_fila;
  18.             for (int j=0;j<c;j++)
  19.             {
  20.                 aux -> sig_columna;
  21.             }                              
  22.     }
  23. }
  24.  

Supuestamente en el crear matriz lo unico que tengo que hacer es resolver la memoria para la matriz M y sus filas y columnas.


void SetMatriz (Matriz &M,int f,int c,char d) En esta funcion tengo que hacer la implementacion para que me meta en f (fila) c(columna) el caracter que le he pasado dsde el LeerMatriz()


Código: C++
  1. void LeerMatriz(Matriz& M)
  2. {
  3. int f,c;
  4. cout <<"Introduzca filas y columnas" << endl;
  5. cin >> f;
  6. cin >> c;
  7. char aux;
  8.  
  9. CrearMatriz(M,f,c);
  10.  
  11. cout << "Introduzca letras" << endl;
  12. for (int i=0;i<f;i++)
  13. {
  14.  
  15.     for (int j=0;j<c;j++)
  16.     {
  17.         cin >> aux;
  18.         SetMatriz(M,i,j,aux);
  19.        
  20.     }
  21. }
  22. cout << endl;
  23. EscribirMatriz(M);
  24. }
  25.  


Mi pregunta es, que cuando se va al SetMatriz y despues de introducir las letras, ya que hasta el introducir me lo hace todo bien, me da un fallo de segmentacion.

En el crearmatriz() que es lo que tengo que hacer realmente? Está bien reservado ls espacios de memoria? no estoy seguro de haberlo hecho bien.

en el setmatriz() bastaria con un M.m[f][c] = d???

la verdad esque estoy bastante liado con ls punteros porque no se si realmente estan apuntando bien.

Si alguien m puede ofrecer un poco de ayuda o guia de como hacerlo, lo agradeceria, gracias y un saludo!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #1 en: Jueves 12 de Marzo de 2009, 16:24 »
0
Esto:

Código: C
  1. void CrearMatriz (Matriz &M,int f, int c)
  2.  
debería ser:

Código: C
  1. void CrearMatriz (Matriz *M,int f, int c)
  2.  
porque lo que pasas es un puntero a la matriz M.

A ver si así se quita el error de violación de segmento.

Salud.

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #2 en: Jueves 12 de Marzo de 2009, 16:31 »
0
qeva asi m sale el error matriz.cpp:8: error: solicitud por el miembro ‘nf’ en ‘M’, el cual es del tipo ‘Matriz*’ que no es clase

gracias :)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #3 en: Jueves 12 de Marzo de 2009, 16:33 »
0
Claro, porque ahora M es un puntero y ya no vale M.nf, sino M->nf. ¡A ver si nos fijamos!  ^_^

Salud

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #4 en: Jueves 12 de Marzo de 2009, 16:48 »
0
Esque tengo que utilizar la siguiente estructura:

matriz.h
void CrearMatriz(Matriz &M, int f, int c);
int FilasMatriz(const Matriz &M);
int ColumnasMatriz(const Matriz &M);
void SetMatriz(Matriz &M,int f,int c,char d);
int GetMatriz(const Matriz &M,int i,int j);
void DestruirMatriz(Matriz &M);

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #5 en: Jueves 12 de Marzo de 2009, 17:03 »
0
Cita de: "rkneko"
Esque tengo que utilizar la siguiente estructura:

matriz.h
void CrearMatriz(Matriz &M, int f, int c);
int FilasMatriz(const Matriz &M);
int ColumnasMatriz(const Matriz &M);
void SetMatriz(Matriz &M,int f,int c,char d);
int GetMatriz(const Matriz &M,int i,int j);
void DestruirMatriz(Matriz &M);
Ok, ¿te dan los prototipos y tienes que hacer las funciones, a eso te refieres, no?

Bueno me he fijado mejor en tu código y veo que mezclas C y C++. Aclaremos las cosas primero: ¿C o C++?

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #6 en: Jueves 12 de Marzo de 2009, 17:38 »
0
exacto m dan ls prototipos y tengo q realizar las funciones.
pues es c++... no sabia q sstaba mzclando codigo

EI: juntando mensajes.

lo que yo no se hacer es el SetMatriz(M,f,c,d);

en esa funcion se debe de dar la matriz M la fila f a introducir yla columna n, y por ultimo el caracter q vas a introducir M[f][c]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #7 en: Jueves 12 de Marzo de 2009, 17:51 »
0
Cita de: "rkneko"
pues es c++... no sabia q sstaba mzclando codigo
¿Dónde están las clases entonces? Si no hay clases, no hay objetos, no hay C++. Creo que deberías reescribir la parte de declaración de tipos como clases.

Salud

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #8 en: Jueves 12 de Marzo de 2009, 17:55 »
0
Esque no nos permiten utilizar las clases todavia, esto es un ejrcicio d clase, y tenemos q implementarlo tal y como esta y con listas entrelazadas.

Elproblema que se me presenta ami es el de como lleno la matriz con la funcion setmatriz?

gracias :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #9 en: Jueves 12 de Marzo de 2009, 18:02 »
0
Cita de: "m0skit0"
Cita de: "rkneko"
pues es c++... no sabia q sstaba mzclando codigo
¿Dónde están las clases entonces? Si no hay clases, no hay objetos, no hay C++. Creo que deberías reescribir la parte de declaración de tipos como clases.

Salud

Mejor volve a leer el codigo, eso no es C ni de lejos y si es codigo valido en C++ (un lenguaje multiparadigma).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #10 en: Jueves 12 de Marzo de 2009, 18:06 »
0
Cita de: "Eternal Idol"
Mejor volve a leer el codigo, eso no es C ni de lejos y si es codigo valido en C++ (un lenguaje multiparadigma).
Pues vale. Si compila, tira. Ayúdale tú, que sabes más.

Salud.

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #11 en: Jueves 12 de Marzo de 2009, 18:11 »
0
No joe no t pongas asi mosqito q eres el unico q m esta ayudando con esto.

El mensaje del otro no sirve para lo que yo pido, que no es otra cosa que ayuda sobre como poder llenar una matriz hecha con listas enlazadas, porfavor si fueras tan amable de ayudarme, muchas gracias :)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #12 en: Jueves 12 de Marzo de 2009, 18:18 »
0
No, si no me molesto, es que simplemente no llego a entender estas mezclas multiparadigma (ni para qué sirven) y seguramente Eternal Idol te guiará mejor que yo.

Por ejemplo:
Código: C++
  1. aux = new Columnas[c];
  2.  
no sé qué pretendes con esto, ni siquiera entiendo por qué te compila  :huh: Así que sobrepasa mis conocimientos, eso es todo.

Salud y no te desanimes

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #13 en: Jueves 12 de Marzo de 2009, 18:21 »
0
pueees ai lo q intento  esq la struct Columnas me reserve tantos sitios como c(columnas) tenga,

gracias

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #14 en: Jueves 12 de Marzo de 2009, 18:26 »
0
Ah, ok, ya lo pillo, soy un poco lerdo la verdad  :P

Tampoco entiendo a qué viene:
Código: C++
  1. aux = M.m -> sig_columna;
  2.  
¿Por qué te saltas la primera columna?

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #15 en: Jueves 12 de Marzo de 2009, 18:32 »
0
aux = M.m -> sig_columna;

pues ai lo q qiero decir esqe... M.m (q es d tipo columna) apunte a sig_columna (q es d tipo columna) por lo q aux estara apuntando a asiguiente columna no?
esq si t dgo la verdad... el codigo de crearmatriz() lo he hecho, compila sin errores y no se ni como porque esq no se lo q tengo q hacer.




lo unico que tengo quehacer es reservar sitios para la matriz.


gracias :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #16 en: Jueves 12 de Marzo de 2009, 18:32 »
0
Cita de: "m0skit0"
Pues vale. Si compila, tira. Ayúdale tú, que sabes más.

Por supuesto que compila algo como esto:
Código: Text
  1. aux = new Columnas[c];
  2.  

¿Donde esta el problema? ¿Probaste a compilarlo por casualidad?

Cita de: "m0skit0"
No, si no me molesto, es que simplemente no llego a entender estas mezclas multiparadigma (ni para qué sirven) y seguramente Eternal Idol te guiará mejor que yo.

Si no entendes C++ entonces abstenete de hacer afirmaciones como la que hiciste. En cuanto a lo que yo haga sera lo que tenga ganas de hacer, nada mas y nada menos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #17 en: Jueves 12 de Marzo de 2009, 18:37 »
0
Aunque la afirmacion no fuera cierta y estemos hablando de c++ no hay que decir las cosas así como tu pusistes el mensaje y resaltar que se esta equivocando, todo el mundo se equivoca pero por lo que veo es el unico en este foro en el que no se las da de entendido e intenta ayudarme en todo lo posible, y eso es lo que se tiene que valorar. Espero que tus proximos mensajes eternal sean para algo de ayuda sino te pediria porfavor que no molestases mas con esos mensajes que no sirvver para nada, espero que no te tomes a mal mi mensaje,  gracias y un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #18 en: Jueves 12 de Marzo de 2009, 18:43 »
0
Cita de: "rkneko"
Aunque la afirmacion no fuera cierta y estemos hablando de c++ no hay que decir las cosas así como tu pusistes el mensaje y resaltar que se esta equivocando, todo el mundo se equivoca pero por lo que veo es el unico en este foro en el que no se las da de entendido e intenta ayudarme en todo lo posible, y eso es lo que se tiene que valorar. Espero que tus proximos mensajes eternal sean para algo de ayuda sino te pediria porfavor que no molestases mas con esos mensajes que no sirvver para nada, espero que no te tomes a mal mi mensaje,  gracias y un saludo.

Que m0skit0 intente publicar la mayor cantidad de mensajes posibles, con o sin utilidad, es irrelevante, mi respuesta viene totalmente al caso: no es util expandir conceptos erroneos. Solucionar tu problema en particular es algo puramente secundario para este foro, deberias depurar tu codigo y resolverlo por vos mismo. Si te molestan mis intervenciones te recomiendo la puerta de salida, asi de simple, no estas en condiciones de hablar sobre el foro en ningun sentido al ser unicamente un newbie que jamas participo mas que en un hilo para pedir ayuda.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #19 en: Jueves 12 de Marzo de 2009, 18:47 »
0
No nos desviemos del tema por favor.

Código: C++
  1. aux = M.m -> sig_columna;
  2.  
Sí, entiendo lo que hace, pero no por qué lo haces...

Cita de: "rkneko"
o unico que tengo quehacer es reservar sitios para la matriz.
Ya lo has hecho con el new()

Cita de: "rkneko"
Espero que tus proximos mensajes eternal sean para algo de ayuda sino te pediria porfavor que no molestases mas con esos mensajes que no sirvver para nada, espero que no te tomes a mal mi mensaje, gracias y un saludo.
Uf, no sabes dónde te estás metiendo...  :D  :lol:

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #20 en: Jueves 12 de Marzo de 2009, 18:55 »
0
ok...entonces el crearmatriz q tengo queda asi:

Código: C++
  1. void CrearMatriz (Matriz &M,int f, int c)
  2. {
  3.     M.nf=f;
  4.     M.nc=c;
  5.  
  6.     M.m = new Columnas[c];
  7.     Columnas *aux;
  8.     aux = new Columnas[c];
  9.     Filas *aux1;
  10.  
  11.     for (int i=0;i<f;i++)
  12.     {
  13.         aux1 = new Filas[f];
  14.             for (int j=0;j<c;j++)
  15.             {
  16.                 aux -> sig_columna;
  17.             }                              
  18.     }
  19. }
  20.  



esta parte del codigo entonces que realiza? la reserva de memoria y yasta no?

gracias x seguir ahi :)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #21 en: Viernes 13 de Marzo de 2009, 09:46 »
0
Bien, hoy que estoy más despejado, te cuento:

Haces la reserva 2 veces, que es algo que veo superfluo:

Código: C++
  1. M.m = new Columnas[c];
  2. [...]
  3. aux = new Columnas[c];
  4.  
Si lo que quieres es recorrer Columnas sin modificar el valor de M.m, entonces sustituye la asignación de aux por:

Código: C++
  1. aux = M.m
  2.  
Así apuntas a las columnas que ya has creado y no creas otras nuevas, que es lo que haces.

Aparte, creo que tu código de creación de filas está mal (no puedo comprobarlo en estos momentos). Ya que tú mismo has definido las filas dentro de las columnas, entonces es más lógico recorrer las columnas y asignarles las filas y no viceversa como los has hecho. Algo tan sencillo como:

Código: C++
  1. int i;
  2. [...]
  3. //Recorremos todas las columnas
  4. for (i=0;i<c;i++)
  5. {
  6.     //Creamos las filas de la columna actual
  7.     aux->filas = new Filas[f];
  8.     //Pasamos a la siguiente columna
  9.     aux = aux->sig_columna;
  10. }
  11.  

Espero no haberme equivocado en nada  &lt;_&lt;  Ya me cuentas.

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #22 en: Viernes 13 de Marzo de 2009, 17:20 »
0
muyyy buenas y gracias x seguir ahi :)

ya consegui el crearmatriz(), abase de comerme el depurador aver que hacia y ya he conseguido gracias a tu consejo de quitar uno d las asignaciones, aqui no tengo el codigo pero funciona y me reserva la memoria tatas como columnas y filas tenga :)) ya entendi eso.. gracias a Dios!!

jeje aora a ota cosa... y es lo de recorrer para que me inserte los datos, lo haria como tu pero nos dijeron que recorremos una fila, y en esa fila ahi tantas columnas como hallamos creado, lo tengo puesto así en los structs asique debo ceñirme a eso, hare lo que me has dicho pero cambiando el orden d filas y columnas y en cuanto pueda te comento porque es lo unico que me queda, asipues muuuuuuchas gracias y ya t dire :)

un saludo!

EI: juntando mensajes.

aux = aux->sig_columna;

eso hace que pase a la siguiente column de la fila??

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Matrices por listas doblemente enlazadas
« Respuesta #23 en: Lunes 16 de Marzo de 2009, 09:44 »
0
Cita de: "rkneko"
lo haria como tu pero nos dijeron que recorremos una fila, y en esa fila ahi tantas columnas como hallamos creado, lo tengo puesto así en los structs asique debo ceñirme a eso,
Tú tienes puesto en las declaraciones de tipos que las filas pertenecen a las columnas (por decirlo de alguna forma) y no al revés. Si te fijas, te va a resultar difícil recorrer filas asignando las columnas porque el tipo Filas no tiene ninguna referencia a qué columna pertenece, pero las columnas sí hacen referencia a las filas que poseen.

Para hacerlo al revés (recorrer filas y no columnas) sin caer en un lío, te aconsejo que cambies tus tipos:

Código: C
  1. struct Columnas{
  2.     char dato;        // char para introducir el caracter
  3.     Columnas *sig_columna;  
  4. };
  5.  
  6. struct Filas{
  7.     Columnas *columnas;
  8.     Filas *sig_fila;
  9. };
  10.  
  11. struct Matriz {
  12.     int nf;    // numero filas
  13.     int nc;   //numero columnas
  14.     Filas *m;  
  15. };
  16.  
Así puedes usar el código que te puse sin mucha modificación.

Cita de: "rkneko"
aux = aux->sig_columna;
eso hace que pase a la siguiente column de la fila??
Bueno, como ya te he dicho, según tus tipos, son las columnas las que tienen filas, y con aux = aux->sig_columna pasas a la siguiente columna (como está comentado en el código que te puse).

rkneko

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Matrices por listas doblemente enlazadas
« Respuesta #24 en: Lunes 16 de Marzo de 2009, 21:51 »
0
ok hecho queda, gracias! :)