Vous êtes sur la page 1sur 5

CONREC ACCUMULATOR DATA-TYPE linepoint VARIABLE prev AS POINTER VARIABLE next AS POINTER VARIABLE p AS POINT DATA-TYPE sequence VARIABLE

prev VARIABLE next VARIABLE head VARIABLE tail AS AS AS AS POINTER POINTER linepoint linepoint

SET FUNCTION reverse_list (sequence list) SET FUNCTION remove_sequence (sequence list) SET FUNCTION point_equal (POINT k, POINT j) SET VARIABLE s AS sequence = NULL SET VARIABLE count AS INTEGER = 0 FUNCTION conrec_sort (POINT a, POINT b) SET SET SET SET SET VARIABLE VARIABLE VARIABLE VARIABLE VARIABLE ss AS sequence = s ma AS sequence = NULL mb AS sequence = NULL prependA AS BOOLEAN = NO prependB AS BOOLEAN = NO

WHILE (ss) IF (ma == NULL) //COMMENT no match for a yet IF (point_equal(a, s.head.p)) SET ma = ss SET prependA = YES ELSE-IF (point_equal(a, s.tail.p)) SET ma = ss END-IF END-IF IF (mb == NULL) //COMMENT no match for b yet IF (point_equal(b, s.head.p)) SET mb = ss SET prependB = YES ELSE-IF (point_equal(b, s.tail.p)) SET mb = ss END-IF END-IF //COMMENT if we matched both no need to continue searching IF (ma != NULL AND mb != NULL) END-WHILE ELSE SET ss = ss.next END-IF END-WHILE //COMMENT c is the case selector based on which of ma and/or mb are set

SET VARIABLE c AS INTEGER = 0 IF (ma != NULL) SET c = 1 ELSE SET c = 0 END-IF IF (mb != NULL) SET c = 2 ELSE SET c = 0 END-IF SWITCH (c) CASE 0 //COMMENT both unmatched, add as new sequence VARIABLE aa AS linepoint LOCK MEMORY aa VARIABLE bb AS linepoint LOCK MEMORY bb SET aa.p = a SET bb.p = b SET aa.next = bb SET aa.prev = NULL SET bb.prev = aa SET bb.next = Null //COMMENT create sequence element and push onto head of main list. The order of items in this list is unimportant LOCK MEMORY ma SET ma.head = aa SET ma.tail = bb SET ma.next = s SET ma.prev = NULL IF (s) SET s.prev = ma END-IF SET s = ma //COMMENT not essential - tracks number of unmerged sequ ences INCREMENT count BREAK CASE 1 //COMMENT a matched, b did not - thus b extends sequence ma VARIABLE pp AS pointline LOCK MEMORY pp SET pp.p = b IF (prependA) SET pp.next = ma.head SET pp.prev = NULL SET ma.head.prev = pp SET ma.head = pp ELSE

SET SET SET SET END-IF BREAK CASE 2

pp.next = NULL pp.prev = ma.tail ma.tail.next = pp ma.tail = pp

//COMMENT b matched, a did not - thus a extends sequence mb VARIABLE pp AS pointline LOCK MEMORY pp SET pp.p = a IF (prependB) SET pp.next = mb.head SET pp.prev = NULL SET mb.head.prev = pp SET mb.head = pp ELSE SET pp.next = NULL SET pp.prev = mb.tail SET mb.tail.next = pp SET mb.tail = pp END-IF BREAK CASE 3 //COMMENT both matched, can merge sequences //COMMENT if the sequences are the same, do nothing, as we are simply closing this path (could set a flag) IF (ma == mb) END-CASE END-IF //COMMENT There are 4 ways the sequence pair can be join ed. The current setting of prependA and prependB will tell us which type of join is needed. //COMMENT For head/head and tail/tail joins one sequence needs to be reversed SET VARIABLE j AS INTEGER = 0 IF (prependA) SET j = 1 ELSE SET j = 0 END-IF IF (prependB) SET j = 2 ELSE SET j = 0 END-IF SWITCH (j) CASE 0 //COMMENT tail-tail, reverse ma and appe

nd to mb CALL reverse_list(ma) //COMMENT fall through to head/tail case BREAK CASE 1 //COMMENT head-tail, ma is appended to m b and ma discarded SET mb.tail.next = ma.head SET ma.head.prev = mb.tail SET mb.tail = ma.tal //COMMENT discard ma sequence record CALL remove_seq(ma) CALL free(ma) BREAK CASE 3 //COMMENT head-head, reverse ma and appe nd mb to it CALL reverse_list(ma) //COMMENT fall through to tail/head case BREAK CASE 2 //COMMENT tail-head, mb is appended to m a and mb is discarded SET ma.tail.next = mb.head SET mb.head.prev = ma.tail SET ma.tail = mb.tail //COMMENT discard mb sequence record CALL remove_sequence(mb) CALL free(mb) BREAK END-CASE BREAK END-CASE END-FUNCTION FUNCTION reverse_list (sequence list) VARIABLE pp AS linepoint VARIABLE temp AS linepoint SET pp = list.head WHILE (PP) //COMMENT swap prev/next pointers SET temp = pp.next SET pp.next = pp.prev SET pp.prev = temp //COMMENT continue trough the list SET pp = temp END-WHILE

//COMMENT swap head/tail pointers SET temp = list.head SET list.head = list.tail SET list.tail = temp END-FUNCTION FUNCTION remove_sequence(sequence list) //COMMENT if list is the first item, static ptr s is updated IF (list.prev) SET list.prev.next = list.next ELSE SET s = list.next END-IF IF (list.next) SET list.next.prev = list.prev END-IF DECREMENT count END-FUNCTION FUNCTION free_sequence (sequence list) SET VARIABLE pp AS linepoint = list.head VARIABLE tem AS linepoint WHILE (pp) SET temp = pp.next UNLOCK MEMORY pp SET pp = temp END-WHILE UNLOCK MEMORY list END-FUNCTION FUNCTION free_all() SET VARIABLE ss AS sequence = s VARIABLE temp AS sequence WHILE (ss) SET temp = ss.next CALL free_seq(ss) SET ss = temp END-WHILE SET s = NULL SET count = 0 END-FUNCTION

Vous aimerez peut-être aussi