home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #3 / amigamamagazinepolishissue1998.iso / szachy / gnu / amyboard-3.2.pl2 / lists.c < prev    next >
C/C++ Source or Header  |  1995-05-23  |  3KB  |  148 lines

  1. /*
  2.  * lists.c -- Functions to implement a double linked list
  3.  * XBoard $Id: $
  4.  *
  5.  * Copyright 1995 Free Software Foundation, Inc.
  6.  *
  7.  * ------------------------------------------------------------------------
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  * ------------------------------------------------------------------------
  22.  *
  23.  * This file could well be a part of backend.c, but I prefer it this
  24.  * way.
  25.  */
  26.  
  27. #include <stdio.h>
  28. #if STDC_HEADERS
  29. # include <stdlib.h>
  30. #endif /* not STDC_HEADERS */
  31.  
  32. #include "common.h"
  33. #include "lists.h"
  34.  
  35.  
  36.  
  37. /* Check, if List l is empty; returns TRUE, if it is, FALSE
  38.  * otherwise.
  39.  */
  40. int ListEmpty(l)
  41.     List *l;
  42. {
  43.     return(l->head == (ListNode *) &l->tail);
  44. }
  45.  
  46.  
  47. /* Initialize a list. Must be executed before list is used.
  48.  */
  49. void ListNew(l)
  50.     List *l;
  51. {
  52.     l->head = (ListNode *) &l->tail;
  53.     l->tail = NULL;
  54.     l->tailPred = (ListNode *) l;
  55. }
  56.  
  57.  
  58. /* Remove node n from the list it is inside.
  59.  */
  60. void ListRemove(n)
  61.     ListNode *n;
  62. {
  63.     if (n->succ != NULL) {  /*  Be safe  */
  64.     n->pred->succ = n->succ;
  65.     n->succ->pred = n->pred;
  66.     n->succ = NULL;     /*  Mark node as no longer being member */
  67.     n->pred = NULL;     /*  of a list.                          */
  68.     }
  69. }
  70.  
  71.  
  72. /* Delete node n.
  73.  */
  74. void ListNodeFree(n)
  75.     ListNode *n;
  76. {
  77.     if (n) {
  78.     ListRemove(n);
  79.     free(n);
  80.     }
  81. }
  82.  
  83.  
  84. /* Create a list node with size s. Returns NULL, if out of memory.
  85.  */
  86. ListNode *ListNodeCreate(s)
  87.     size_t s;
  88. {
  89.     ListNode *n;
  90.  
  91.     if ((n = malloc(s))) {
  92.     n->succ = NULL; /*  Mark node as not being member of a list.    */
  93.     n->pred = NULL;
  94.     }
  95.     return(n);
  96. }
  97.  
  98.  
  99. /* Insert node n into the list of node m after m.
  100.  */
  101. void ListInsert(m, n)
  102.     ListNode *m, *n;
  103. {
  104.     n->succ = m->succ;
  105.     n->pred = m;
  106.     m->succ = n;
  107.     n->succ->pred = n;
  108. }
  109.  
  110.  
  111. /* Add node n to the head of list l.
  112.  */
  113. void ListAddHead(l, n)
  114.     List *l;
  115.     ListNode *n;
  116. {
  117.     ListInsert((ListNode *) &l->head, n);
  118. }
  119.  
  120.  
  121. /* Add node n to the tail of list l.
  122.  */
  123. void ListAddTail(l, n)
  124.     List *l;
  125.     ListNode *n;
  126. {
  127.     ListInsert((ListNode *) l->tailPred, n);
  128. }
  129.  
  130.  
  131. /* Return element with number n of list l. (NULL, if n doesn't exist.)
  132.  * Counting starts with 0.
  133.  */
  134. ListNode *ListElem(l, n)
  135.     List *l;
  136.     int n;
  137. {
  138.     ListNode *ln;
  139.  
  140.     for (ln = l->head;  ln->succ;  ln = ln->succ) {
  141.     if (!n--) {
  142.         return (ln);
  143.     }
  144.     }
  145.  
  146.     return(NULL);
  147. }
  148.