list.c
上传用户:aidanglao
上传日期:2007-01-07
资源大小:69k
文件大小:4k
源码类别:

Oracle数据库

开发平台:

Unix_Linux

  1. /**********************************************************************
  2. /* Copyright (C) 1990 - 1999 Steve A. Olson
  3. /*  11617 Quarterfield Dr
  4. /* Ellicott City, MD, 21042
  5. /* All rights reserved.
  6. /**********************************************************************
  7. /* */ 
  8. /* The LINKED-LIST API.
  9. /*
  10. /* The main LINKED-LIST routines.  This file contains most of the API
  11. /* functions -- some are in seperate modules so that target
  12. /* executables are as small as possible.
  13. /*
  14. /* Contained in this module are the following functions:
  15. /* l_create()
  16. /* l_destroy()
  17. /* l_insert()
  18. /* l_delete()
  19. /* l_find()
  20. /* */ 
  21. #include "list.h"
  22. #include "stdlib.h"
  23. /* L_CREATE -- Create a LIST.
  24. /* Create takes one paramater -- the name of the LIST CLASS, the
  25. /* name is used to lookup the INSERT, DELETE, and FIND functions
  26. /* from the LIST FUNCTION TABLE.
  27.  */
  28. LIST *
  29. l_create(char *name)
  30. {
  31. register LIST *ll;
  32. PFI lgetinsf();
  33. PFV lgetdelf();
  34. PFN lgetfindf();
  35. PFI lgetscanf();
  36. if( (ll=(LIST *)malloc(sizeof(LIST))) == NULL_LIST )
  37. return( NULL_LIST );
  38. if( ((ll->f_insert = lgetinsf(name)) == NULL_PFI ) ||
  39. ((ll->f_delete = lgetdelf(name)) == NULL_PFV ) ||
  40. ((ll->f_scan   = lgetscanf(name))== NULL_PFI ) ||
  41. ((ll->f_find   = lgetfindf(name))== NULL_PFN )
  42. ) {
  43. free( ll );
  44. return( NULL_LIST );
  45. }
  46. ll->size = 0;
  47. ll->first = NULL_LNODE;
  48. ll->last = NULL_LNODE;
  49. ll->current = NULL_LNODE;
  50. return(ll);
  51. }
  52. /* L_DESTROY -- Destroy a LIST.
  53. /*
  54. /* Destroy takes one paramater -- the LIST to be destroyed.
  55.  */
  56. int
  57. l_destroy(LIST *ll)
  58. {
  59. if(ll==NULL_LIST)
  60. return ( 0 );
  61. while(ll->first) {
  62. ll->current=ll->first;
  63. ll->first=ll->first->next;
  64. free(ll->current);
  65. }
  66. free(ll);
  67. return(1); /* returns TRUE */
  68. }
  69. /* L_INSERT -- Insert an Element into the LIST.
  70. /* Insert takes three paramaters
  71. /* LIST, the compare function, and the INFO to be INSERTED.
  72. /*
  73. /* The compare function is used for ASCEND and DESCEND LIST CLASSES
  74. /* so that the INFO gets inserted in the proper order.
  75. /*
  76. /* The compare function must take two parameters both the same type as
  77. /* INFO.  INFO already in LIST is given as the FIRST parameter and the
  78. /* NEW INFO is always the SECOND parameter. 
  79. /*
  80. /* The compare function must know how to compare the two INFO and what
  81. /* constitutes one being 'Greater Than', 'Less Than', and 'Equal To'
  82. /* another.  If the First Parameter is 'Greater Than' and Second the
  83. /*  compare function should return an INTEGER Greater Than 0.  If the
  84. /* First Parameter is 'Less Than' the Second it should return an INTEGER
  85. /* Less Than 0.  If the two are Equal the Compare function should
  86. /* return 0.
  87.  */
  88. int
  89. l_insert(LIST *ll, PFI cmp_f, void *info)
  90. {
  91. register int val;
  92. if(ll==NULL_LIST)
  93. return ( 0 );
  94. if( (val=((*ll->f_insert)(&ll->first, &ll->last, cmp_f, info)))==1)
  95. ll->size++;
  96. return( val );
  97. }
  98. /* L_DELETE -- Delete an Element LIST.
  99. /*
  100. /* Delete takes 4 arguments:
  101. /* LIST, find function, compare function, and compare INFO.
  102. /* Valid 'find function' are: NULL_PFV, l_find, l_ffirst, l_fnext,
  103. /* and l_fprev.  (NULL_PFV is used for QUEUE and STACK LISTS).
  104. /* The 'find function' sets ll->current.
  105. /*
  106. /* l_delete returns a pointer to the Deleted INFO so that the USER
  107. /* can manually free it.
  108. /*
  109. /* The 'Compare function' is the same as INSERT.
  110.  */
  111. void *
  112. l_delete(LIST *ll,PFV find_f,PFI cmp_f,void *cmp_i)
  113. {
  114. register void *info;
  115. if(ll==NULL_LIST)
  116. return ( (void *)0 );
  117. if( find_f==NULL_PFV || ((*find_f)(ll,cmp_f,cmp_i)) ) {
  118. if((info=((*ll->f_delete)(&ll->first,&ll->last,&ll->current))))
  119. ll->size--;
  120. return(info);
  121. }
  122. return( (void *)0 );
  123. }
  124. /* L_FIND -- Find an Element in the LIST.
  125. /* Find takes three paramater.
  126. /* LIST, compare function, and compare information.
  127. /* Compare function is same as INSERT.
  128.  */
  129. void *
  130. l_find(LIST *ll, PFI cmp_f, void *cmp_i)
  131. {
  132.     if(ll==NULL_LIST)
  133. return ( (void *)0 );
  134.     if((ll->current=(*ll->f_find)(&ll->first,&ll->last,ll->size,cmp_f,cmp_i)))
  135. return ( ll->current->info );
  136.     return ( (void *)0 );
  137. }
  138. /* L_SCAN -- SCAN entire LIST and invoke scan_f for every node.
  139. /* SCAN takes two paramaters.
  140. /* LIST and scan function.
  141.  */
  142. int
  143. l_scan(LIST *ll, PFI scan_f)
  144. {
  145. if(ll==NULL_LIST)
  146.     return(0);
  147. return (*ll->f_scan)(ll->first,ll->size,scan_f);
  148. }