oldlist.cpp

来自「一OCR的相关资料。.希望对研究OCR的朋友有所帮助.」· C++ 代码 · 共 394 行

CPP
394
字号
/* -*-C-*-################################################################################# File:         list.c# Description:  List processing procedures.# Author:       Mark Seaman, Software Productivity# Created:      Thu Jul 23 13:24:09 1987# Modified:     Thu Dec 22 10:59:52 1988 (Mark Seaman) marks@hpgrlt# Language:     C# Package:      N/A# Status:       Reusable Software Component## (c) Copyright 1987, Hewlett-Packard Company.** Licensed under the Apache License, Version 2.0 (the "License");** you may not use this file except in compliance with the License.** You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software** distributed under the License is distributed on an "AS IS" BASIS,** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.** See the License for the specific language governing permissions and** limitations under the License.#################################################################################* Revision 1.13  90/03/06  15:37:54  15:37:54  marks (Mark Seaman)* Look for correct file of <malloc.h> or <stdlib.h>** Revision 1.12  90/02/26  17:37:36  17:37:36  marks (Mark Seaman)* Added pop_off and join_on*  This file contains a set of general purpose list manipulation routines.  These routines can be used in a wide variety of ways to provide several  different popular data structures. A new list can be created by declaring  a variable of type 'LIST', and can be initialized with the value 'NIL'.  All of these routines check for the NIL condition before dereferencing  pointers.  NOTE:  There is a users' manual available in printed form from  Mark Seaman at (303) 350-4492 at Greeley Hard Copy.  To implement a STACK use:  push       to add to the Stack                  l = push (l, (LIST) "jim");  pop          to remove items from the Stack     l = pop (l);  first        to access the head                 name = (char *) first (l);  To implement a QUEUE use:  push_last    to add to the Queue                 l = push_last (l, (LIST) "jim");  pop                  remove items from the Queue l = pop (l);  first                to access the head          name = (char *) first (l);  To implement LISP like functions use:  first           CAR                              x = (int) first (l);  rest            CDR                              l = rest (l);  push            CONS                             l = push (l, (LIST) this);  last            LAST                             x = last (l);  concat          APPEND                           l = concat (r, s);  count           LENGTH                           x = count (l);  search          MEMBER                           if (search (l, x, NULL))  To implement SETS use:  adjoin                                           l  = adjoin (l, x);  set_union                                        l = set_union (r, s);  intersection                                     l = intersection (r, s);  set_difference                                   l = set_difference (r, s);  delete                                           l = delete (s, x, NULL);  search                                           if (search (l, x, NULL))  To Implement Associated LISTS use:  lpush                                            l = lpush (l, p);  assoc                                            s = assoc (l, x);  adelete                                          l = adelete (l, x);  The following rules of closure exist for the functions provided.  a = first (push (a, b))  b = rest (push (a, b))  a = push (pop (a), a))        For all a <> NIL  a = reverse (reverse (a))******************************************************************************/#include "oldlist.h"#include "structures.h"#include <stdio.h>#if MAC_OR_DOS#include <stdlib.h>#else#include "freelist.h"#endif/*----------------------------------------------------------------------              M a c r o s----------------------------------------------------------------------*/#define add_on(l,x)     l = push (l,first (x))#define next_one(l)     l = rest (l)/*----------------------------------------------------------------------              F u n c t i o n s----------------------------------------------------------------------*//********************************************************************** *  c o u n t * *  Recursively count the elements in  a list.  Return the count. **********************************************************************/int count(LIST var_list) {  int temp = 0;  iterate (var_list) temp += 1;  return (temp);}/********************************************************************** *  d e l e t e    d * *  Delete all the elements out of the current list that match the key. *  This operation destroys the original list.  The caller will supply a *  routine that will compare each node to the *  key, and return a non-zero value when they match.  If the value *  NULL is supplied for is_equal, the is_key routine will be used. **********************************************************************/LIST delete_d(LIST list, void *key, int_compare is_equal) {  LIST result = NIL;  LIST last_one = NIL;  if (is_equal == NULL)    is_equal = is_same;  while (list != NIL) {    if (!(*is_equal) (first (list), key)) {      if (last_one == NIL) {        last_one = list;        list = rest (list);        result = last_one;        set_rest(last_one, NIL);      }      else {        set_rest(last_one, list);        last_one = list;        list = rest (list);        set_rest(last_one, NIL);      }    }    else {      list = pop (list);    }  }  return (result);}/********************************************************************** *  d e s t r o y * *  Return the space taken by a list to the heap. **********************************************************************/LIST destroy(LIST list) {  LIST next;  while (list != NIL) {    next = rest (list);    free_cell(list);    list = next;  }  return (NIL);}/********************************************************************** *  d e s t r o y   n o d e s * *  Return the space taken by the LISTs of a list to the heap. **********************************************************************/void destroy_nodes(LIST list, void_dest destructor) {  if (destructor == NULL)    destructor = memfree;  while (list != NIL) {    (*destructor) (first (list));    list = pop (list);  }}/********************************************************************** *  i n s e r t * *  Create a list element and rearange the pointers so that the first *  element in the list is the second aurgment. **********************************************************************/void insert(LIST list, void *node) {  LIST element;  if (list != NIL) {    element = push (NIL, node);    set_rest (element, rest (list));    set_rest(list, element);    node = first (list);    list->node = first (rest (list));    list->next->node = (LIST) node;  }}/********************************************************************** *  i s   s a m e   n o d e * *  Compare the list node with the key value return TRUE (non-zero) *  if they are equivalent strings.  (Return FALSE if not) **********************************************************************/int is_same_node(void *item1, void *item2) {  return (item1 == item2);}/********************************************************************** *  i s   s a m e * *  Compare the list node with the key value return TRUE (non-zero) *  if they are equivalent strings.  (Return FALSE if not) **********************************************************************/int is_same(void *item1, void *item2) {  return (!strcmp ((char *) item1, (char *) item2));}/********************************************************************** *  j o i n * *  Join the two lists together. This function is similar to concat *  except that concat creates a new list.  This function returns the *  first list updated. **********************************************************************/LIST join(LIST list1, LIST list2) {  if (list1 == NIL)    return (list2);  set_rest (last (list1), list2);  return (list1);}/********************************************************************** *  l a s t * *  Return the last list item (this is list type). **********************************************************************/LIST last(LIST var_list) {  while (rest (var_list) != NIL)    var_list = rest (var_list);  return (var_list);}/********************************************************************** *  n t h   c e l l * *  Return nth list cell in the list. **********************************************************************/void *nth_cell(LIST var_list, int item_num) {  int x = 0;  iterate(var_list) {    if (x++ == item_num)      return (var_list);  }  return (var_list);}/********************************************************************** *  p o p * *  Return the list with the first element removed.  Destroy the space *  that it occupied in the list. **********************************************************************/LIST pop(LIST list) {  LIST temp;  temp = rest (list);  if (list != NIL) {    free_cell(list);  }  return (temp);}/********************************************************************** *  p u s h * *  Create a list element.  Push the second parameter (the node) onto *  the first parameter (the list). Return the new list to the caller. **********************************************************************/LIST push(LIST list, void *element) {  LIST t;  t = new_cell ();  t->node = (LIST) element;  set_rest(t, list);  return (t);}/********************************************************************** *  p u s h   l a s t * *  Create a list element. Add the element onto the end of the list. **********************************************************************/LIST push_last(LIST list, void *item) {  LIST t;  if (list != NIL) {    t = last (list);    t->next = push (NIL, item);    return (list);  }  else    return (push (NIL, item));}/********************************************************************** *  r e v e r s e * *  Create a new list with the elements reversed. The old list is not *  destroyed. **********************************************************************/LIST reverse(LIST list) {  LIST newlist = NIL;  iterate (list) copy_first (list, newlist);  return (newlist);}/********************************************************************** *  r e v e r s e   d * *  Create a new list with the elements reversed. The old list is *  destroyed. **********************************************************************/LIST reverse_d(LIST list) {  LIST result = reverse (list);  destroy(list);  return (result);}/********************************************************************** *  s   a d j o i n * *  Adjoin an element to an assorted list.  The original list is *  modified.  Returns the modified list. **********************************************************************/LIST s_adjoin(LIST var_list, void *variable, int_compare compare) {  LIST l;  int result;  if (compare == NULL)    compare = (int_compare) strcmp;  l = var_list;  iterate(l) {    result = (*compare) (variable, first (l));    if (result == 0)      return (var_list);    else if (result < 0) {      insert(l, variable);      return (var_list);    }  }  return (push_last (var_list, variable));}/********************************************************************** *   s e a r c h * *  Search list, return NIL if not found. Return the list starting from *  the item if found.  The compare routine "is_equal" is passed in as *  the third paramter to this routine.   If the value NULL is supplied *  for is_equal, the is_key routine will be used. **********************************************************************/LIST search(LIST list, void *key, int_compare is_equal) {  if (is_equal == NULL)    is_equal = is_same;  iterate (list) if ((*is_equal) (first (list), key))  return (list);  return (NIL);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?