1
0
mirror of https://gitlab.com/klmp200/LO27.git synced 2024-11-05 09:18:03 +00:00

Avancé et presque fini la gestion des gaudMatrices

This commit is contained in:
Naej 2016-12-23 23:58:08 +01:00
parent f09d8fed95
commit 6d3043902c
3 changed files with 198 additions and 2 deletions

View File

@ -87,7 +87,7 @@ void removeNextRow(cellElement* tree);
/*---FreeCellElem---
*Allocates a cellElement and returns it
*Frees a cellElement and returns it
*
*@element : pointer on the allocated cellElement
*

View File

@ -1,6 +1,5 @@
#include <stdio.h>
#include <stdlib.h>
#include <CellElement.h>
#include <matrix.h>
Matrix applyRules (Matrix matrix,int Rules, int N){
@ -30,3 +29,165 @@ Matrix CreateMatrix(){
matrix.rows = CreateList();
return matrix;
}
void CreateMatrixElem(Matrix matrix, int ColPos, int RowPos){
ListElement * Row = NULL;
ListElement * Col = NULL;
int error = 0;
cellElement * elem = NULL;
cellElement * tmp = NULL;
elem = CreateCellElem();
SetPositionIndex(elem,ColPos,RowPos);
Row = GetElementPos(matrix.rows,RowPos);
if (Row != NULL && Row->data != 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->colIndex > ColPos){
elem->nextCol = tmp->nextCol;
tmp->nextCol = elem;
}else if (tmp->colIndex == ColPos){
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->rowIndex > RowPos){
elem->nextRow = tmp->nextRow;
tmp->nextRow = elem;
}else if (tmp->rowIndex == RowPos){
error ++;
}
}
}else {
push(matrix.cols,elem);
matrix.cols->tail->pos = ColPos;
}
if (error != 0){
free(elem);
}
}
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->colIndex != ColPos && elem != NULL){
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 || Row->data == NULL){
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; /* WTF ?? */
} else {
tmp->nextCol = elem->nextCol;
}
}
Col = GetElementPos(matrix.cols,ColPos);
if (Col == NULL|| Col->data == NULL){
return -2;
}
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; /* WTF ?? */
} else {
tmp->nextRow = elem->nextRow;
}
}
FreeCellElement(elem);
return 1;
}
bool GetCellValue(Matrix matrix, int ColPos, int RowPos){
if (FindMatrixElem(matrix,ColPos,RowPos) == NULL){
return false;
}
return true;
}
void SetCellValue(Matrix matrix, int ColPos, int RowPos,bool value){
if (value == true){
CreateMatrixElem(matrix,ColPos,RowPos);
}else{
SupprMatrixElem(matrix,ColPos,RowPos);
}
}
/* todos:
*gerer bornes matrice
*print matrice
*/

View File

@ -37,7 +37,42 @@ typedef struct Matrix {
*/
Matrix applyRules(Matrix matrix,int Rules, int N);
/**
*Create a void Matrix
*
*@return a matrix
*
*/
Matrix CreateMatrix();
/**
*Find and return the cell in the given matrix
*
*@param matrix the Matrix where we search
*@param ColPos an int indicating the column of the cell
*@param RowPos an int indicating the row of the cell
*
*@return a cellElement
*
*/
cellElement * FindMatrixElem(Matrix matrix, int ColPos, int RowPos);
/**
*Create the cell in the given matrix
*
*@param matrix the Matrix
*@param ColPos an int indicating the column of the cell
*@param RowPos an int indicating the row of the cell
*
*@return void
*
*/
void CreateMatrixElem(Matrix matrix, int ColPos, int RowPos);
int SupprMatrixElem(Matrix matrix, int ColPos, int RowPos);
void SetCellValue(Matrix matrix, int ColPos, int RowPos,bool value);
bool GetCellValue(Matrix matrix, int ColPos, int RowPos);
#endif