c - Getting the values of linked list with loops -
i have create function can value of matrix wich take form of double linked list. here structures of matrix
typedef struct row { unsigned int indicerow; struct row * next; struct col * data; } row; typedef struct col{ double value; unsigned int indicecolumn; struct col * next; } col; typedef struct matrix{ int nrows; int ncols; struct row * rowfirst; }matrix;
the structure matrix represent top of linked list , contain total number of rows , columns , variable row wich point first node of list of row nodes. row nodes contain number of row of matrice, variable row called next wich represent next line of matrix , variable data point list of col nodes. col nodes contains number of column, value @ coordonates(row,column) , col next. values different of 0 have in col linked list.
to value of precise point of matrix created function sp_get. take structure matrix, line , column i'm looking , double variable argument. returns 0 when works , update variable double *val value i'm looking for.
int sp_get( struct matrix *mat, unsigned int rows, unsigned int col, double *val){ row * temps = (row*)malloc(sizeof(row)); temps = mat->rowfirst; while(temps->indicerow!= rows){ temps = temps->next; } while(temps->data!= null && temps->data->indicecolumn!= col && temps->data->next!=null){ temps->data = temps->data->next; } if(temps->data->indicecolumn == col){ *(val) = temps->data->value; } else{ *(val) = 0.0; } return 0;
first create row variable run through matrix, row , column. if can't find column means value 0.
when use function 1 value, works well, , return value.(tempmatrix matrix variable , contain linked list)
double * vall =(double*)malloc(sizeof(double)); sp_get(tempmatrix, 2, 3, vall);
but when i'm using function double loop don't have same results , can't not explain why...
double * vall =(double*)malloc(sizeof(double)); int i; int j; for(i=1;i<=tempmatrix->nrows;i++){ for(j=1; j<=tempmatrix->ncols;j++){ sp_get(tempmatrix,i,j,vall); printf(" %f ", *(vall)); } printf("\n"); }
it might proble of memory leak, don't know comes from.
thanks in advance help!
just in sp_get
alone following problems abound:
memory first 2 lines.
anytime see in successive lines in c:
ptr = malloc(...) ptr = <something else>
it always memory leak.
updating column header rather enumerating it
once find row seek, this:
while(temps->data!= null && temps->data->indicecolumn!= col && temps->data->next!=null) { temps->data = temps->data->next; }
ask yourself, what is temps->data = ...
actually updating? changing temps->data
pointer point own next, means temps->data
pointed prior gone. that's fine if temps->data
temporary pointer, but isn't. data
member in row struct worked hard find in prior loop.
potential null pointer dereference
you may think having this:
while(temps->data!= null && temps->data->indicecolumn!= col && temps->data->next!=null)
for while-condition in loop harbor safety temp-data
being null code follows:
if(temps->data->indicecolumn == col) { *(val) = temps->data->value; }
but if did, why bother first clause (which correct, btw). appears addition of last clause (temps->data->next!=null
) effort stave off crashes. isn't way it.
minor: hiding type col
parameter col
needs little explanation. see var names.
minor: there no need dynamically allocate out-parameter you're using it.
your code this:
double * vall =(double*)malloc(sizeof(double)); int i, j; for(i=1;i<=tempmatrix->nrows;i++) { for(j=1; j<=tempmatrix->ncols;j++) { sp_get(tempmatrix,i,j,vall); printf(" %f ", *(vall)); } printf("\n"); }
can this:
double val = 0.0; int i, j; for(i=1;i<=tempmatrix->nrows;i++) { for(j=1; j<=tempmatrix->ncols;j++) { sp_get(tempmatrix,i,j,&val); // note address-of operator printf(" %f ", val); } printf("\n"); }
updated sp_get
i'm pretty sure you're trying do. following return 0 if indexed values found , retrieved, otherwise returns -1 , out-parameter set 0.0.
int sp_get( struct matrix const *mat, unsigned int rows, unsigned int cols, double *val) { // prime 0.0 *val = 0.0; if (!mats) return -1; // walk row table struct row const *row_ptr = mat->rowfirst; while (row_ptr && row_ptr->indicerow != rows) row_ptr = row_ptr->next; // leave if didn't find row. if (!row_ptr) return -1; struct col const *col_ptr = row_ptr->data; while (col_ptr && col_ptr->indicecolumn != cols) col_ptr = col_ptr->next; if (!col_ptr) return -1; *val = col_ptr->value; return 0; }
note modify nothing in actual matrix, entire thing, including pointers use index within it, can const
(and should be).
best of luck.
Comments
Post a Comment