[2] | 1 | // linked.hpp - linked list and linked list node classes |
---|
| 2 | // written June 2, 1992 by Jonathan Clark (at home) |
---|
| 3 | // these classes provide the basic groundwork for any future linked list |
---|
| 4 | // please derive your own linked_node subclass and define the virtual |
---|
| 5 | // function compare. |
---|
| 6 | // example compare function |
---|
| 7 | // virtual int compare(void *n1, int field) |
---|
| 8 | // {return ((classname *) n1)->data > data);} |
---|
| 9 | // should return (1 if n1 is greater than (self)) else return 0 |
---|
| 10 | // field is the value determined by linked_list::set_sort_field |
---|
| 11 | // this defaults to 1 |
---|
| 12 | |
---|
| 13 | |
---|
| 14 | #ifndef linkman |
---|
| 15 | #define linkman |
---|
| 16 | #include <stdio.h> |
---|
| 17 | #include <stdlib.h> |
---|
| 18 | #include <string.h> |
---|
| 19 | |
---|
| 20 | #define loop(controll,first,inside) { (linked_node *)controll=first; \ |
---|
| 21 | if (first) do { inside (linked_node *) controll=controll->next(); } \ |
---|
| 22 | while ((linked_node *) controll!=first); } |
---|
| 23 | |
---|
| 24 | #define loopt(type,controll,first,inside) { controll=(type *)(first); \ |
---|
| 25 | if (first) do { inside controll=(type *)(controll->next()); } \ |
---|
| 26 | while (controll!=(type *)(first)); } |
---|
| 27 | |
---|
| 28 | |
---|
| 29 | #define loop_rev(controll,last,inside) { (linked_node *)controll=last; \ |
---|
| 30 | if (first) do { inside (linked_node *) controll=controll->last(); } \ |
---|
| 31 | while ((linked_node *) controll!=last); } |
---|
| 32 | |
---|
| 33 | #define loopct(type,controll,first,cond,inside) { controll=(type *)first; \ |
---|
| 34 | if (first && (cond)) do { inside controll=(type *)controll->next(); } \ |
---|
| 35 | while (controll!=(type *)first && (cond)); } |
---|
| 36 | |
---|
| 37 | #define loop_fort(type,controll,first,x) \ |
---|
| 38 | int x=0; \ |
---|
| 39 | if (first) \ |
---|
| 40 | for (controll=(type *)(first); \ |
---|
| 41 | (!x || (controll)!=(type *)(first));\ |
---|
| 42 | controll=(type *)(controll->next()),x++) |
---|
| 43 | |
---|
| 44 | #define loop_forct(type,controll,first,cond,x) int x=0; if (first) for \ |
---|
| 45 | (controll=(type *)(first);cond && (!x || controll!=(type *)(first));\ |
---|
| 46 | controll=(type *)(controll->next()),x++) |
---|
| 47 | |
---|
| 48 | class linked_node |
---|
| 49 | { |
---|
| 50 | class linked_node *nextp, *lastp; |
---|
| 51 | public: |
---|
| 52 | virtual int compare(void *n1, int field) {return(0);} // default is = (equal) |
---|
| 53 | class linked_node *next() {return nextp;} |
---|
| 54 | class linked_node *last() {return lastp;} |
---|
| 55 | void set_next(class linked_node *p) {nextp=p;} |
---|
| 56 | void set_last(class linked_node *p) {lastp=p;} |
---|
| 57 | virtual ~linked_node() { ; } |
---|
| 58 | linked_node() { nextp=NULL; lastp=NULL; } |
---|
| 59 | }; |
---|
| 60 | |
---|
| 61 | // this is the basic class for all linked_list |
---|
| 62 | // it's features should beself explanitory |
---|
| 63 | // openly use the functions listed after the keyword PUBLIC |
---|
| 64 | // type conversions may be nessary if you derive a class of nodes of your own |
---|
| 65 | // for example shape is an class derived from linked_node. |
---|
| 66 | // to add a shape to linked lis I have to say |
---|
| 67 | // mylist.add_end( (linked_node *) myshape_pointer); |
---|
| 68 | // unlink removes a node from the list via pointers but does not deallocate |
---|
| 69 | // it from the heap |
---|
| 70 | // the destructor for linked_list will get dispose of all the nodes as |
---|
| 71 | // well, so if you don't want something deleted then you must unlink |
---|
| 72 | // it from the list before the destructor is called |
---|
| 73 | |
---|
| 74 | class linked_list |
---|
| 75 | { |
---|
| 76 | class linked_node *fn, *cn; // first and current nodes |
---|
| 77 | int nn; char sortby; |
---|
| 78 | public : |
---|
| 79 | linked_list(linked_node *first=NULL); |
---|
| 80 | void add_front(class linked_node *p); |
---|
| 81 | void add_end(class linked_node *p); |
---|
| 82 | void insert(class linked_node *p); |
---|
| 83 | void set_sort_field(int x) {sortby=x;} // this is passed to compare |
---|
| 84 | class linked_node *current() {return cn;} |
---|
| 85 | class linked_node *first() {return fn;} |
---|
| 86 | class linked_node *last() {return fn->last();} |
---|
| 87 | class linked_node *get_node(int x); |
---|
| 88 | void set_current(class linked_node *p) {cn=p;} |
---|
| 89 | void go_first() {cn=fn;} |
---|
| 90 | void go_end() {cn=fn->last();} |
---|
| 91 | void go_next() {cn=cn->next();} |
---|
| 92 | void go_last() {cn=cn->last();} |
---|
| 93 | int number_nodes() {return nn;} |
---|
| 94 | int node_number(linked_node *p); |
---|
| 95 | int unlink(linked_node *p); |
---|
| 96 | ~linked_list(); |
---|
| 97 | }; |
---|
| 98 | |
---|
| 99 | #endif |
---|
| 100 | |
---|
| 101 | |
---|
| 102 | |
---|