list.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*
  14.   Code for handling dubble-linked lists in C
  15. */
  16. #include "mysys_priv.h"
  17. #include <my_list.h>
  18. /* Add a element to start of list */
  19. LIST *list_add(LIST *root, LIST *element)
  20. {
  21.   DBUG_ENTER("list_add");
  22.   DBUG_PRINT("enter",("root: 0x%lx  element: %lx", root, element));
  23.   if (root)
  24.   {
  25.     if (root->prev) /* If add in mid of list */
  26.       root->prev->next= element;
  27.     element->prev=root->prev;
  28.     root->prev=element;
  29.   }
  30.   else
  31.     element->prev=0;
  32.   element->next=root;
  33.   DBUG_RETURN(element); /* New root */
  34. }
  35. LIST *list_delete(LIST *root, LIST *element)
  36. {
  37.   if (element->prev)
  38.     element->prev->next=element->next;
  39.   else
  40.     root=element->next;
  41.   if (element->next)
  42.     element->next->prev=element->prev;
  43.   return root;
  44. }
  45. void list_free(LIST *root, uint free_data)
  46. {
  47.   LIST *next;
  48.   while (root)
  49.   {
  50.     next=root->next;
  51.     if (free_data)
  52.       my_free((gptr) root->data,MYF(0));
  53.     my_free((gptr) root,MYF(0));
  54.     root=next;
  55.   }
  56. }
  57. LIST *list_cons(void *data, LIST *list)
  58. {
  59.   LIST *new_charset=(LIST*) my_malloc(sizeof(LIST),MYF(MY_FAE));
  60.   if (!new_charset)
  61.     return 0;
  62.   new_charset->data=data;
  63.   return list_add(list,new_charset);
  64. }
  65. LIST *list_reverse(LIST *root)
  66. {
  67.   LIST *last;
  68.   last=root;
  69.   while (root)
  70.   {
  71.     last=root;
  72.     root=root->next;
  73.     last->next=last->prev;
  74.     last->prev=root;
  75.   }
  76.   return last;
  77. }
  78. uint list_length(LIST *list)
  79. {
  80.   uint count;
  81.   for (count=0 ; list ; list=list->next, count++) ;
  82.   return count;
  83. }
  84. int list_walk(LIST *list, list_walk_action action, gptr argument)
  85. {
  86.   int error=0;
  87.   while (list)
  88.   {
  89.     if ((error = (*action)(list->data,argument)))
  90.       return error;
  91.     list=list_rest(list);
  92.   }
  93.   return 0;
  94. }