|
|
1.1 ! root 1: /******************************************************************* ! 2: * * ! 3: * File: CIFPLOT/heap.c * ! 4: * Written by Dan Fitzpatrick * ! 5: * copyright 1980 -- Regents of the University of California * ! 6: * * ! 7: ********************************************************************/ ! 8: ! 9: #include <stdio.h> ! 10: #include "defs.h" ! 11: #include "structs.h" ! 12: #include "out_structs.h" ! 13: ! 14: #define INITHSIZE 256 ! 15: #define FATHER(a) ((a)-1)/2 ! 16: #define LEFTSON(a) ((a)+1)*2 - 1 ! 17: #define RIGHTSON(a) ((a)+1)*2 ! 18: ! 19: #define COMPARE(x,s) h.h[x]->min - h.h[s]->min ! 20: #define LESSEQUAL(x,s) h.h[x]->min <= h.h[s]->min ! 21: #define GREATERTHAN(x,s) h.h[x]->min > h.h[s]->min ! 22: #define SWITCH(x,y) { HTemp = h.h[x]; h.h[x] = h.h[y]; h.h[y] = HTemp; } ! 23: ! 24: instance *HTemp; ! 25: ! 26: typedef struct temp723 { ! 27: instance **h; ! 28: int size,n; ! 29: } Heap; ! 30: ! 31: int UnActMark = -INFINITY; ! 32: ! 33: Heap h; ! 34: ! 35: InitHeap() ! 36: /* Allocate space and initalize pointers */ ! 37: { ! 38: h.h = (instance **) alloc(INITHSIZE*sizeof(instance *)); ! 39: h.n = 0; ! 40: h.size = INITHSIZE; ! 41: } ! 42: ! 43: PutHeap(v) ! 44: instance *v; ! 45: /* Put what v points to into a heap where f is a function ! 46: that compares values. */ ! 47: { ! 48: register int a,f; ! 49: ! 50: if(h.n == h.size) { ! 51: h.size *= 2; ! 52: h.h = (instance **) expand(h.h,h.size*sizeof(instance *)); ! 53: } ! 54: h.h[h.n] = v; ! 55: a = h.n++; ! 56: f = FATHER(a); ! 57: while(a > 0 && GREATERTHAN(f,a)) { ! 58: SWITCH(f,a); ! 59: a = f; ! 60: f = FATHER(a); ! 61: } ! 62: } ! 63: ! 64: instance * ! 65: PeekHeap() ! 66: { ! 67: if(h.n == 0) return(NIL); ! 68: return(h.h[0]); ! 69: } ! 70: ! 71: instance * ! 72: GetHeap() ! 73: { ! 74: register instance *hold; ! 75: ! 76: if(h.n != 0) { ! 77: hold = h.h[0]; ! 78: --h.n; ! 79: SWITCH(0,h.n); ! 80: SortHeap(0); ! 81: return(hold); ! 82: } ! 83: else ! 84: return(NIL); ! 85: } ! 86: ! 87: SortHeap(a) ! 88: register int a; ! 89: { ! 90: register int r,l; ! 91: ! 92: while(1) { ! 93: if((l=LEFTSON(a)) >= h.n) return; ! 94: if((r=RIGHTSON(a)) >= h.n) { ! 95: if(GREATERTHAN(a,l)) ! 96: SWITCH(a,l); ! 97: return; ! 98: } ! 99: if(LESSEQUAL(a,r) && LESSEQUAL(a,l)) return; ! 100: if(LESSEQUAL(l,r)) { ! 101: SWITCH(a,l); ! 102: a = l; ! 103: } ! 104: else { ! 105: SWITCH(a,r); ! 106: a = r; ! 107: } ! 108: } ! 109: } ! 110: ! 111: #define UHASH(x) ABS((((int) x) % UTBLSIZE)) ! 112: ! 113: List UnAct[UTBLSIZE]; ! 114: int UnActCount = 111; ! 115: ! 116: InitUnAct() ! 117: { ! 118: int i; ! 119: for(i=0;i<UTBLSIZE;i++) ! 120: InitList(&(UnAct[i])); ! 121: UnActCount = 0; ! 122: } ! 123: ! 124: FindNext(n) ! 125: register int n; ! 126: { ! 127: register instance *p; ! 128: register int i; ! 129: ! 130: for(i=0;i<16;i++) { ! 131: p = (instance *) &(UnAct[UHASH(n+i)]); ! 132: if(p->Link != NIL && p->Link->min == n+i) { ! 133: NextUnAct = MIN(n+i,Top); ! 134: return(NextUnAct); ! 135: } ! 136: } ! 137: NextUnAct = MIN(n+i,Top); ! 138: return(NextUnAct); ! 139: } ! 140: ! 141: PutUnAct(e) ! 142: instance *e; ! 143: { ! 144: register instance *p; ! 145: register List *l; ! 146: ! 147: if(e->min < UnActMark) ! 148: /* ! 149: if(e->min == UnActMark-1) ! 150: /* Let's ignore floating point round off errors */ ! 151: /* ! 152: e->min = UnActMark; ! 153: else ! 154: */ ! 155: Error("Element submitted past deadline in PutUnAct",INTERNAL); ! 156: UnActCount++; ! 157: l = &(UnAct[UHASH(e->min)]); ! 158: e->Link = NIL; ! 159: if(l->Link == NIL) { ! 160: l->Link = (Element *) e; ! 161: return; ! 162: } ! 163: for(p = (instance *) l; p->Link != NIL; p=p->Link) ! 164: if(e->min <= p->Link->min) { ! 165: e->Link = p->Link; ! 166: p->Link = e; ! 167: return; ! 168: } ! 169: p->Link = e; ! 170: return; ! 171: } ! 172: ! 173: instance * ! 174: GetUnAct(i) ! 175: int i; ! 176: { ! 177: register instance *e; ! 178: register List *l; ! 179: ! 180: if(i < UnActMark) ! 181: Error("GetUnAct called in bad order",INTERNAL); ! 182: UnActMark = i; ! 183: l = &(UnAct[UHASH(i)]); ! 184: ! 185: e = (instance *) l->Link; ! 186: if(e==NIL) return(NIL); ! 187: if(e->min == i) { ! 188: l->Link = (Element *) e->Link; ! 189: e->Link = NIL; ! 190: --UnActCount; ! 191: return(e); ! 192: } ! 193: if(e->min > i) { ! 194: return(NIL); ! 195: } ! 196: Error("UnActiveList is out of order",INTERNAL); ! 197: return(NIL); ! 198: } ! 199: ! 200: CheckUnAct() { ! 201: int i; ! 202: for(i=0;i<UTBLSIZE;i++) ! 203: if(UnAct[i].Link!=NIL) { ! 204: fprintf(stderr,"UnActiveList is NOT empty\n"); ! 205: return; ! 206: } ! 207: fprintf(stderr,"the un active list is empty\n"); ! 208: if(UnActCount != 0) { ! 209: fprintf(stderr,"the count is %d\n",UnActCount); ! 210: } ! 211: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.