// Created by Matt Bessey on 18/01/2012. #include #include #include typedef struct { int x; int y; int value; } point; typedef struct l{ point point; struct l* next; } list; typedef struct { int n; int m; int elements; list* first; } matrix_list; typedef struct y{ int n; int m; int elements; int *IA; int *JA; int *A; } yale; matrix_list* readMatrix(FILE*); int convertMatrix(matrix_list*, yale*); matrix_list* readMatrix(FILE* file){ matrix_list* m = calloc(1, sizeof(matrix_list)); fscanf (file, "%d %*c ", &m->n); fscanf (file, "%d", &m->m); list* a = calloc(1, sizeof(list)); fscanf(file, "%d %*c%d %*c%d",&a->point.x,&a->point.y,&a->point.value); m->first = a; list* end = a; m->elements = 1; for(char c = fgetc(file); c != EOF; c = fgetc(file)){ ungetc(c, file); list* b = calloc(1,sizeof(list)); fscanf(file, "%d %*c%d %*c%d",&b->point.x,&b->point.y,&b->point.value); end->next = b; end = b; m->elements++; //printf("%d,%d,%d\n",b->point.x,b->point.y,b->point.value); } return m; } int convertMatrix(matrix_list* input, yale* output){ int matrix_elements = input->elements; int matrix_rows = input->m; int* A = (int*)calloc(matrix_elements, sizeof(int)); int* IA = (int*)calloc(matrix_rows + 1, sizeof(int)); int* JA = (int*)calloc(matrix_elements, sizeof(int)); printf("%d elements\n",matrix_elements); output->A = A; // Value output->IA = IA; // Row (X) output->JA = JA; // Column (Y) output->elements = matrix_elements; output->m = matrix_rows; output->n = input->n; list* tmp_list = input->first; for(int i = 0, j = 0, tmp_y = 0; i < matrix_elements && tmp_list!=NULL; i++){ printf("Input Value: %d \n",tmp_list->point.value); A[i] = tmp_list->point.value; // Initialise the first row if(i == 0) IA[0] = tmp_list->point.x; else{ // Add a new row index if(tmp_y != tmp_list->point.x){ j++; IA[j] = i; tmp_y = tmp_list->point.x; } } JA[i] = tmp_list->point.y; tmp_list = tmp_list->next; } for(int i = 0; i < matrix_elements; i++) printf("%d,",output->A[i]); printf("\n"); for(int i = 0; i < matrix_rows + 1; i++) printf("%d,",output->IA[i]); printf("\n"); for(int i = 0; i < matrix_elements; i++) printf("%d,",output->JA[i]); return 1; } int main (int argc, const char * argv[]) { if (argc==1) { perror("No arguments provided\n"); return -1; } FILE* pFile; pFile = fopen(argv[2], "r"); if (pFile == NULL) { perror("Couldn't open file\n"); return -1; } else { //printf("Opened file %s\n",argv[1]); } matrix_list* pre_yale = readMatrix(pFile); yale yale; convertMatrix(pre_yale, &yale); if (!strncmp(argv[1], "stage3", 6)){ printf("\n\nBegin Main\n\n"); for(int i = 0; i < yale.elements; i++) printf("%d,",yale.A[i]); printf("\n"); for(int i = 0; i < yale.m + 1; i++) printf("%d,",yale.IA[i]); printf("\n"); for(int i = 0; i < yale.elements; i++) printf("%d,",yale.JA[i]); } printf("\n"); fclose(pFile); return 0; }