Error in Python function ("is not defined")

Asked

Viewed 375 times

1

This was the simplest code I found in a demonstration of a chained list in python, I just couldn’t understand why it’s not working

class NodoLista:
    #Esta classe representa um nodo de uma lista encadeada.
    def __init__(self, dado=0, proximo_nodo=None):
        self.dado = dado
        self.proximo = proximo_nodo

    def __repr__(self):
        return '%s -> %s' % (self.dado, self.proximo)

class ListaEncadeada:
    #Esta classe representa uma lista encadeada.
    def __init__(self):
        self.cabeca = None

    def __repr__(self):
        return("[" + str(self.cabeca) + "]")

    print('Teste')

    def insere_no_inicio(lista, novo_dado):
        # 1) Cria um novo nodo com o dado a ser armazenado.
        novo_nodo = NodoLista(novo_dado)

        # 2) Faz com que o novo nodo seja a cabeça da lista.
        novo_nodo.proximo = lista.cabeca

        # 3) Faz com que a cabeça da lista referencie o novo nodo.
        lista.cabeca = novo_nodo

    def insere_depois(lista, nodo_anterior, novo_dado):
        assert nodo_anterior, "Nodo anterior precisa existir na lista."

        # Cria um novo nodo com o dado desejado.
        novo_nodo = NodoLista(novo_dado)

        # Faz o próximo do novo nodo ser o próximo do nodo anterior.
        novo_nodo.proximo = nodo_anterior.proximo

        # Faz com que o novo nodo seja o próximo do nodo anterior.
        nodo_anterior.proximo = novo_nodo


lista = ListaEncadeada()
print('Lista vazia:', lista)

insere_no_inicio(lista, 5)
print("Lista contém um único elemento:", lista)

nodo_anterior = lista.cabeca
insere_depois(lista, nodo_anterior, 10)
print("Inserindo um novo elemento depois de um outro:", lista)

1 answer

2


Hello,

Does not work for a simple indentation problem.

The way the code is structured, the functions insere_no_inicio and insere_depois are defined within the scope of the class ListaEncadeada. Thus, only an instance of this class could call these functions.

The right thing would be:

class NodoLista:
    #Esta classe representa um nodo de uma lista encadeada.
    def __init__(self, dado=0, proximo_nodo=None):
        self.dado = dado
        self.proximo = proximo_nodo

    def __repr__(self):
        return '%s -> %s' % (self.dado, self.proximo)

class ListaEncadeada:
    #Esta classe representa uma lista encadeada.
    def __init__(self):
        self.cabeca = None

    def __repr__(self):
        return("[" + str(self.cabeca) + "]")

print('Teste')

def insere_no_inicio(lista, novo_dado):
    # 1) Cria um novo nodo com o dado a ser armazenado.
    novo_nodo = NodoLista(novo_dado)

    # 2) Faz com que o novo nodo seja a cabeça da lista.
    novo_nodo.proximo = lista.cabeca

    # 3) Faz com que a cabeça da lista referencie o novo nodo.
    lista.cabeca = novo_nodo

def insere_depois(lista, nodo_anterior, novo_dado):
    assert nodo_anterior, "Nodo anterior precisa existir na lista."

    # Cria um novo nodo com o dado desejado.
    novo_nodo = NodoLista(novo_dado)

    # Faz o próximo do novo nodo ser o próximo do nodo anterior.
    novo_nodo.proximo = nodo_anterior.proximo

    # Faz com que o novo nodo seja o próximo do nodo anterior.
    nodo_anterior.proximo = novo_nodo


lista = ListaEncadeada()
print('Lista vazia:', lista)

insere_no_inicio(lista, 5)
print("Lista contém um único elemento:", lista)

nodo_anterior = lista.cabeca
insere_depois(lista, nodo_anterior, 10)
print("Inserindo um novo elemento depois de um outro:", lista)

Exit

Teste
Lista vazia: [None]
Lista contém um único elemento: [5 -> None]
Inserindo um novo elemento depois de um outro: [5 -> 10 -> None]

Other option

Another possibility would be to actually do the functions insere_no_inicio and insere_depois class methods ListaEncadeada. Thus:

class NodoLista:
    #Esta classe representa um nodo de uma lista encadeada.
    def __init__(self, dado=0, proximo_nodo=None):
        self.dado = dado
        self.proximo = proximo_nodo

    def __repr__(self):
        return '%s -> %s' % (self.dado, self.proximo)

class ListaEncadeada:
    #Esta classe representa uma lista encadeada.
    def __init__(self):
        self.cabeca = None

    def __repr__(self):
        return("[" + str(self.cabeca) + "]")

    def insere_no_inicio(self, novo_dado):
        # 1) Cria um novo nodo com o dado a ser armazenado.
        novo_nodo = NodoLista(novo_dado)

        # 2) Faz com que o novo nodo seja a cabeça da lista.
        novo_nodo.proximo = self.cabeca

        # 3) Faz com que a cabeça da lista referencie o novo nodo.
        self.cabeca = novo_nodo

    def insere_depois(self, nodo_anterior, novo_dado):
        assert nodo_anterior, "Nodo anterior precisa existir na lista."

        # Cria um novo nodo com o dado desejado.
        novo_nodo = NodoLista(novo_dado)

        # Faz o próximo do novo nodo ser o próximo do nodo anterior.
        novo_nodo.proximo = nodo_anterior.proximo

        # Faz com que o novo nodo seja o próximo do nodo anterior.
        nodo_anterior.proximo = novo_nodo

print('Teste')

lista = ListaEncadeada()
print('Lista vazia:', lista)

lista.insere_no_inicio(5)
print("Lista contém um único elemento:", lista)

nodo_anterior = lista.cabeca
lista.insere_depois( nodo_anterior, 10)
print("Inserindo um novo elemento depois de um outro:", lista)

Exit

Teste
Lista vazia: [None]
Lista contém um único elemento: [5 -> None]
Inserindo um novo elemento depois de um outro: [5 -> 10 -> None]

Browser other questions tagged

You are not signed in. Login or sign up in order to post.