#include #include #include #include #include "representacaoPorLinhasCruzadas.h" using namespace std; NO sentinela; RESP_COMPARA compara(NO* no, int i, int j) { if(no->i == i && no->j == j) { return IGUAL; } if(no->i < i || (no->i == i && no->j < j)) { return MENOR; } return MAIOR; } NO* novoNo(int i, int j, int info, NO* proxL, NO* proxC) { NO* no = (NO*) malloc(sizeof(NO)); no->proxL = proxL; no->proxC = proxC; no->i = i; no->j = j; no->info = info; return no; } void inicializa(MATRIZ* A, int nLinhas, int nColunas) { A->cabecaLinha = (NO**) malloc (sizeof(NO*) * nLinhas); A->cabecaColuna = (NO**) malloc (sizeof(NO*) * nColunas); A->nLinhas = nLinhas; A->nColunas = nColunas; for(int i = 0; i < nLinhas; i++) { A->cabecaLinha[i] = novoNo(-1, -1, -1, &sentinela, &sentinela); } for(int i = 0; i < nColunas; i++) { A->cabecaColuna[i] = novoNo(-1, -1, -1, &sentinela, &sentinela); } } bool contains(MATRIZ* A, int i, int j) { sentinela.j = j+1; NO* no; for(no = A->cabecaLinha[i]->proxL; no->j < j; no = no->proxL); return no->j == j; } void imprime(MATRIZ* A) { for(int i = 0; i < A->nLinhas; i++) { for(NO* no = A->cabecaLinha[i]->proxL; no != &sentinela; no = no->proxL) { cout << "A[" << no->i << "][" << no->j << "] = " << (char)no->info << endl; } } cout << " --- " << endl; for(int i = 0; i < A->nColunas; i++) { for(NO* no = A->cabecaColuna[i]->proxC; no != &sentinela; no = no->proxC) { cout << "A[" << no->i << "][" << no->j << "] = " << (char)no->info << endl; } } } // assume que A[i][j] != NULL int get(MATRIZ* A, int i, int j) { sentinela.j = j+1; NO* no; for(no = A->cabecaLinha[i]->proxL; no->j < j; no = no->proxL); if(no->j == j) { return no->info; } exit(0); // ERRO } void set(MATRIZ* A, int i, int j, int info) { NO* l = A->cabecaLinha[i]; NO* c = A->cabecaColuna[j]; // --- insere na linha --- sentinela.j = j+1; while(l->proxL->j < j){ l = l->proxL; } // coordenada ja existe? if(l->proxL->j == j){ l->proxL->info = info; return; } NO* novo = novoNo(i, j, info, NULL, NULL); novo->proxL = l->proxL; l->proxL = novo; // ----------------------- // --- insere na coluna --- sentinela.i = i+1; while(c->proxC->i < i){ c = c->proxC; } novo->proxC = c->proxC; c->proxC = novo; // ----------------------- } MATRIZ* multiplica(MATRIZ* A, MATRIZ* B) { // exercicio } int main() { MATRIZ A; inicializa(&A, 7, 8); set(&A, 6, 7, 'H'); set(&A, 3, 3, 'C'); set(&A, 2, 3, 'A'); set(&A, 2, 6, 'B'); set(&A, 6, 5, 'F'); set(&A, 6, 6, 'G'); set(&A, 4, 3, 'D'); set(&A, 5, 3, 'E'); imprime(&A); }