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  }