函数式C代码

代码如下:

#include <stdlib.h>
#include <stdio.h>
typedef char String[32];
typedef FILE* File;

typedef struct _Employee {
        String name;
        int age;
        int salary;
        struct _Employee *next;
} *Employee;

typedef void (*Callback)(Employee);

/* High Order Functions */
void foreach(Employee e, Callback fn) {
     Employee p;
     while (p = e) {
           e = e->next; /* Avoid *next be changed in fn */
           fn(p);
     }
}

void with_open_file(String filename, String mode, Callback fn, Employee e) {
     File file = freopen(filename, mode, (mode[0] == 'r'? stdin: stdout));
     if (file == NULL) {
        fprintf(stderr, "Cannot open %s with %s mode.
", filename, mode);
        exit(EXIT_FAILURE);
     }
     fn(e);
     fclose(file);
}

/* Destructor */
static void employee_free_node(Employee e) {
       if (e != NULL) {
          free(e);
       }
}

void employee_free(Employee e) {
     foreach(e, employee_free_node);
}

/* Input */
static void employee_read_node(Employee node) {
       Employee e = NULL, *head = (Employee*) node;
       e = *head = (Employee)calloc(1, sizeof(struct _Employee));
       if (e != NULL && scanf("%s%d%d", e->name, &e->age, &e->salary) != 3) {
          employee_free(e);
          *head = NULL;
       }
}

void employee_read(Employee list) {
     Employee e = NULL, *head = (Employee*) list, tail = NULL;
     *head = NULL;
     while (employee_read_node((Employee)&e), e) {
           if (*head != NULL) {
              tail->next = e;
              tail = e;
           } else {
             *head = tail = e;
           }
     }
}

/* Output */
static void employee_print_node(Employee e) {
       printf("%s %d %d
", e->name, e->age, e->salary);
}

void employee_print(Employee e) {
     foreach(e, employee_print_node);
}

/* Business Logic */
static void employee_adjust_salary_node(Employee e) {
       if (e->salary < 30000) {
          e->salary += 3000;
       }
}

void employee_adjust_salary(Employee e) {
     foreach(e, employee_adjust_salary_node);
}

int main(void) {
    Employee e = NULL;
    with_open_file("work.txt", "r", employee_read, (Employee)&e);
    employee_print(e);
    employee_adjust_salary(e);
    employee_print(e);
    with_open_file("work.txt", "w", employee_print, e);
    employee_free(e);
    return EXIT_SUCCESS;
}

work.txt

William 35 28000
Kishore 41 35000
Wallace 37 23000
Bruce 39 18000
原文地址:https://www.cnblogs.com/code-style/p/3286984.html