728x90
728x90
선형 리스트(Linear Linked List)
선형 리스트의 기본
개념
- 데이터를 일정한 순서로 나열한 구조
- 순차 리스트(Ordered List)라고도 한다.
- 입력 순서대로 저장하는 데이터에 해당한다.
- 선형 리스트는 다양한 방법으로 구현할 수 있지만, 가장 기본적인 방법은 배열 을 이용하는 것이다.
- 선형 리스트는 메모리에서도 차례로 저장된다.

원리
데이터 삽입
- 1단계 : 맨 끝에 빈칸을 확보한다.
- 2단계 : 삽입하고자 하는 공간에 빈칸이 없으므로, 삽입하고자 하는 공간 뒤에 있는 요소들을 한칸씩 뒤로 옮긴다.
- 3단계 : 빈자리에 요소를 삽입한다.
데이터 삭제
- 원하는 요소가 삭제된 후 빈칸을 그대로 두지 않고 뒤의 요소들을 앞으로 한칸씩 이동시킨다.
선형 리스트의 구현
- 사용자가 입력하는 데이터가 가변적으로 작동하는 범용적인 코드를 작성해 보자.
① 리스트 생성
katok = [] # 빈 배열 def add_data(friend) : katok.append(None) kLen = len(katok) katok[kLen-1] = friend
② 데이터 삽입
중간 데이터 삽입
katok.append(None) for 현재위치 in range(마지막위치, 지정위치, -1) : katok[현재위치] = katok[현재위치-1] katok[현재위치-1] = None katok[지정위치] = 요소
맨 끝 데이터 삽입
katok.append(None) for 현재위치 in range(마지막위치, 지정위치, -1) : # 어차피 작동하지 않음. katok[현재위치] = katok[현재위치-1] katok[현재위치-1] = None katok[지정위치] = friend
함수 완성
katok = ['다현', '정연', '쯔위', '사나', '지효'] # 선형 리스트에 데이터를 삽입하는 함수 def insert_data(position, friend): if position < 0 or position > len(katok): print("데이터를 삽입할 범위를 벗어났습니다.") return katok.append(None) # 빈칸 추가 kLen = len(katok) # 배열의 현재 크기 for i in range(kLen - 1, position, -1): katok[i] = katok[i - 1] katok[i - 1] = None katok[position] = friend # 지정한 위치에 친구 추가 # 사용 예 insert_data(2, '솔라') insert_data(6, '문별')
③ 데이터 삭제
중간 데이터 삭제
katok[지정위치] = None for 현재위치 in range(지정위치+1, 마지막위치+1) : katok[현재위치-1] = katok[현재위치] katok[현재위치] = None delete(katok[지정위치])
맨 마지막 데이터 삭제
katok[지정위치] = None for 현재위치 in range(지정위치+1, 마지막위치+1) : katok[현재위치 - 1] = katok[현재위치] katok[현재위치] = None del(katok[지정위치])
함수 완성
katok = ['다현', '정연', '쯔위', '사나', '지효'] # 선형 리스트에서 데이터를 삭제하는 함수 def delete_data(position): if position < 0 or position > len(katok): print("데이터를 삭제할 범위를 벗어났습니다.") return kLen = len(katok) katok[position] = None # 데이터 삭제 for i in range(position + 1, kLen): katok[i - 1] = katok[i] katok[i] = None # 배열의 맨 마지막 위치 삭제 del(katok[kLen - 1]) # 사용 예 delete_data(1) delete_data(3)
선형 리스트의 완성
## 함수 선언 부분 ## def add_data(friend): katok.append(None) kLen = len(katok) katok[kLen - 1] = friend # 선형 리스트에 데이터를 삽입하는 함수 def insert_data(position, friend): if position < 0 or position > len(katok): print("데이터를 삽입할 범위를 벗어났습니다.") return katok.append(None) # 빈칸 추가 kLen = len(katok) # 배열의 현재 크기 for i in range(kLen - 1, position, -1): katok[i] = katok[i - 1] katok[i - 1] = None katok[position] = friend # 지정한 위치에 친구 추가 # 선형 리스트에서 데이터를 삭제하는 함수 def delete_data(position): if position < 0 or position > len(katok): print("데이터를 삭제할 범위를 벗어났습니다.") return kLen = len(katok) katok[position] = None # 데이터 삭제 for i in range(position + 1, kLen): katok[i - 1] = katok[i] katok[i] = None # 배열의 맨 마지막 위치 삭제 del(katok[kLen - 1]) ## 전역 변수 선언 부분 ## katok = [] select = -1 # 1: 추가, 2: 삽입, 3: 삭제, 4: 종료 ## 메인 코드 부분 ## if __name__ == "__main__": while (select != 4): select = int(input("선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> ")) if (select == 1): data = input("추가할 데이터--> ") add_data(data) print(katok) elif (select == 2): pos = int(input("삽입할 위치--> ")) data = input("추가할 데이터--> ") insert_data(pos, data) print(katok) elif (select == 3): pos = int(input("삭제할 위치--> ")) delete_data(pos) print(katok) elif (select == 4): print(katok) exit else: print("1~4 중 하나를 입력하세요.") continue
결과 보기
선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 1 추가할 데이터--> Apple ['Apple'] 선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 1 추가할 데이터--> Banana ['Apple', 'Banana'] 선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 1 추가할 데이터--> Tomato ['Apple', 'Banana', 'Tomato'] 선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 2 삽입할 위치--> 1 추가할 데이터--> Melon ['Apple', 'Melon', 'Banana', 'Tomato'] 선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 2 삽입할 위치--> 3 추가할 데이터--> Kiwi ['Apple', 'Melon', 'Banana', 'Kiwi', 'Tomato'] 선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 3 삭제할 위치--> 4 ['Apple', 'Melon', 'Banana', 'Kiwi'] 선택하세요(1: 추가, 2: 삽입, 3: 삭제, 4: 종료)--> 4 ['Apple', 'Melon', 'Banana', 'Kiwi']
728x90
728x90
'Computer Science > 자료구조' 카테고리의 다른 글
[C] 원형 연결 리스트(Circular Linked List) (0) | 2022.07.12 |
---|---|
[C] 단순 연결 리스트(Singly Linked List) (0) | 2022.07.12 |
[Python] 큐(Queue) (0) | 2022.07.01 |
[Python] 스택(Stack) (0) | 2022.07.01 |
[Python] 이진 탐색(Binary Search) (0) | 2022.06.29 |
[Python] 순차 탐색(Sequential Search) (0) | 2022.06.29 |
[Python] 원형 연결 리스트(Circular Linked List) (0) | 2022.06.22 |
[Python] 단순 연결 리스트(Singly Linked List) (0) | 2022.06.22 |