//H ASKHSH APOTELEITE APO 3 ARXEIA! //askisi1.c ////////////////////////////////////////////////////// #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "list.h" /*line and column size */ #define LIN 3 #define COL 4 void input_table(int*,int,int); void print_table(int*,int,int); void print_list(list*); int main(int argc, char *argv[]) { int cnt1,cnt2,a[LIN][COL],*b; input_table((int*)a,LIN,COL); /*gemizoume ton pinaka */ /****************************************************** IMPORTANT NOTE: o arithmos twn stoixiwn einai tyxeos kai dinete apo mia rand(). Yparxei loipon periptosi na einai 0 kai etsi o pinakas na einai kenos! Se afthn tin periptwsh, ksanatrexte to programma ******************************************************/ list *mylist = ttol(a,LIN,COL); /*Metatrepoume ton pinaka se lista */ b = ltot(mylist); /*Metatrepoume tin Lista se Pinaka */ printf("Note: The table is filled randomly, so there is a chanse to be blank!\n\n"); /*Emfanisi */ print_table(a,LIN,COL); /*Arxikos pinakas */ print_list(mylist); /*Eikona tis listas */ print_table(b,LIN,COL); /*Pinakas-apotelesma apo lista */ return EXIT_SUCCESS; /*Finished */ } /*Gemizoume ton pinaka me Tyxea Stoixeia, Se tyxeo arithmo (mikrotero apo ta misa stoixeia gia na einai areos. */ void input_table(int *tbl, int x, int y) { srand (time(NULL)); int tmp,elm = rand()%((x*y)/2); /*Arxikopoioume me 0 */ for (tmp = 0; tmp < x*y; tmp++) tbl[tmp] = 0; /*Gemizoume tuxees theseis me tixea noumera */ for (tmp = rand()%(x*y);elm > 0;tmp = rand()%(x*y)){ if (!*(tbl+tmp)){ /*Diaforo tou 0 */ tbl[tmp] = rand()%100; elm--; } } return; /*Finished & return */ } void print_table(int *tbl, int x, int y) { int cnt1,cnt2; /*xrisimopoiontas diktes einai diskolo na diaxeiristoume disdiastatous (h kai perisoterwn diastasewn) pinakes Gi afto tha doulepsoume etsi: pter[X*linesize + offset] */ for (cnt1 = 0; cnt1 < 3; cnt1++){ for (cnt2 = 0; cnt2 < 4; cnt2++) printf ("%d\t",tbl[cnt1*4 + cnt2]); printf("\n"); } printf("\n\n"); /*Emfanisi enos kenou */ return; /*Finished & return */ } void print_list(list *mylist) { node *tmpnode; /*Diatrexoume kai tiponoume tin lista */ for (tmpnode = mylist->head; tmpnode; tmpnode = tmpnode->next) printf("%d\t%d\t%d\n",tmpnode->coors[0],tmpnode->coors[1],tmpnode->val); printf("\n\n"); /*Emfanisi enos kenou */ return; /*Finished & return */ } ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// //list.c ///////////////////////////////////////////////////////////////////////// #include #include #include "list.h" /*definition of structs */ /*Sinartiseis gia diaxeirisi listas */ node * list_createitem(int,int,int); void list_additem(list*,node*); /*"Kyries" synarthseis */ list* ttol(int*,int,int); /*table to list */ int* ltot(list*); /*list to table */ node * list_createitem(int x, int y, int val) { node *newnode = (node *)malloc(sizeof(node)); newnode->coors[0] = x; newnode->coors[1] = y; newnode->val = val; newnode->next = NULL; return newnode; /*Finished & return */ } void list_additem(list *mylist, node *newnode) { if (mylist->head == NULL) /*adeia lista */ { mylist->head = newnode; /*Arxikopoioume head */ mylist->tail = mylist->head; } else { mylist->tail->next = newnode; /*Prosthetoume sthn oura */ mylist->tail = mylist->tail->next; } return; /*Finished & return */ } list* ttol(int *tbl, int x, int y) { int cnt1,cnt2; node *tmpnode; list *mylist = (list*)malloc(sizeof(list)); /*thetoume NULL gia apofigi provlimatwn */ mylist->head = NULL; mylist->tail = NULL; tmpnode = list_createitem(x,y,0); /*1st node with dimentions */ list_additem(mylist, tmpnode); /*psaxnoume ton pinaka gia mh mhdenika stoixeia */ for (cnt1 = 0; cnt1 < x; cnt1++){ for (cnt2 = 0; cnt2 < y; cnt2++){ if (tbl[cnt1*y + cnt2] != 0){ /*mh mhdeniko */ /*Dimiourgoume komvo kai prosthetoume stin lista */ tmpnode = list_createitem(cnt1,cnt2,tbl[cnt1*y + cnt2]); list_additem(mylist, tmpnode); } } } return mylist; /*Finished & return */ } int* ltot(list *mylist) { int x,y,tmp,*tbl; node *tmpnode; /*Diastaseis gia desmefsi mnimis */ x = mylist->head->coors[0]; y = mylist->head->coors[1]; tbl=(int*)malloc(x*y*sizeof(int)); for (tmp = 0; tmp < x*y; tmp++) tbl[tmp] = 0; /*Arxikopoioume se "0" */ /*Diatrexoume tin lista kai antikathistoume ston pinaka */ for (tmpnode = mylist->head->next; tmpnode != NULL; tmpnode = tmpnode->next) tbl[tmpnode->coors[0]*y + tmpnode->coors[1]] = tmpnode->val; return tbl; /*Finished & return */ } ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// //list.h ///////////////////////////////////////////////////////////////////////// #ifndef LIST_H #define LIST_H /*Node struct */ typedef struct list_entry { int coors[2],val; /*coordinates and value */ struct list_entry *next; }node; /*List struct */ typedef struct { node *head; node *tail; }list; #endif