class node:
# Public Data : INTEGER
    # Public nextNode : INTEGER
    def __init__(self, DataP, nextNodeP):
        self.Data = DataP
        self.nextNode = nextNodeP
# DECLARE linkedList : ARRAY[0:9] OF node
linkedList = [node(1, 1), node(5, 4), node(6, 7), node(7, -1), node(2, 2), node(0,
6), node(0, 8), node(56, 3),node(0, 9), node(0, -1)]
startPointer = 0
emptyList = 5
def addNode(currentPointer):
    global linkedList
    global emptyList
    data = int(input("Enter the Data to Add: "))
    # CHECK IF THE ARRAY IS FULL OR NOT
    if emptyList < 0 or emptyList > 9:
        return False
    else:
        # INCREMENT EMPTYLIST POINTER AFTER STORING IT IN A TEMPORARY VARIABLE
KNOWN AS freelist
        freelist = emptyList
        emptyList = linkedList[emptyList].nextNode
        # CREATE A newNode
        newNode = node(data, -1)
        # STORE IT WHERE THE freelist IS POINTING
        linkedList[freelist] = newNode
        # NOW YOU HAVE TO FIND THE LAST NODE INDEX
        previouspointer = 0
        while currentPointer != -1:
            previouspointer = currentPointer
            currentPointer = linkedList[currentPointer].nextNode
        linkedList[previouspointer].nextNode = freelist
        return True
def deleteNode():
    global linkedList
    global emptyList
    global startPointer
    currentpointer = startPointer
    Datatoremove = int(input("Enter the data that you want to remove: "))
    #Search the index of the element that you want to remove
    previouspointer = 0
    while currentpointer != -1 and linkedList[currentpointer].Data != Datatoremove:
        previouspointer = currentpointer
        currentpointer = linkedList[currentpointer].nextNode
    #First condition check it exists or not by Currentpointer
    if currentpointer == -1:
        return False
    else:
        #In else we will have two cases 1) start node to be removed or any other
        if startPointer == currentpointer:
            startPointer = linkedList[startPointer].nextNode
        else:
            linkedList[previouspointer].nextNode =
linkedList[currentpointer].nextNode
        linkedList[currentpointer].Data = 0
        linkedList[currentpointer].nextNode = emptyList
        emptyList = currentpointer
        return True
def outputNodes():
    #Can not take them as byref parameters so have taken as global
    global linkedList
    global startPointer
    currentpointer = startPointer
    while currentpointer != -1:
        print(linkedList[currentpointer].Data)
        currentpointer = linkedList[currentpointer].nextNode
def FindItem(currentpointer, SearchValue):
    global linkedList
    while currentpointer != -1:
        if linkedList[currentpointer].Data == SearchValue:
            return currentpointer
        else:
            currentpointer = linkedList[currentpointer].nextNode
    return currentpointer
def OrderedInsertion(currentpointer):
    global linkedList
    global startPointer
    global emptyList
    datatoinsert = int(input("Enter the data that you want to add: "))
    #CHECK DO YOU HAVE SPACE OR NOT
    if emptyList < 0 or emptyList > 9:
        return False
    else:
        freelist = emptyList
        emptyList = linkedList[emptyList].nextNode
        # CREATE A NEW NODE
        newNode = node(datatoinsert, -1)
        # STORE IT BY USING freelist
        linkedList[freelist] = newNode
        #Now find the correct position to insert the node
        previouspointer = 0
        while currentpointer != -1 and datatoinsert >
linkedList[currentpointer].Data:
            previouspointer = currentpointer
            currentpointer = linkedList[currentpointer].nextNode
        if currentpointer == startPointer:
            linkedList[freelist].nextNode = startPointer
            startPointer = freelist
        else:
            linkedList[freelist].nextNode = linkedList[previouspointer].nextNode
            linkedList[previouspointer].nextNode = freelist
        return True