list.c
上传用户:jmzj888
上传日期:2007-01-02
资源大小:220k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
  2.    This file is public domain and comes with NO WARRANTY of any kind */
  3. /*
  4.   Code for handling dubble-linked lists in C
  5. */
  6. #include "mysys_priv.h"
  7. #include <list.h>
  8. /* Add a element to start of list */
  9. LIST *list_add(LIST *root, LIST *element)
  10. {
  11.   if (root)
  12.   {
  13.     if (root->prev) /* If add in mid of list */
  14.       root->prev->next= element;
  15.     element->prev=root->prev;
  16.     root->prev=element;
  17.   }
  18.   else
  19.     element->prev=0;
  20.   element->next=root;
  21.   return element; /* New root */
  22. }
  23. LIST *list_delete(LIST *root, LIST *element)
  24. {
  25.   if (element->prev)
  26.     element->prev->next=element->next;
  27.   else
  28.     root=element->next;
  29.   if (element->next)
  30.     element->next->prev=element->prev;
  31.   return root;
  32. }
  33. void list_free(LIST *root, pbool free_data)
  34. {
  35.   LIST *next;
  36.   while (root)
  37.   {
  38.     next=root->next;
  39.     if (free_data)
  40.       my_free((gptr) root->data,MYF(0));
  41.     my_free((gptr) root,MYF(0));
  42.     root=next;
  43.   }
  44. }
  45. LIST *list_cons(void *data, LIST *list)
  46. {
  47.   LIST *new=(LIST*) my_malloc(sizeof(LIST),MYF(MY_FAE));
  48.   if (!new)
  49.     return 0;
  50.   new->data=data;
  51.   return list_add(list,new);
  52. }
  53. LIST *list_reverse(LIST *root)
  54. {
  55.   LIST *last;
  56.   last=root;
  57.   while (root)
  58.   {
  59.     last=root;
  60.     root=root->next;
  61.     last->next=last->prev;
  62.     last->prev=root;
  63.   }
  64.   return last;
  65. }
  66. uint list_length(LIST *list)
  67. {
  68.   uint count;
  69.   for (count=0 ; list ; list=list->next, count++) ;
  70.   return count;
  71. }
  72. int list_walk(LIST *list, list_walk_action action, gptr argument)
  73. {
  74.   int error=0;
  75.   while (list)
  76.   {
  77.     if ((error = (*action)(list->data,argument)))
  78.       return error;
  79.     list=rest(list);
  80.   }
  81.   return 0;
  82. }