TIP: Click on subject to list as thread! ANSI
echo: c_echo
to: John Grey
from: Kurt Kuzba
date: 1998-07-03 05:24:50
subject: LISTLINK.C 2/5

/*_|_|   LISTLINK.C   ( part 2 of 5 )
_|_|_|   Heavily commented example of using linked lists in C.
_|_|_|   No warrantee or guarantee is given or implied.
_|_|_|   PUBLIC DOMAIN   by Kurt Kuzba.  (7/3/1998)*/
void Dec_It(LinkedList *LL)
{                              /*   Decrement the list iterator.  */
   ListData *LD = LL->item;    /*   Set up a ListData pointer.    */
   if(LD->iterator > 1)        /*   Test for first list element.  */
   {
      LD->it = LD->it->prev;   /*   Set iterator to prev element. */
      LD->iterator--;          /*   Update iterator numerator.    */
   }
   else
   {
      if(LD->items)
      {
         LD->it = LL->prev;    /*   Wrap to first list element.   */
         LD->iterator = LD->items;
      }                        /*   Update iterator numerator.    */
   }
}
int Set_It(LinkedList *LL, int i)
{                              /*   Set the iterator element.     */
   ListData *LD = LL->item;    /*   Set up a ListData pointer.    */
   if(i items && i > 0) /*   Check bounds, set iterator.   */
      LD->it = List_Walk(LL, LD->iterator = i);
   return LD->iterator;        /*   Return iterator numerator.    */
}
void *Get_It(LinkedList *LL)
{                              /*   Get the iterator item.        */
   ListData *LD = LL->item;    /*   Set up a ListData pointer.    */
   return LD->it->item;        /*   Return the iterator item.     */
}
LinkedList *Know_It(LinkedList *LL)
{                              /*   Get the iterator element.     */
   ListData *LD = LL->item;    /*   Set up a ListData pointer.    */
   return LD->it;              /*   Return the iterator element.  */
}
void Swap_List(LinkedList *LL, int a, int b)
{
   void *it;                   /*   Set up a temp item pointer.   */
   LinkedList *at, *bt;        /*   Set up temp list pointers.    */
   ListData *LD = LL->item;    /*   Set up a ListData pointer.    */
   if(a > 0 && a items && b > 0
&& b items)
   {                           /*   Perform bounds check on a & b.*/
      at = List_Walk(LL, a);   /*   Get the pointer to element a. */
      bt = List_Walk(LL, b);   /*   Get the pointer to element b. */
      it = at->item;           /*   Get the item pointer from a.  */
      at->item = bt->item;     /*   Redefine item pointer for a.  */
      bt->item = it;           /*   Redefine item pointer for b.  */
   }
}
void Del_iList(LinkedList *LL, int i)
{                              /*   Remove a known list element.  */
   LinkedList *item = List_Walk(LL, i), *nxt, *prv;
   ListData *LD = LL->item;    /*   Set up a ListData pointer.    */
   if(item)                    /*   Test for valid list element.  */
   {
      nxt = item->next;        /*   Get next list element.        */
      prv = item->prev;        /*   Get prev list element.        */
      free(item->item);        /*   Free list item.               */
      free(item);              /*   Free list element.            */
      if(nxt && prv)           /*   Test for mid-list element.    */
      {
         nxt->prev = prv;      /*   Link next element to prev.    */
         prv->next = nxt;      /*   Link prev element to next.    */
      }
      if(nxt && !prv)          /*   Test for first list element.  */
      {
         LL->next = nxt;       /*   Link next as first element.   */
         nxt->prev = NULL;     /*   Set prev link to NULL.        */
      }
      if(prv && ! nxt)         /*   Test for last list element.   */
      {
         LL->prev = prv;       /*   Link prev as first element.   */
         prv->next = NULL;     /*   Set next link to NULL.        */
      }
      if(!prv && !nxt)         /*   Test for only list element.   */
         LL->prev = LL->next = NULL;
      LD->items--;             /*   Update list items counter.    */
      LD->iterator = (LD->iterator > LD->items)
      ?  LD->items             /*   Update iterator numerator.    */
      :  LD->iterator;
      Set_It(LL, LD->iterator);/*   Update list iterator.         */
   }
}
/*_|_|   end   LISTLINK.C   ( part 2 of 5 )   */

> ] So far, nobody has ever wanted to ride the Unicorn twice....

---
* Origin: *YOPS ]I[* 8.4 GIG * RA/FD/FE * Milwaukee, WI (1:154/750)
SEEN-BY: 396/1 622/419 632/371 633/260 267 270 371 634/397 635/506 728
SEEN-BY: 639/252 670/213 218
@PATH: 154/750 222 396/1 633/260 635/506 728 633/267

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.