github.com/pbberlin/tools@v0.0.0-20160910141205-7aa5421c2169/omap/osmaps/linked_list.go (about) 1 package osmaps 2 3 import "fmt" 4 5 func insertLinkedList(nd *node, fct1 func(string, string) bool, key, value string) bool { 6 7 inserted := false 8 9 nd.kv = append(nd.kv, kvt{key, value, noSuccessor}) 10 11 idxLastEl := len(nd.kv) - 1 12 isNewMax := false 13 14 fmt.Printf("added %v as %v\n", key, idxLastEl) 15 16 // first insert 17 if len(nd.kv) == 1 { 18 nd.min = key 19 nd.max = key 20 nd.minIdx = 0 21 report(nd) 22 return true 23 } 24 25 // new min 26 if fct1(key, nd.min) { 27 28 fmt.Printf("\t\tfound %v<%v - newMin \n", key, nd.min) 29 nd.kv[idxLastEl].succ = nd.minIdx 30 nd.min = key 31 nd.minIdx = idxLastEl 32 33 } else { 34 35 // in between or new max 36 37 ec := 0 // emergency counter 38 i := nd.minIdx 39 iPrev := nd.minIdx 40 for { 41 42 ec++ 43 if ec > cFanout+1 { 44 fmt.Printf("overflow in iteration linked list; %v\n", ec) 45 report(nd) 46 return false 47 } 48 49 // in between 50 fmt.Printf("\t\texamine %v<%v<%v - iter%v\n", nd.kv[iPrev].key, key, nd.kv[i].key, ec) 51 52 if fct1(nd.kv[iPrev].key, key) && fct1(key, nd.kv[i].key) { 53 fmt.Printf("\t\t TRUE \n") 54 prev := nd.kv[iPrev].succ 55 nd.kv[iPrev].succ = idxLastEl 56 nd.kv[idxLastEl].succ = prev 57 break 58 59 } 60 61 // new max 62 if nd.kv[i].succ == noSuccessor { 63 isNewMax = true 64 fmt.Printf("\t\tno successor, new max %v\n", key) 65 break 66 } 67 68 // 69 iPrev = i 70 i = nd.kv[i].succ 71 72 } 73 74 if isNewMax { 75 nd.kv[i].succ = idxLastEl 76 nd.max = key 77 } 78 79 } 80 81 pointerHash(&key) 82 inserted = true 83 84 report(nd) 85 86 return inserted 87 } 88 89 func report(nd *node) { 90 fmt.Printf("\t\t\t") 91 for i := 0; i < len(nd.kv); i++ { 92 fmt.Printf("%v %v | ", nd.kv[i].key, nd.kv[i].succ) 93 } 94 fmt.Printf("\n") 95 96 fmt.Printf("\t\tmin - max: %v %v \n", nd.min, nd.max) 97 fmt.Printf("\t\tminIdx-vl: %v %v \n", nd.minIdx, nd.kv[nd.minIdx].key) 98 sortedIter(nd) 99 fmt.Printf("\n") 100 101 } 102 103 func sortedIter(nd *node) { 104 105 fmt.Printf("\t\t") 106 i := nd.minIdx 107 ec := 0 // emergency counter 108 for { 109 ec++ 110 if ec > cFanout+1 { 111 fmt.Printf("overflow in iteration linked list; %v\n", ec) 112 break 113 } 114 115 fmt.Printf("%v ", nd.kv[i].key) 116 if nd.kv[i].succ == noSuccessor { 117 break 118 } 119 i = nd.kv[i].succ 120 } 121 fmt.Printf("\n") 122 123 }