#include #include #include #include Matrix applyRules (Matrix matrix,int Rules, int N){ int power = 2; int i = 0; if (Rules <= 0){ return matrix; } else { while (Rules%power == 0 ){ power*=2; } for (i=0;idata != 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;i