Exemple #1
0
    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);
    }
Exemple #5
0
    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
    }