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 |