출처 : https://shitandcomputer.tistory.com/71
C언어로 연결리스트(Linked List) 구현하기
연결 리스트 저번 시간에 구현했던 그냥 '리스트'와는 달리, 연결 리스트는 동적으로 크기가 변할 수 있고, 삭제나 삽입 시에 데이터를 이동할 필요가 없다. why? 이것이 연결리스트의 기본 구조
shitandcomputer.tistory.com
노드 정의
4 : int == element
7 : (= int data) 실제 저장할 값
8 : Node 구조체를 가진 포인터 , 다음 노드의 주소를 가리키는 포인터
리스트의 시작 부분에 삽입(insert_first)
13 : 새로운 노드 p 생성
14 : 새 노드 p가 가지고 있는 데이터 칸에 value 넣기
15 : 새 노드 p의 link에 head를 넣음
(head는 맨 처음 노드를 가리키는 포인터이기 때문에 맨 처음 노드의 주소가 들어있음)
--> 즉 원래 맨 처음 노드를 p가 가리키게 함
16 : head에 p의 주소를 넣음
--> p가 맨 처음 노드가 됌
18 : 바뀐 head를 반환함
예를 들어 원래
head -> x[1] -> x[2]
라고 했다다면 위에 코드로 이렇게 바뀜
head -> p -> x[1] -> x[2]
리스트의 중간에 삽입(insert)
24 : 새로운 p 생성
25 : 새 노드 p가 가지고 있는 데이터 칸에 value 넣기
26 : p의 link에 prev의 link값을 넣음
prev의 link에는 다음 노드의 주소가 들어있음
--> prev의 다음 노드를 p가 가리킴
27 : prev의 link에 p의 주소값을 넣음
--> prev는 p를 가리킴
예를 들어 원래
head -> prev -> x[1]
라고 했다다면 위에 코드로 이렇게 바뀜
head -> prev -> p -> x[1]
리스트의 시작 부분 삭제(delete_first)
35 ~ 36 : head가 NULL을 가리킨다면 빈 리스트로써 NULL을 반환
37 : removed에 head를 저장
head가 가리키는 노드 = 맨 처음 노드
--> removed == 맨 처음 노드
38 : head를 removed 노드의 link(다음 노드)값으로 저장
39 : removed 할당 해제
예를 들어 원래
head -> x[1] -> x[2]
라고 했다다면 위에 코드로 이렇게 바뀜
head -> x[2]
리스트의 중간 부분 삭제(delete)
48 : removed에 prev의 link에 있는 값(다음 노드의 주소)를 저장
--> remove == prev가 가리키는 노드 다음 노드
49 : prev의 링크에 removed의 link 값(remove의 다음 노드 값)를 저장
50 : removed 할당 해제
예를 들어 원래
head -> prev -> x[1] -> x[2]
라고 했다다면 위에 코드로 이렇게 바뀜
head -> prev -> x[2]
출력 함수(print_list)
57 : p에 head(첫번째 주소)를 넣고 p가 NULL을 가릴킬 때 까지
p가 p의 link에 있는 다음 노드 주소가 되면서 반복
59 : p에 있는 data값을 출력한다
값 삽입
75 : head의 링크(다음 노드) 뒤에 삽입이 되므로
head -> x[1] -> 4
3번째에 삽인된다
결과
'scp' 카테고리의 다른 글
C언어 멘토링 오답노트 (0) | 2025.06.04 |
---|---|
리눅스 관리 권한 체계 및 /etc/passwd 와 /etc/shadow (0) | 2025.05.23 |
prob 파일 command injection (0) | 2025.05.20 |
포인터, 동적할당 (0) | 2025.05.20 |
Command injection 취약점 정리 (0) | 2025.05.17 |