1176 – FListă Ștergere

De la Universitas MediaWiki

Cerința

Să se implementeze o listă simplu înlănțuită care permite efectuarea operațiilor de inserare și ștergere a unui element specificat. Operațiile trebuie să fie implementate utilizând structuri de date dinamice în Python.

Date de intrare

Programul citește de la tastatură:

Un număr întreg n reprezentând numărul de operațiuni. O listă de n operațiuni, fiecare operațiune fiind de forma "INSERT X" (unde X este un număr întreg) sau "DELETE X" (unde X este un număr întreg).

Date de ieșire

Pe ecran se va afișa lista rezultată după efectuarea tuturor operațiunilor.

Restricții și precizări

  • 1 ⩽ n ⩽ 100
  • 'x' este întotdeauna un număr intreg.

Exemplu 1

Intrare

5
INSERT 3
INSERT 5
DELETE 3
INSERT 10
INSERT 7

Iesire

[5, 10, 7]

Exemplu 2

Intrare

4
INSERT 1
INSERT 2
DELETE 2
DELETE 1

Iesire

[]

Rezolvare

class Nod:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class ListaSimpluInlantuita:
    def __init__(self):
        self.head = None

    def insert(self, data):
        new_node = Nod(data)
        new_node.next = self.head
        self.head = new_node

    def delete(self, data):
        temp = self.head

        if temp is not None:
            if temp.data == data:
                self.head = temp.next
                temp = None
                return

        while temp is not None:
            if temp.data == data:
                break
            prev = temp
            temp = temp.next

        if temp == None:
            return

        prev.next = temp.next
        temp = None

    def afiseaza_lista(self):
        result = []
        temp = self.head
        while temp:
            result.append(temp.data)
            temp = temp.next
        return result

def citeste_date():
    try:
        n = int(input("Introduceți numărul de operațiuni (n): "))
        operatiuni = []
        for _ in range(n):
            operatiune = input().strip()
            operatiuni.append(operatiune)
        return n, operatiuni
    except ValueError:
        return None, None

def valideaza_date(n, operatiuni):
    if not (1 <= n <= 100):
        return False
    for operatiune in operatiuni:
        if not (operatiune.startswith("INSERT ") or operatiune.startswith("DELETE ")):
            return False
        if operatiune.startswith("INSERT ") and len(operatiune.split()) != 2:
            return False
        if operatiune.startswith("DELETE ") and len(operatiune.split()) != 2:
            return False
        if not operatiune.split()[1].isdigit() and (operatiune.split()[1][0] != '-' or not operatiune.split()[1][1:].isdigit()):
            return False
    return True

def proceseaza_operatiuni(n, operatiuni):
    lista = ListaSimpluInlantuita()
    for operatiune in operatiuni:
        if operatiune.startswith("INSERT "):
            _, val = operatiune.split()
            lista.insert(int(val))
        elif operatiune.startswith("DELETE "):
            _, val = operatiune.split()
            lista.delete(int(val))
    return lista.afiseaza_lista()

def main():
    n, operatiuni = citeste_date()
    
    if n is None or operatiuni is None or not valideaza_date(n, operatiuni):
        print("Datele de intrare nu corespund restricțiilor impuse.")
        return
    
    print("Datele de intrare corespund restricțiilor impuse.")
    rezultat = proceseaza_operatiuni(n, operatiuni)
    print(rezultat)

if __name__ == "__main__":
    main()