fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define DEF_LinkedList(T) \
  6. typedef struct _LinkedList##T{ \
  7. T value; \
  8. struct _LinkedList##T *next; \
  9. } LinkedList##T; \
  10. LinkedList##T *LinkedList##T##_New(const T *value){ \
  11. LinkedList##T *result = calloc(0, sizeof(LinkedList##T)); \
  12. memcpy(&result->value, value, sizeof(T)); \
  13. return result; \
  14. } \
  15. void LinkedList##T##_Free(LinkedList##T *list) { \
  16. LinkedList##T *prev; \
  17. while(prev = list){ \
  18. list = list->next; \
  19. free(prev); \
  20. } \
  21. free(list); \
  22. } \
  23. LinkedList##T *LinkedList##T##_Top(LinkedList##T *list){ \
  24. if(!list) NULL; \
  25. while(list->next) list = list->next; \
  26. return list; \
  27. }\
  28. int LinkedList##T##_Push(LinkedList##T *list, const T *value){ \
  29. if(list == NULL) return LinkedList##T##_New(value); \
  30. LinkedList##T *top = LinkedList##T##_Top(list); \
  31. top->next = LinkedList##T##_New(value); \
  32. return list; \
  33. } \
  34. void LinkedList##T##_ForEach(const LinkedList##T *list, void(*op)(const T *)){ \
  35. while(list){ \
  36. op(&list->value); \
  37. list = list->next; \
  38. } \
  39. }
  40.  
  41. typedef int Int;
  42. DEF_LinkedList(Int);
  43.  
  44.  
  45. void printOp(const int *v){
  46. printf("%i", *v);
  47. }
  48.  
  49. int main(void) {
  50. LinkedListInt *list;
  51. int i;
  52. for(i = 0; i <= 10; ++i)
  53. list = LinkedListInt_Push(list, &i);
  54.  
  55. LinkedListInt_ForEach(list, printOp);
  56.  
  57. LinkedListInt_Free(list);
  58. return 0;
  59. }
  60.  
Success #stdin #stdout 0s 2184KB
stdin
Standard input is empty
stdout
012345678910