NameError: имя 'mergelist' не определено - PullRequest
0 голосов
/ 24 апреля 2018

NameError: имя 'mergelist' не определено ** Здесь я правильно упомянул список слияний и передал те же аргументы, но все же он показывает NameError, я не могу понять, где я ошибаюсь **

class node:
    def __init__(self, data):
        self.data=data
        self.head=None
class linkedlist:
    def __init__(self):
        self.head=None
    def push(self, newdata):   
        newnode=node(newdata)
        newnode.next=self.head
        self.head=newnode
    def mergelist(self, l1, l2):
        dummy=listnode(0)
        pointer=dummy
        while(l1 and l2):
            if l1.data<=l2.data:
                pointer.next=l1
                l1=l1.next
            else:
                pointer.next=l2
                l2=l2.next
            pointer=pointer.next
        if l1 == None:
            pointer.next = l2
        else:
            pointer.next = l1
        return dummy.next   
    def printlist(self):
        temp=self.head
        while(temp):    

            print(temp.data)
            temp=temp.next            
llist1=linkedlist()
llist1.push(4)  
llist1.push(9)    
llist1.push(7)    
llist1.push(5)    
llist1.push(4)   

llist2=linkedlist() 
llist2.push(32)  
llist2.push(12)
llist2.push(1)
llist2.push(2)
llist2.push(8)
llist1.printlist()
llist2.printlist() 

llist3=linkedlist()
llist3.head=mergelist(llist1.head, llist2.head)

llist3.printlist()

Это ошибка, которую я получаю

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

mergelist относится к классу linkedlist, поэтому вы должны назвать его так:

llist3.head = linkedlist.mergelist(llist1.head, llist2.head)

Кроме того, поскольку mergelist на самом деле не использует self, вымог бы украсить его как @staticmethod и не принимать self в качестве первого аргумента, или вы могли бы просто извлечь его из класса linkedlist, как в ответе Шрини

0 голосов
/ 24 апреля 2018

Вы называете mergelist глобальным функционалом, подобным этому llist3.head=mergelist(llist1.head, llist2.head), когда он фактически определен внутри класса, точнее, класса linkedlist. Один из вариантов, который у вас есть, это переместить mergelist наружу, вот так

class node:
    def __init__(self, data):
        self.data=data
        self.head=None
class linkedlist:
    def __init__(self):
        self.head=None
    def push(self, newdata):
        newnode=node(newdata)
        newnode.next=self.head
        self.head=newnode

    def printlist(self):
        temp=self.head
        while(temp):

            print(temp.data)
            temp=temp.next


def mergelist(l1, l2):
    dummy=listnode(0)
    pointer=dummy
    while(l1 and l2):
        if l1.data<=l2.data:
            pointer.next=l1
            l1=l1.next
        else:
            pointer.next=l2
            l2=l2.next
        pointer=pointer.next
    if l1 == None:
        pointer.next = l2
    else:
            pointer.next = l1


llist1=linkedlist()
llist1.push(4)
llist1.push(9)
llist1.push(7)
llist1.push(5)
llist1.push(4)

llist2=linkedlist()
llist2.push(32)
llist2.push(12)
llist2.push(1)
llist2.push(2)
llist2.push(8)
llist1.printlist()
llist2.printlist()

llist3=linkedlist()
llist3.head=mergelist(llist1.head, llist2.head)

llist3.printlist()

Конечно, теперь у вас есть новые ошибки, такие как listnode, которые не определены. Но я полагаю, вы знаете, как их определить.

Другой вариант - вызвать mergelist, добавив к нему префикс linkedlist и оператор ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...