/* Crear una matriz n × m de naturales, donde n es la cantidad de filas y m la cantidad de columnas. La matriz creada contiene un cero en cada entrada (fila, columna) definida. Se asume que n y m son mayores que 0. Dados una matriz M, un número de fila f y un número de columna c, devolver el natural ubicado en la entrada (f, c) de M. Dados una matriz M, un número de fila f, un número de columna c y un natural elem, asignar elem a la entrada (f,c) de M. ImprimirFila e ImprimirColumna, que dadas una matriz M y un número de fila o de columna imprimen todos los elementos de la fila o de la columna, respectivamente. */ #include //POST: Devulve la matriz de tamaño n*m, con n filas y m columnas, la matriz contiene un cero en cada entrada (fila, columna) definida //PRE: m,n >0 Matriz crearMatrizNula(unsigned int n, unsigned int m); //POST:Retorna el natural ubicado en la entrada (f,c) de la matriz m //PRE: enRangoFila(f,m) && enRangoColumna(c,m) unsigned int valorFilaColumna(Matriz m, unsigned int f, unsigned int c); //POST:Asigna el natural elem en la entrada (f,c) de la matriz m, en caso de ya existir se sustituye el anterior //PRE: enRangoFila(f,m) && enRangoColumna(c,m) void asignarFilaColumna(Matriz &m, unsigned int f, unsigned int c, unsigned int elem); //POST: retorna true si y solo la fila f esta en el rango de filas definidas en la matriz m bool enRangoFila(Matriz m, unsigned int f); //POST: retorna true si y solo la columna c esta en el rango de columnas definidas en la matriz m bool enRangoColumna(Matriz m, unsigned int c); //POST: Imprime todos los elementos de la fila f en la matriz m //PRE: enRangoFila(f,m) void ImprimirFila (Matriz m, unsigned int f); //POST: Imprime todos los elementos de la columna c en la matriz m //PRE: enRangoColumna(f,m) void ImprimirColumna (Matriz m, unsigned int f); struct Celda{ unsigned int elem, nrofila, nrocolumna; Celda *sigFila, *sigColumna; } struct Cabezal{ unsigned int cantFila, cantColumna; Celda** filas; Celda** columnas; } typedef Cabezal * Matriz; Matriz crearMatrizNula(unsigned int n, unsigned int m){ Matriz nuevo = new Cabezal; nuevo->cantFila=n; nuevo->cantColumna=m; nuevo->filas= new Celda*[n]; //asumimos que arrancamos en 0,0 nuevo->columnas= new Celda*[m]; for (int i=0; ifilas[i]=NULL; } for (int i=0; icolumnas[i]=NULL; } return nuevo; } void asignarFilaColumna(Matriz &m, unsigned int f, unsigned int c, unsigned int elem) { // Crear una nueva celda Celda* nueva = new Celda; nueva->nrocolumna = c; nueva->nrofila = f; nueva->elem = elem; nueva->sigFila = NULL; nueva->sigColumna = NULL; bool existe = false; // Buscar en columna if (m->columnas[c] == NULL || m->columnas[c]->nrofila > f) { // Insertar celda al inicio nueva->sigColumna = m->columnas[c]; m->columnas[c] = nueva; } else { // Buscar si existe o el lugar donde debe insertarse Celda* iterc = m->columnas[c]; while (iterc->sigColumna != NULL && iterc->sigColumna->nrofila < f) { iterc = iterc->sigColumna; } if (iterc->sigColumna == NULL || iterc->sigColumna->nrofila > f) { // Insertar la nueva luego de iterf nueva->sigColumna = iterc->sigColumna; iterc->sigColumna = nueva; } else if (iterc->sigColumna->nrofila == f) { // La celda ya existe iterc->sigColumna->elem = elem; existe = true; } } // Insertar en la fila si la celda no existe if (!existe) { if (m->filas[f] == NULL || m->filas[f]->nrocolumna > c) { // Insertar al inicio nueva->sigFila = m->filas[f]; m->filas[f] = nueva; } else { // Buscar el lugar donde debe insertarse Celda* iterf = m->filas[f]; while (iterf->sigFila != NULL && iterf->sigFila->nrocolumna < c) { iterf = iterf->sigFila; } // Insertar la nueva celda después de iterf nueva->sigFila = iterf->sigFila; iterf->sigFila = nueva; } } else { // Liberar la memoria asociada a la nueva celda en caso de que ya existiera una delete nueva; } } int main() { printf("Hello World"); return 0; }