public ListaCruzada MultiplicarMatrizes(ListaCruzada outra) { ListaCruzada matrizMultiplicada = null; if (qtasColunas == outra.qtasLinhas) //para as matrizes serem compatíveis para multiplicação o numero de colunas de uma deve ser igual ao numero de linhas da outra { matrizMultiplicada = new ListaCruzada(qtasLinhas, outra.qtasColunas); //a matriz resultante possui o numero de linhas da primeira e de colunas da segunda Celula cabecaThis = cabeca.Abaixo; // cabecaThis representa as cabecas das linhas do this int linha = 1; //começa na linha 1 while (cabecaThis != cabeca) //as cabecas das linhas do this são percorridas até que se retorne à cabeca { int coluna = 1; //começa na coluna 1 Celula cabecaOutra = outra.cabeca.Direita; // cabecaOutra representa as cabecas das colunas da matriz outra while (cabecaOutra != outra.cabeca) // as cabecas das colunas da outra são percorridas até que se retorne à cabeca desta { Celula atualColunaOutra = cabecaOutra.Abaixo; //percorre as linhas referentes à coluna apontada pelo cabecaOutra Celula atualLinhaThis = cabecaThis.Direita; //percorre as colunas referentes à linha apontada pelo cabecaThis double resultado = 0; //armazena o resultado da multiplicação while (atualColunaOutra != cabecaOutra && atualLinhaThis != cabecaThis) //percorre até que um dos atuais chegue à sua cabeça correspondente { if (atualLinhaThis.Coluna == atualColunaOutra.Linha) //na multiplicação a coluna da primeira matriz // será multiplicada à linha de numero correspondente da outra, por isso verificamos // se os seus valores correspondem { resultado += atualLinhaThis.Valor * atualColunaOutra.Valor; //multiplica-se os elementos e se soma a resultado atualColunaOutra = atualColunaOutra.Abaixo; //anda atualColunaOutra atualLinhaThis = atualLinhaThis.Direita; //anda atualLinhaThis } else if (atualLinhaThis.Coluna > atualColunaOutra.Linha) //se não corresponderem e a coluna do this for maior que a linha do outra, apenas a outra anda { atualColunaOutra = atualColunaOutra.Abaixo; } else //se o contrário dos anteriores ocorrer, apenas a linha anda { atualLinhaThis = atualLinhaThis.Direita; } } matrizMultiplicada.Inserir(linha, coluna, resultado); //insere-se o resultado na matriz multiplicada, na linha e coluna contadas pelas variáveis linha e coluna cabecaOutra = cabecaOutra.Direita; //anda para a próxima cabeça coluna++; //aumenta coluna } cabecaThis = cabecaThis.Abaixo; //anda para a próxima cabeça linha++; //aumenta linha } } return(matrizMultiplicada); //retorna a matriz multiplicada que, se os elementos não forem compatíveis, é null }
/// <summary> /// Construtor de cópia para criar uma matriz identica a passada como parâmetro. /// </summary> /// <param name="l">Matriz que será copiada para a nova lista.</param> public ListaCruzada(ListaCruzada l) { if (l == null) { throw new ArgumentNullException(); } this.primeira = l.primeira; this.linhas = l.linhas; this.colunas = l.colunas; }
public object Clone() { ListaCruzada l = null; try { l = new ListaCruzada(this); } catch (Exception e) { } return(l); }
public override bool Equals(object obj) { if (obj == this) { return(true); } if (obj == null) { return(false); } ListaCruzada l = obj as ListaCruzada; if (l.linhas != linhas) { return(false); } if (l.colunas != colunas) { return(false); } var atualThis = primeira.Abaixo.Direita; var atualObj = l.primeira.Abaixo.Direita; while (atualThis.Linha > primeira.Linha && atualObj.Linha > l.primeira.Linha) { while (atualThis.Coluna > primeira.Coluna && atualObj.Coluna > l.primeira.Coluna) { if (!atualThis.Equals(atualObj)) { return(false); } atualThis = atualThis.Direita; atualObj = atualObj.Direita; } atualThis = atualThis.Abaixo.Direita; atualObj = atualObj.Abaixo.Direita; } return(true); }
public ListaCruzada SomarMatrizes(ListaCruzada outra) //método responsável por realizar a soma de duas matrizes { ListaCruzada matrizSoma = null; if (qtasLinhas == outra.qtasLinhas && qtasColunas == outra.qtasColunas) //verificamos se as matrizes são de dimensões iguais { matrizSoma = new ListaCruzada(qtasLinhas, qtasColunas); //instanciamos a matriz que será o resultado Celula colunaThis = cabeca.Direita, colunaOutra = outra.cabeca.Direita; //criamos as celulas de cabeca de linha e coluna //que serão utilizadas como parametro ao longo do método while (colunaThis != cabeca || colunaOutra != outra.cabeca) //enquanto a coluna não tiver acabado { if (colunaThis != cabeca && colunaOutra != outra.cabeca) //se as colunas não estiverem na cabeça da matriz { Celula linhaCabecaThis = colunaThis, linhaCabecaOutra = colunaOutra; //criamos cabecas de linha e as posicionamos Celula linhaThis = colunaThis.Abaixo, linhaOutra = colunaOutra.Abaixo; // posicionamos a variavel na celula while (linhaThis != linhaCabecaThis || linhaOutra != linhaCabecaOutra) //enquanto não percorrer toda a linha { if (linhaThis != linhaCabecaThis && linhaOutra != linhaCabecaOutra) //se a linha não estiver vazia { if (linhaThis.Linha == linhaOutra.Linha) // se elas estiverem na mesma linha, significa que há valor { //nas duas matrizes nesta posição if (linhaThis.Valor + linhaOutra.Valor != 0) //se a soma dos valores for diferente de zero { matrizSoma.Inserir(linhaThis.Linha, linhaThis.Coluna, linhaThis.Valor + linhaOutra.Valor); //inserimos na matriz a soma } linhaThis = linhaThis.Abaixo; //descemos para a próxima linha linhaOutra = linhaOutra.Abaixo; } //se a linha atual for menor, significa que na outra matriz //não há nenhum valor na linha da matriz this else if (linhaThis.Linha < linhaOutra.Linha) { //portanto apenas inserimos ['this' na matriz e seguimos para a próxima linha matrizSoma.Inserir(linhaThis.Linha, linhaThis.Coluna, linhaThis.Valor); linhaThis = linhaThis.Abaixo; } //no caso abaixo não há nenhum valor nesta linha na this, mas há na outra //portanto apenas inserimos a outra na nova matriz else { matrizSoma.Inserir(linhaOutra.Linha, linhaOutra.Coluna, linhaOutra.Valor); linhaOutra = linhaOutra.Abaixo; } } //se só a this é diferente da cabeça da coluna //inserimos a celula da this na nova matriz //e seguimos para a próxima linha da this else if (linhaThis != linhaCabecaThis) { matrizSoma.Inserir(linhaThis.Linha, linhaThis.Coluna, linhaThis.Valor); linhaThis = linhaThis.Abaixo; } //se só a outra é diferente da cabeça da coluna //inserimos a celula da outra na nova matriz //e seguimos para a próxima linha da outra else { matrizSoma.Inserir(linhaOutra.Linha, linhaOutra.Coluna, linhaOutra.Valor); linhaOutra = linhaOutra.Abaixo; } } //seguimos para a próxima coluna colunaThis = colunaThis.Direita; colunaOutra = colunaOutra.Direita; } //caso só a coluna da this seja diferente da cabeca, significa que não tem mais nada na outra //apenas precisaremos inserir os valores da coluna da this //e por fim prosseguimos para a proxima coluna de this else if (colunaThis != cabeca) { Celula linhaCabeca = colunaThis; Celula linha = colunaThis.Abaixo; while (linha != linhaCabeca) { matrizSoma.Inserir(linha.Linha, linha.Coluna, linha.Valor); linha = linha.Abaixo; } colunaThis = colunaThis.Direita; } //caso só a coluna da toutrahis seja diferente da cabeca, significa que não tem mais nada na this //apenas precisaremos inserir os valores da coluna da outra //e por fim prosseguimos para a proxima coluna de outra else { Celula linhaCabeca = colunaThis; Celula linha = colunaOutra.Abaixo; while (linha != linhaCabeca) { matrizSoma.Inserir(linha.Linha, linha.Coluna, linha.Valor); linha = linha.Abaixo; } colunaOutra = colunaOutra.Direita; } } return(matrizSoma); //retornamos a matriz somada } return(matrizSoma); //retorna null caso as matrizes não sejam de tamanho igual }