#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct lnode{
			int value;
			lnode *next;
};
typedef lnode node;

void PassPtr(int (*pt2Func)(int))
{
   int sonuc = (*pt2Func)(12);
   printf("%d",sonuc);
}

int
func(int arg){
	 return arg*arg;
}
int
func2(int arg1,int arg2){
	return arg1+arg2;
}

void map( node *root, int size , int (*pt2Func)(int))
{
   for(int i =0;i<size;i++){
	printf("value:%d",root->value);
	root->value=(*pt2Func)(root->value);
	root=root->next;
  }
}
int accumulate (node *root,int size,int nulvalue,int(*pt2Func)(int,int))
{
	int acc=(*pt2Func)(nulvalue,root->value);

	for(int i = 1 ;i<size;i++){
		root=root->next;
		acc=(*pt2Func)(acc,root->value);
	}

	return acc;
}

int main(){
			node root;
			node *a;
			a=&root;
			for(int i = 0;i<10 ; i++){
						a->value=i;
						a->next= (node* ) malloc(sizeof(node));
						a=a->next;
			}

			printf("\n------ \nbefore map\n");
			a=&root;
			for(i= 0 ;i<10;i++){
						printf("%d\n",a->value);
						a=a->next;
			}
			a=&root;
			int (*fp)(int);
			fp = func;
			map(&root,10,fp);
			printf("\n------ \nafter map\n");
			a=&root;
			for(i = 0 ;i<10;i++){
						printf("%d\n",a->value);
						a=a->next;
			}
			a=&root;
			int (*fp2)(int,int);
			fp2 = func2;
			printf("%d",accumulate(&root,10,0,fp2));

			getch();
}
