linked_list_editor_CS_521_2020_a3.py

# -*- coding: utf-8 -*- """ Created on Thu Nov 5 12:49:36 2020 @author: epinsky """ DATA = 0; NEXT_PTR = 1; PREV_PTR = 2 x = """a signal and a noise sound""" y = x.split("\n") def construct_list(y): head, tail = None, None for e in y: new_node = [ e, None, None] if head is None: head = new_node tail = new_node else: tail[NEXT_PTR] = new_node new_node[PREV_PTR] = tail tail = new_node return head, tail head, tail = construct_list(y) def print_file(head, tail, node, delta, sep="$"): next_node = head while next_node is not None: next_line = next_node[DATA] if next_node is node: print(next_line[:delta] + sep + next_line[delta : ]) else: print(next_line) next_node = next_node[NEXT_PTR] print("\n") def cmd_h(head, tail, node, delta): """ left one character """ if delta > 0: delta = delta -1 elif node is not head: node = node[PREV_PTR] prev_line = node[DATA] delta = len(prev_line) return head, tail, node, delta def cmd_j(head, tail, node, delta): """ move up vertically """ if node is not head: prev_node = node[PREV_PTR] prev_line = prev_node[DATA] if delta < len(prev_line): return head, tail, prev_node, delta else: return head, tail, prev_node, len(prev_line) else: return head, tail, node, delta def cmd_x(head, tail, node, delta): """ delete char to left of cursor """ if delta > 0: cur_line = node[DATA] updated_line = cur_line[: delta-1] + cur_line[delta : ] node[DATA] = updated_line delta = delta - 1 return head, tail, node, delta def cmd_ddp(head, tail, node, delta): """ transpose tro lines """ if node is not tail: next_node = node[NEXT_PTR] cur_line = node[DATA] next_line = next_node[DATA] node[DATA] = next_line next_node[DATA] = cur_line node = next_node return head, tail, node, delta head, tail = construct_list(y) node = head[NEXT_PTR] delta = 3 print_file(head, tail, node, delta) head, tail, node, delta = cmd_ddp(head, tail, node, delta) print_file(head, tail, node, delta) node = tail delta = 0 print_file(head, tail, node, delta) head, tail, node, delta = cmd_ddp(head, tail, node, delta) print_file(head, tail, node, delta) """ node = head[NEXT_PTR] node = tail delta = 3 print_file(head, tail, node, delta) head, tail, node, delta = cmd_x(head, tail, node, delta) print_file(head, tail, node, delta) node = tail delta = 0 print_file(head, tail, node, delta) head, tail, node, delta = cmd_x(head, tail, node, delta) print_file(head, tail, node, delta) """ """ node = head[NEXT_PTR] node = tail delta = 3 print_file(head, tail, node, delta) head, tail, node, delta = cmd_j(head, tail, node, delta) print_file(head, tail, node, delta) node = tail delta = 7 print_file(head, tail, node, delta) head, tail, node, delta = cmd_j(head, tail, node, delta) print_file(head, tail, node, delta) node = head delta = 3 print_file(head, tail, node, delta) head, tail, node, delta = cmd_j(head, tail, node, delta) print_file(head, tail, node, delta) """ """ print_file(head, tail, node, delta) head, tail, node, delta = cmd_h(head, tail, node, delta) print_file(head, tail, node, delta) delta = 0 print_file(head, tail, node, delta) head, tail, node, delta = cmd_h(head, tail, node, delta) print_file(head, tail, node, delta) delta = 0 node = head print_file(head, tail, node, delta) head, tail, node, delta = cmd_h(head, tail, node, delta) print_file(head, tail, node, delta) """