/* * This is a cellular automaton library * * Copyright (C) 2016-2017 Antoine BARTUCCIO, Jean POREE DE RIDDER * * Licensed under the MIT License,(the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * hhttps://opensource.org/licenses/MIT * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include #include #include #include Matrix applyRules (Matrix matrix,int Rules, int N){ int RulesMatrix[9]; int i = 0; int power = 2; int sum = 0; int j = 0; Matrix tempMatrix1; Matrix tempMatrix2; if (Rules <= 0 || N < 1){ return matrix; } while(power<=512){ RulesMatrix[i] = Rules%power - sum; sum = Rules%power; if (RulesMatrix[i]!=0){ i++; } power*=2; } tempMatrix1 = matrixFromRules(matrix, i, RulesMatrix); for (j=1;jdata != NULL){ if (Row->data->colIndex == ColPos){ error ++; } else if (Row->data->colIndex > ColPos){ elem->nextCol = Row->data; Row->data = elem; } else { tmp = Row->data; while (tmp->nextCol != NULL && tmp->nextCol->colIndex < ColPos){ tmp=tmp->nextCol; } if (tmp->nextCol == NULL || tmp->nextCol->colIndex > ColPos){ elem->nextCol = tmp->nextCol; tmp->nextCol = elem; }else { error ++; } } }else { push(matrix.rows,elem); matrix.rows->tail->pos = RowPos; } Col = GetElementPos(matrix.cols,ColPos); if (Col != NULL && Col->data != NULL){ if (Col->data->rowIndex == RowPos){ error ++; } else if (Col->data->rowIndex > RowPos){ elem->nextRow = Col->data; Col->data = elem; } else { tmp = Col->data; while (tmp->nextRow != NULL && tmp->nextRow->rowIndex < RowPos){ tmp=tmp->nextRow; } if (tmp->nextRow == NULL || tmp->nextRow->rowIndex > RowPos){ elem->nextRow = tmp->nextRow; tmp->nextRow = elem; }else { error ++; } } }else { push(matrix.cols,elem); matrix.cols->tail->pos = ColPos; } if (error != 0){ FreeCellElement(elem); return true; }else{ return false; } } cellElement * FindMatrixElem(Matrix matrix, int ColPos, int RowPos){ ListElement * Row = NULL; cellElement * elem = NULL; Row = GetElementPos(matrix.rows,RowPos); if (Row == NULL){ return NULL; } elem = Row->data; while (elem != NULL && elem->colIndex != ColPos){ elem = elem->nextCol; } return elem; } int SupprMatrixElem(Matrix matrix, int ColPos, int RowPos){ cellElement * elem = NULL; cellElement * tmp = NULL; ListElement * Row = NULL; ListElement * Col = NULL; elem = FindMatrixElem(matrix,ColPos,RowPos); if (elem == NULL){ return 0; } Row = GetElementPos(matrix.rows,RowPos); if (Row == NULL){ return -1; } if (Row->data == NULL){ RemoveElementPos(matrix.rows,RowPos); return -1; } if (Row->data->colIndex == ColPos){ Row->data = elem->nextCol; } else { tmp = Row->data; while (tmp->nextCol != NULL && tmp->nextCol != elem){ tmp = tmp->nextCol; } if (tmp->nextCol == NULL){ return -3; /* should never happend */ } else { tmp->nextCol = elem->nextCol; } } if (Row->data == NULL){ RemoveElementPos(matrix.rows,RowPos); } Col = GetElementPos(matrix.cols,ColPos); if (Col == NULL){ return -2; } if (Col->data == NULL){ RemoveElementPos(matrix.cols,ColPos); return -1; } if (Col->data->rowIndex == RowPos){ Col->data = elem->nextRow; } else { tmp = Col->data; while (tmp->nextRow != NULL && tmp->nextRow != elem){ tmp = tmp->nextRow; } if (tmp->nextRow == NULL){ return -4; /* should never happend */ } else { tmp->nextRow = elem->nextRow; } } if (Col->data == NULL){ RemoveElementPos(matrix.cols,ColPos); } FreeCellElement(elem); return 1; } bool GetCellValue(Matrix matrix, int ColPos, int RowPos){ if (matrix.colCount <= ColPos || matrix.rowCount <= RowPos){ return ERROR; } if (FindMatrixElem(matrix,ColPos,RowPos) == NULL){ return false; } return true; } bool SetCellValue(Matrix matrix, int ColPos, int RowPos,bool value){ if (value == true){ return CreateMatrixElem(matrix,ColPos,RowPos); }else{ if ( SupprMatrixElem(matrix,ColPos,RowPos) >= 0 ){ return true; }else{ return false; } } } void BasicPrintMatrix(Matrix matrix){ /* Non optimisé : debug fx */ int i = 0; int j = 0; bool b; printf("\n---PRINT MATRIX---\n"); for (i=0;inextRow != NULL){ RecursiveFreeCol(matrix,elem->nextRow); } if (elem->nextRow == NULL){ Row = GetElementPos(matrix.rows,elem->rowIndex); if (Row == NULL || Row->data == NULL ){ return ERROR; /*should never happend*/ } if (Row->data->colIndex == elem->colIndex){ Row->data = NULL; } else { tmp = Row->data; while (tmp->nextCol != NULL && tmp->nextCol != elem){ tmp = tmp->nextCol; } if (tmp->nextCol == NULL){ return ERROR; /* should never happend */ } else { tmp->nextCol = elem->nextCol; } } FreeCellElement(elem); return true; } return false; /* should never happend */ } Matrix freeMatrix(Matrix matrix){ int i = 0; int j = 0; for (i=0;isize == 0 || matrix.rows->size == 0){ return true; } return false; } bool isMatrixSquare(Matrix matrix){ if (matrix.colCount == matrix.rowCount){ return true; } return false; } bool isColumnEmpty(Matrix matrix,int nb){ ListElement * Col = NULL; if (matrix.colCount < 1 || matrix.rowCount < 1){ return true; } if (matrix.cols->size == 0 || matrix.rows->size == 0){ return true; } Col = GetElementPos(matrix.cols,nb); if (Col == NULL || Col->data == NULL){ return true; } return false; } bool isRowEmpty(Matrix matrix,int nb){ ListElement * Row = NULL; if (matrix.colCount < 1 || matrix.rowCount < 1){ return true; } if (matrix.cols->size == 0 || matrix.rows->size == 0){ return true; } Row = GetElementPos(matrix.rows,nb); if (Row == NULL || Row->data == NULL){ return true; } return false; } bool equalsMatrix(Matrix m1, Matrix m2){ int i = 0; int j = 0; if (m1.colCount == m2.colCount && m1.rowCount == m2.rowCount){ for (i=0;i