La Web del Programador: Comunidad de Programadores
 
    Pregunta:  42 - IMPLEMENTAR LAS MATRICES CON PUNTEROS EN C++
Autor:  Daniel
Parece ser que hubo problemas con una pregunta que hice el otro día, así que voy a intentar aclararla:
Estoy intentando implementar el tipo matrices (en C++). La manera lógica era, como ha respondido la mayoría de la gente, hacerlo con arrays.
Pero esto tiene el problema de que tienes que imponer el tamaño de la matriz en el momento de la programación (si no fuera así, por favor, decirme como se hace), lo que limita mucho el programa.
La otra forma lógica de hacerlo es con punteros. Con punteros té quitas el problema del tamaño, ya que en tiempo de ejecución del programa puedes decidir qué tamaño va a tener la matriz con la que vas a trabajar. Pero aparece el problema de la memoria (en el supuesto de trabajar con matrices muy grandes).
Y mi pregunta sería : ¿Implementando las matrices con punteros, hay alguna forma especialmente eficiente de hacerlo?
Esperando que quede aclarada la pregunta, espero vuestra contestación.

  Respuesta:  Daniel Salazar
Hola Tocayo:
Lo que quieres hacer (matrices vía punteros) es posible con punteros dobles. Te coloco este ejemplo para enteros:
int **matriz,filas,columnas;
void main(){
//puedes leer los valores de filas y columnas como te convenga
//acá los coloco como una asignación simple
filas = 5;
columnas = 3;
matriz = new int* [filas];
for(int i=0;i<filas;i++)
matriz[i] = new int [columnas];
//luego puedes acceder a cada posición con la notación matricial
matriz[1][1] = 10;
}
//Espero te sea útil

  Respuesta:  jenny jenny
hola:
con la lista de la que te hablan los demas podes usar una funcion llamada malloc que va piediendo memoria a medida que la vas usando o necesitando
espero que te sirva
bye
pd: en el help tenes los parametros que le tenes que pasar lo que te debue es la direccion de memoria en la que vas a guardar ese nodo
bye

  Respuesta:  alguien
Lo que quieres hacer se puede hacer de varias maneras, se denomina array indeterminado; lo puedes crear por lista enlazada, arbol binario, técnicas hash(extraer el indice de un elemento del array directamente de la información guardada en él) y por array de punteros; es demasiado extenso para explicarlo aquí con detenimiento, por lo que te ruego te informes con un buen manual...

  Respuesta:  Sergio
Si lo que pretendes es implementar las matrices has de hacerlo con una lista doblemente enlazada de punteros en caso de dos dimensiones, triplemente enlazada para tres, etc... donde el primer nivel serian las filas de la matriz, el segundo las columnas de una fila en cuestión, y así sucesivamente. En el caso de querer implementar matrices casi vacías (donde un valor se repite muchas veces), puedes prescindir de codificar este valor e implementar en la lista solo los valores que son distintos a este, incluyendo en nodo de la lista índices que te indiquen la posición de ese elemento, por ejemplo, si quieres implementar la matriz identidad de 4x4 seria algo parecido a [1000][0100][0010][0001], como el valor cero se repite mucho, se codifica solo los valores 1, de manera que cada nodo de la lista tiene un cursor que indica fila y columna del valor distindo de cero, algo parecido a [fila1,col1:1][fila2,col2:1][fila3,col3:1][fila4,col4:1] de forma que consigues representar un elemento bidimensional (matriz de 4x4) con una sola lista unidimensional, lo que simplifica el trabajo de programación y optimiza la ocupación de memoria.

  Respuesta:  Willser F. González C.
La siguiente estructura implementa una matriz usando listas enlazadas:
typedef struct Nodo
{
char cCdgo[5]; // El tipo de dato que necesite en cada campo de la matriz.
Nodo *Antrior, *Sgnte, *Arrba, *Abjo; // Obligatorio.
}nNdo;
La clave está en implementar las funciones que permitan ubicarse en una posición [i,j] de la lista en forma de matriz 2D.
Esta sería la matriz:
-----------------------------------------------
N1,1 N1,2 ... N1,j
¦ ¦ ¦ ¦
N2,1 N2,2 ... N2,j
¦ ¦ ¦ ¦
...... ......... ... .......
¦ ¦ ¦ ¦
Ni,1 Ni,2 ... Ni,j
-----------------------------------------------
Cada nodo N tiene un puntero a sus nodos adyascentes, en caso de no tener algún nodo adyascente, este apuntará a NULL. Por ejemplo, el nodo Ni,j sería así: *Antrior = Ni,j-1; *Sgnte = NULL; *Arrba = Ni-1,j y *Abjo = NULL.
Si usted ha manejado bien las operaciones como Crear, Modificar, Eliminar o Listar Nodos de una lista simple o doblemente enlazada se le facilitará la implementación, sino, envíame un E-Mail. He hecho una simulación de matrices en Borland C++ usando listas y puedo facilitarte el código. No lo adjunto a esta respuesta porque es un poco largo.

  Respuesta:  Fernando Canzani
Hola, soy de Uruguay, para implementar la clase matriz, te aconsejo que lo agas con punteros, con ellos te puedes crear arrays dinamicos que especificas el tamaño en tiempo de compilacion.
ej:
class array {

private:
int *vector, tope;
public:
/*los constructores y las operaciones que necesites implementar*/

luego haciendo la asignacion
int tamanio;
vector = new int[tamanio];
con esto te definis un array de longitud tamanio en tiempo de ejecucion;