Невозможно правильно отобразить элементы связанного списка после вставки элемента в заголовок - PullRequest
0 голосов
/ 03 июня 2019

У меня есть связанный список, в котором каждый узел содержит данные круга (цвет, радиус). У меня есть класс «Форма», который имеет

(i) init : для инициализации списка кругов.

(ii) get_circle_list (): который возвращает список кругов

(iii) insert_circle (new_circle): вставляет новый узел в положение заголовка списка circle_list.

Функция init и insert_circle (new_circle) работают отлично. Но когда я пытаюсь использовать get_circle_list (), он возвращает старый круг, а не обновленный.

Например, новый узел, который я хочу вставить в положение головы («Синий», 6), тогда insert_circle (new_circle) вставляет его правильно в положение головы. Но когда я пытаюсь напечатать shape.get_circle_list (). Display (), печатается тот же старый список circle_list.

PS: Пожалуйста, не путайте этот код с круговым связным списком, которым он не является. Это связанный список, в котором есть узлы, представляющие элементы круга, и этот список называется именем circle_list.

class Node:
    def __init__(self,data):
        self.__data=data
        self.__next=None

    def get_data(self):
        return self.__data

    def set_data(self,data):
        self.__data=data

    def get_next(self):
        return self.__next

    def set_next(self,next_node):
        self.__next=next_node


class LinkedList:
    def __init__(self):
        self.__head=None
        self.__tail=None

    def get_head(self):
        return self.__head

    def get_tail(self):
        return self.__tail


    def add(self,data):
        new_node=Node(data)
        if(self.__head is None):
            self.__head=self.__tail=new_node
        else:
            self.__tail.set_next(new_node)
            self.__tail=new_node

    def insert(self,data,data_before):
        new_node=Node(data)
        if(data_before==None):
            new_node.set_next(self.__head)
            self.__head=new_node
            if(new_node.get_next()==None):
                self.__tail=new_node

        else:
            node_before=self.find_node(data_before)
            if(node_before is not None):
                new_node.set_next(node_before.get_next())
                node_before.set_next(new_node)
                if(new_node.get_next() is None):
                    self.__tail=new_node
            else:
                print(data_before,"is not present in the Linked list")

    def display(self):
        temp=self.__head
        while(temp is not None):
            print(temp.get_data())
            temp=temp.get_next()

class Circle:
    def __init__(self, color,radius):
        self.__color=color
        self.__radius=radius

    def __str__(self):
        return (self.__color+" "+str(self.__radius))

    def get_color(self):
        return self.__color

    def get_radius(self):
        return self.__radius


class Shape:
    def __init__(self,circle_list):
        self.__circle_list=circle_list
    #Here is where the problem occurs
    def get_circle_list(self):
        return self.__circle_list
    def insert_circle(self,new_circle):
        newNode=Node(new_circle)
        newNode.set_next(self.__circle_list.get_head())
        self.__circle_list.__head=newNode


circle1=Circle("Red",4)
circle2=Circle("Green",5)
circle3=Circle("Purple",3.5)
new_circle=Circle("Blue",6)

circle_list=LinkedList()
circle_list.add(circle1)
circle_list.add(circle2)
circle_list.add(circle3)

shape=Shape(circle_list)
shape.insert_circle(new_circle)
#prints the same old circle_list here
shape.get_circle_list().display()

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Интерпретатор python заменяет имена членов класса, начинающиеся с __ (двойное подчеркивание), на _classname__membername, чтобы гарантировать, что это имя не будет совпадать с аналогичным именем в другом классе.

В вашемcase атрибут __head интерпретируется как _LinkedList__head.

. При вызове метода insert_circle self.__circle_list.__head = newNode создает новый атрибут __head, а не переназначает _LinkedList__head.

Вы можете добавить метод set_head к вашему LinkedList

def set_head(self,new_head):
        self.__head=new_head

Затем вызвать его с помощью метода insert_circle.

def insert_circle(self,new_circle):
        newNode=Node(new_circle)
        newNode.set_next(self.__circle_list.get_head())
        self.__circle_list.set_head(newNode)

Вы также можете получить доступ к атрибуту _LinkedList__headнапрямую

def insert_circle(self,new_circle):
        newNode=Node(new_circle)
        newNode.set_next(self.__circle_list.get_head())
        self.__circle_list._LinkedList__head=newNode
0 голосов
/ 03 июня 2019

Это потому, что вы используете имена атрибутов, которые начинаются с двух подчеркиваний, таких как __head и __circle_list, и Python имеет специальные правила для таких имен.

Используйте только одно подчеркивание или ни одногои у тебя все будет хорошо.

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