list.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:2k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/list.doc,v 1.11 1997/02/21 19:46:01 drh Exp $";
  2. #include <stdarg.h>
  3. #include <stddef.h>
  4. #include "assert.h"
  5. #include "mem.h"
  6. #include "list.h"
  7. #define T List_T
  8. T List_push(T list, void *x) {
  9. T p;
  10. NEW(p);
  11. p->first = x;
  12. p->rest  = list;
  13. return p;
  14. }
  15. T List_list(void *x, ...) {
  16. va_list ap;
  17. T list, *p = &list;
  18. va_start(ap, x);
  19. for ( ; x; x = va_arg(ap, void *)) {
  20. NEW(*p);
  21. (*p)->first = x;
  22. p = &(*p)->rest;
  23. }
  24. *p = NULL;
  25. va_end(ap);
  26. return list;
  27. }
  28. T List_append(T list, T tail) {
  29. T *p = &list;
  30. while (*p)
  31. p = &(*p)->rest;
  32. *p = tail;
  33. return list;
  34. }
  35. T List_copy(T list) {
  36. T head, *p = &head;
  37. for ( ; list; list = list->rest) {
  38. NEW(*p);
  39. (*p)->first = list->first;
  40. p = &(*p)->rest;
  41. }
  42. *p = NULL;
  43. return head;
  44. }
  45. T List_pop(T list, void **x) {
  46. if (list) {
  47. T head = list->rest;
  48. if (x)
  49. *x = list->first;
  50. FREE(list);
  51. return head;
  52. } else
  53. return list;
  54. }
  55. T List_reverse(T list) {
  56. T head = NULL, next;
  57. for ( ; list; list = next) {
  58. next = list->rest;
  59. list->rest = head;
  60. head = list;
  61. }
  62. return head;
  63. }
  64. int List_length(T list) {
  65. int n;
  66. for (n = 0; list; list = list->rest)
  67. n++;
  68. return n;
  69. }
  70. void List_free(T *list) {
  71. T next;
  72. assert(list);
  73. for ( ; *list; *list = next) {
  74. next = (*list)->rest;
  75. FREE(*list);
  76. }
  77. }
  78. void List_map(T list,
  79. void apply(void **x, void *cl), void *cl) {
  80. assert(apply);
  81. for ( ; list; list = list->rest)
  82. apply(&list->first, cl);
  83. }
  84. void **List_toArray(T list, void *end) {
  85. int i, n = List_length(list);
  86. void **array = ALLOC((n + 1)*sizeof (*array));
  87. for (i = 0; i < n; i++) {
  88. array[i] = list->first;
  89. list = list->rest;
  90. }
  91. array[i] = end;
  92. return array;
  93. }