代码如下:
#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