Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Manhattan Distance

Data Structures : 연결된 구조 본문

Computer Science/Data Structures

Data Structures : 연결된 구조

timotheekim10 2023. 2. 10. 19:46

연결된 구조란?

  • 연결된 구조는 흩어진 데이터를 링크로 연결해서 관리
  • 노드 = 데이터(값을 저장) + 링크(다음 노드를 가리킴)

 

연결된 구조의 특징

  • 용량이 고정되지 않음
  • 중간에 자료를 삽입하거나 삭제하는 것이 용이 → 시간복잡도: O(1)
  • n번째 항목에 접근은 시간이 걸림 → 시간복잡도: O(n)

 

연결 리스트의 구조

  • 노드
    • 데이터: 값을 저장
    • 링크: 다음 노드를 가리킴
  • 헤드 포인터
    • 첫번째 노드의 주소를 저장

 

연결 리스트의 종류

  • 단순 연결 리스트
  • 원형 연결 리스트
  • 이중 연결 리스트

 

단순 연결 리스트 응용: 연결된 스택

class Node:  # 노드
    def __init__(self, elem, link=None):  # 생성자
        self.data = elem  # 데이터 초기화
        self.link = link  # 링크 초기화


class LinkedStack:
    def __init__(self):  # 생성자
        self.top = None  # top 초기화

    def isEmpty(self):  # 공백상태 검사
        return self.top == None

    def clear(self):  # 스택을 공백상태로 초기화
        self.top = None

    def push(self, item):  # 삽입연산
        n = Node(item, self.top)
        self.top = n

    def pop(self):  # 삭제연산
        if not self.isEmpty():  # 공백상태가 아니면
            n = self.top
            self.top = n.link
            return n.data

    def size(self):  # 스택의 크기 반환
        node = self.top  # 시작 노드
        count = 0
        while not node == None:  # node가 None이 아닐 때까지
            node = node.link  # 다음 노드로 이동
            count += 1  # count 증가
        return count  # count 반환

    def peek(self):  # 스택의 상단 요소(데이터) 반환
        if not self.isEmpty():
            return self.top.data

    def display(self, msg="LinkedStack: "):  # 스택의 상단 요소부터 출력
        print(msg, end='')
        node = self.top
        while not node == None:
            print(node.data, end=' ')
            node = node.link
        print()

 

단순 연결 리스트 응용: 연결된 리스트

class Node:  # 노드
    def __init__(self, elem, link=None):  # 생성자
        self.data = elem  # 데이터 초기화
        self.link = link  # 링크 초기화


class LinkedList:
    def __init__(self):  # 생성자
        self.head = None

    def isEmpty(self):  # 공백상태 검사
        return self.head == None

    def clear(self):  # 리스트를 공백상태로 초기화
        self.head = None

    def size(self):  # 리스트의 크기 반환
        node = self.head
        count = 0
        while not node == None:
            node = node.link
            count += 1
        return count

    def display(self, msg):  # 리스트의 맨 앞부터 출력
        print(msg, end='')
        node = self.head
        while not node == None:
            print(node.data, end='->')
            node = node.link
        print("None")

    def getNode(self, pos):  # pos번째 노드 반환
        if pos < 0:
            return None
        node = self.head
        while pos > 0 and node != None:
            node = node.link
            pos -= 1
        return node

    def getEntry(self, pos):  # pos번째 노드의 데이터 반환
        node = self.getNode(pos)
        if node == None:
            return None
        else:
            return node.data

    def replace(self, pos, elem):  # pos번째 노드의 데이터를 변경
        node = self.getNode(pos)
        if node != None:
            node.data = elem

    def find(self, data):  # 원하는 데이터를 가진 노드를 반환
        node = self.head
        while not node == None:
            if node.data == data:
                return node
            node = node.link
        return None

    def insert(self, pos, elem):  # 삽입연산
        before = self.getNode(pos-1)
        if before == None:  # 맨 앞에 삽입하는 경우
            self.head = Node(elem, self.head)
        else:  # 중간에 삽입하는 경우
            node = Node(elem, before.link)
            before.link = node

    def delete(self, pos):  # 삭제연산
        before = self.getNode(pos-1)
        if before == None:  # 맨 앞에 있는 노드를 삭제
            if not self.head == None:
                self.head = self.head.link
        elif before.link != None:  # 중간에 있는 노드를 삭제
            before.link = before.link.link

 

원형 연결 리스트 응용: 연결된 큐

class Node:  # 노드
    def __init__(self, elem, link=None):  # 생성자
        self.data = elem  # 데이터 초기화
        self.link = link  # 링크 초기화


class CircularLinkedQueue:
    def __init__(self):  # 생성자
        self.tail = None

    def isEmpty(self):  # 공백상태 검사
        return self.tail == None

    def clear(self):  # 큐를 공백상태로 초기화
        self.tail = None

    def peek(self):  # 큐의 전단 노드의 데이터를 반환
        if not self.isEmpty():
            return self.tail.link.data

    def enqueue(self, item):  # 삽입연산
        node = Node(item, None)
        if self.isEmpty():  # 큐가 공백상태인 경우
            node.link = node
            self.tail = node
        else:  # 큐가 공백상태가 아닌 경우
            node.link = self.tail.link
            self.tail.link = node
            self.tail = node

    def dequeue(self):  # 삭제 연산
        if not self.isEmpty():  # 큐가 공백상태가 아닌 경우
            data = self.tail.link.data
            if self.tail.link == self.tail:  # 큐가 하나의 항목을 갖는 경우
                self.tail = None
            else:  # 큐가 여러 개의 항목을 갖는 경우
                self.tail.link = self.tail.link.link
            return data

    def size(self):  # 큐의 크기 반환
        if self.isEmpty():
            return 0
        else:
            count = 1
            node = self.tail.link
            while not node == self.tail:
                node = node.link
                count += 1
            return count

    def display(self, msg="CircularLinkedQueue: "):  # 큐의 맨 앞부터 출력
        print(msg, end='')
        if not self.isEmpty():
            node = self.tail.link
            while not node == self.tail:
                print(node.data, end=' ')
                node = node.link
            print(node.data, end=' ')
        print()

 

이중 연결 리스트 응용: 연결된 덱

class DNode:  # 이중연결리스트를 위한 노드
    def __init__(self, elem, prev=None, next=None):
        self.data = elem
        self.prev = prev
        self.next = next


class DoublyLinkedDeque:
    def __init__(self):  # 생성자
        self.front = None
        self.rear = None

    def isEmpty(self):  # 공백상태 검사
        return self.front == None

    def clear(self):  # 덱을 공백상태로 초기화
        self.front = self.rear = None

    def size(self):  # 덱의 크기 반환
        node = self.front
        count = 0
        while not node == None:
            node = node.next
            count += 1
        return count

    def display(self, msg="DoublyLinkedDeque: "):  # 덱을 맨 앞부터 출력
        print(msg, end='')
        node = self.front
        while not node == None:
            print(node.data, end=' ')
            node = node.next
        print()

    def addFront(self, item):  # 덱의 전단에 삽입
        node = DNode(item, None, self.front)
        if (self.isEmpty()):  # 공백상태이면
            self.front = self.rear = node
        else:  # 공백상태가 아니면
            self.front.prev = node
            self.front = node

    def addRear(self, item):  # 덱의 후단에 삽입
        node = DNode(item, self.rear, None)
        if (self.isEmpty()):  # 공백상태이면
            self.front = self.rear = node
        else:  # 공백상태가 아니면
            self.rear.next = node
            self.rear = node

    def deleteFront(self):  # 덱의 전단 삭제
        if not self.isEmpty():  # 공백상태가 아니면
            data = self.front.data
            self.front = self.front.next
            if self.front == None:  # 노드가 하나 뿐이면
                self.rear = None
            else:
                self.front.prev = None
            return data

    def deleteRear(self):  # 덱의 후단 삭제
        if not self.isEmpty():  # 공백상태가 아니면
            data = self.rear.data
            self.rear = self.rear.prev
            if self.rear == None:  # 노드가 하나 뿐이면
                self.front = None
            else:
                self.rear.next = None
            return data

'Computer Science > Data Structures' 카테고리의 다른 글

Data Structures : 트리  (0) 2023.02.16
Data Structures : 정렬, 탐색  (0) 2023.02.13
Data Structures : 큐, 덱  (0) 2023.02.10
Data Structures : 스택  (0) 2023.02.09
Data Structures : 리스트  (0) 2023.02.09