ABOUT ME

chanho Yoon
chyoon0512@gmail.com


깃허브


블로그 이사!

이 블로그로 이사했어요!!


Today
-
Yesterday
-
Total
-
  • 이중 연결 리스트 - python3
    Programming/자료구조 2020. 3. 5. 03:35
    반응형

    이중 연결 리스트

    • 이중 연결 리스트는 이전 노드를 가리키는 포인터, 다음 노드를 가리키는 포인터를 가지고 있다.
    • 양방향으로 연결되어 있어 노드를 탐색하는데 있어 양쪽 모두 가능하다.


    이중 연결 리스트 실습 - 노드 삽입

    class Node:
        # 이전 노드를 가리키는 prev, 다음 노드를 가리키는 next
        def __init__ (self,data,prev=None,next=None):
            self.prev = prev
            self.data = data
            self.next = next
            
    class NodeModule:
        def __init__ (self,data):
            self.head=Node(data)
            self.tail = self.head
        
        def add(self,data):
            # node에 head가 없다면
            if self.head == None:
                self.head = Node(data)
                self.tail = self.head
            else:
                # node에 포인터가 head를 가리키게하고
                node = self.head
                # node에 끝으로 이동
                while node.next:
                    node = node.next
                # 새로운 노드 데이터를 삽입
                new = Node(data)
                # node의 끝 데이터에 다음 노드를 새로 삽입한 노드를 연결
                node.next = new
                # 새로 삽입한 노드를 이전 노드와 연결
                new.prev = node
                # 새로 삽입한 노드는 끝에 있기 때문에 self.tail = new
                self.tail = new
        
        def show(self):
            node = self.head
            
            while node:
                print(node.data)
                node=node.next
            
            

     

    이중 연결 리스트 실습 - 특정 위치에 노드삽입

    class Node:
        # 이전 노드를 가리키는 prev, 다음 노드를 가리키는 next
        def __init__ (self,data,prev=None,next=None):
            self.prev = prev
            self.data = data
            self.next = next
    
    
    def search_data(self, num):
        if self.head == None:
            return False
        node = self.head
        while node:  
            if float(node.data) == float(num):
                return node
            else:
                node=node.next
    
    
            
    class NodeModule:
        def __init__ (self,data):
            self.head = Node(data)
            self.tail = self.head
        # 입력한 data가 node에 있는지 확인  
    
        def add(self,data,num,pn):
            # node에 head가 없다면
            
            if self.head == None:
                self.head = Node(data)
                self.tail = self.head
            else:
                # 입력한 특정 데이터가 node에 있는지 확인
                node = search_data(self,num)
                # 입력한 특정 데이터가 node에 있다면            
                if node:
                    # 특정 노드 앞에 추가
                    if int(pn) == 1:
                        # 삽입할 노드 생성
                        new = Node(data)
                        
                        # 특정 노드의 이전포인터 저장
                        before_data = node.prev
                        
                        # 특정 노드의 이전포인터가 없다면 그건 head 노드이다
                        if before_data == None:
                            self.head = new
                        else:
                            # 특정 노드의 이전포인터가 새로 삽입할 노드를 가리킴
                            before_data.next = new   
                            # 새로 삽입한 노드는 이전 노드를 가리킴
                            new.prev = before_data
                            
                        # 특정 노드의 이전포인터는 새로 삽입한 노드를 가리켜야함
                        node.prev = new
    
                        # 새로 삽입한 노드는 특정 노드를 가리켜야함
                        new.next = node
                        
                        
                    # 특정 노드 뒤에 추가
                    elif int(pn) == 2:
                        # 삽입할 노드 생성
                        new = Node(data)
                        
                        # 특정 노드의 다음포인터 저장
                        after_data = node.next
                        
                        # 특정 노드의 다음포인터가 없다면 그건 tail노드이다
                        if after_data == None:
                            self.tail = new
                        else:
                            # 특정노드의 다음노드는 새로 삽입한 노드를 가리켜야함
                            after_data.prev = new
                            # 새로 삽입한 노드는 특정노드의 다음노드를 가리켜야함
                            new.next = after_data
                        
                        # 특정 노드의 다음포인터를 새로 삽입한 노드를 가리킴
                        node.next = new
                        # 새로 삽입한 노드는 특정노드를 가리켜야함
                        new.prev = node
    
                    else:
                        print("잘못된 값 입력!")
                        return
                        
                # 입력한 데이터가 node에 없다면
                else:
                    print("입력한 데이터가 node에 없습니다.")
                    return
                
                        
        def show(self):
            node = self.head
            print(f"node data : ",end='')
            while node:
                print(f" {node.data} ", end='')
                node=node.next
            print("\n")
    no=NodeModule(1)
    while True:
        no.show()
        print("-----------------------------------------------------")
        data = input("추가할 데이터 값 입력 - ")
        num = input("특정 데이터 선택 - ")
        pn = input("1. 특정 데이터 앞에 추가 2. 특정 데이터 뒤에 추가 - ")
        no.add(data,num,pn)
        print("-----------------------------------------------------")

    'Programming > 자료구조' 카테고리의 다른 글

    단일 연결 리스트 - python3  (0) 2020.02.27
    Stack(스택) - python3  (0) 2020.02.26
    Queue(큐) - python3  (0) 2020.02.25
    리스트 (List) 파이썬 배열  (0) 2020.02.24

    댓글

Designed by Tistory.