SlideShare a Scribd company logo
1 of 26
Download to read offline
CHIP 2학년 수업
연결리스트 기초
2018년 1학기 2주차
목차
1. 연결리스트 기본 구조
2. 연결리스트 기본 연산
1. 생성
2. 삽입
3. 삭제
4. 탐색 및 출력
3. 실습
연결리스트 기본 구조
연결리스트 기본 구조
• 리스트(list)란?
• 데이터의 목록을 다루는 구조가 단순한 자료구조
• 가장 널리 쓰이는 자료구조
• 선형 구조를 이룸.
• 연결 리스트(Linked List)
• 리스트의 기본 구조인 노드(Node)가 선형으로 연결된 구조
연결리스트 기본 구조
• 노드(Node) : 데이터+ 링크(포인터)로 구성된 기본적인 구조
Data Next
- 노드 구조 코드(C언어)
typedef int element;
typedef struct Node{
element data; // 노드의 데이터
Node *next; // 다음 노드를 가리키는 포인터
}Node;
연결리스트 기본 구조
Data Next Data Next Data Next
Header
Pointer
NULL
• Header Pointer
• 연결 리스트의 가장 앞 부분을 가리키는 포인터
• 이 포인터를 이용해서 앞으로 사용할 연산들이 가능해짐
• 실질적으로 리스트 자체를 가리키는 포인터.
• Java의 예시 :
• ArrayList 클래스
• import java.util.ArrayList;
• Python의 예시
• 기본적으로 제공되는 자료형
• Ex ) List = [1,2,3,4,5]
왜 굳이 복잡한 연결리스트를 사용하나요?
차라리 배열쓰면 더 편하지 않을까요?
• Q1 : 왜 굳이 복잡한 연결리스트를 사용하나요?
• A1 : 삽입/삭제 연산이 효율적이다.
또한 동적인 구조라서 크기에 제한이 없다.
• Q2 : 차라리 배열쓰면 더 편하지 않을까요?
• A2 : 배열이 쓰기는 더 편하다.
하지만 효율성의 면에서는 리스트가 더 좋다.
예제
• Arr라는 배열이 있다. 아래의 질문에 답을 해보아라.
1. index==4(Arr[4])에 15라는 값을 끼워 넣어보아라.
2. 1번에서 완성된 배열에서 16이라는 값을 더 넣어보아라. 잘 되는가?
5
0
6
1
7
2
8
3
9
4
10
5
12
6
14
7 8
Arr
예제
• Arr라는 배열이 있다. 아래의 질문에 답을 해보아라.
1. index==4(Arr[4])에 15라는 값을 끼워 넣어보아라.
2. 1번에서 완성된 배열에서 16이라는 값을 더 넣어보아라. 잘 되는가?
5
0
6
1
7
2
8
3
15
4
9
5
10
6
12
7
14
8
Arr
for(int i = 8; i >=4 ; i--)
Arr[i] = Arr[i-1];
Arr[4] = 15
예제
• Arr라는 리스트가 있다. 아래의 질문에 답을 해보아라.
1. 다섯번 째 노드에 15라는 값을 끼워 넣어보아라.
2. 1번에서 완성된 리스트에서 16이라는 값을 더 넣어보아라. 잘 되는가?
insert_node(&Arr, 5, 15);
insert_node(&Arr, LAST_NODE, 16);
5 6 7 8 15 9 10 12 14Arr 16
배열과 리스트와의 결론
• 배열
• 구현이 쉽다.
• 삽입/삭제 연산이 비효율적이다.
• 크기가 고정되어 있다.
• 연결 리스트
• 구현이 복잡하다.
• 삽입/삭제 연산이 효율적이다.
• 크기 제약이 없다.
연결리스트 기본 연산
연결리스트 생성
Node *create_node(element data){
Node *new_node
new_node = (Node)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
data Nextheader NULL
new_node
Node *header = create_node();
• 연결 리스트의 노드를 새로 생성하는 함수
연결리스트 삽입
• 연결 리스트에 노드를 삽입하는 함수
• 하지만 삽입을 했을 때, 전제 조건이 있다.
절대로 Header Pointer나 앞의 포인터와의 연결이 끊어지면 안된다.
• 이러한 전제 조건 때문에 삽입 알고리즘은 3가지의 경우로 나눔
연결리스트 삽입
• Case 1 : header pointer가 NULL인 경우 (아무것도 없을 때)
data Nextheader
new_node
NULL
new_node->next = NULL;
header = new_node;
연결리스트 삽입
• Case 2 : 리스트의 가장 앞에 삽입하는 경우
Data Next Data Next Data Nextheader NULL
Data Nextnew_node
new_node->next = header;
header = new_node;
연결리스트 삽입
• Case 3 : 리스트의 중간에 삽입하는 경우
Data Next Data Next Data Nextheader NULL
Data Nextnew_node
point
new_node->next = point->next;
point->next = new_node;
연결리스트 삽입
void insert_node(Node **header, Node *p, Node *new_node){
if (*header == NULL){ // Case 1. 리스트에 노드가 아무것도 없을 때
new_node->next = NULL;
*header = new_node;
}
else if (p == NULL){ // Case 2. 리스트 가장 앞에 삽입을 할 때
new_node->next = *header;
*header = new_node;
}
else { // Case 3. 리스트 중간에 삽입을 할 때
new_node->next = p->next;
p->next = new_node;
}
}
연결리스트 삭제
• Case 1 : 가장 앞 노드를 삭제
Data Next Data Next Data Nextheader NULL
removed_node header = header->next;
연결리스트 삭제
• Case 2 : 지정한 노드를 삭제
Data Next Data Next Data Nextheader NULL
removed_node
front_node->next = removed_node->next;
front_node
연결리스트 삭제
void remove_node(Node **header, Node *front_node, Node *removed_node){
if (front_node == NULL) // Case 1. 가장 앞 노드를 삭제
*header = (*header)->next;
else // Case 2. 지정한 노드를 삭제
front_node->next = removed_node->next;
free(removed_node);
}
연결리스트 탐색 및 출력
Node *search_node(Node *header, int data){
Node *point = head;
while ( point != NULL ) {
if ( p->data == data )
return point;
point = point->next;
}
return point;
}
void print_node(Node *header){
Node *point = head;
while ( point != NULL ) {
printf(“%d->”, p->data);
point = point->next;
}
printf(“n”);
}
실습
실습
1. int형으로 0부터 15까지 값을 가지는 연결 리스트를 생성하라.
2. 위의 연결 리스트에서 짝수 값을 가지는 노드를 삭제하라.
3. 위(2번까지 완성했던 것)의 연결 리스트를 출력하라.
선택문제 : 위의 연결리스트에서 짝수와 홀수를 나타내는 연결
리스트로 각각 나눠서 출력해보아라.

More Related Content

What's hot

[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율S.O.P.T - Shout Our Passion Together
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐S.O.P.T - Shout Our Passion Together
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리S.O.P.T - Shout Our Passion Together
 
Data Structures
Data StructuresData Structures
Data Structuresskku_npc
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산S.O.P.T - Shout Our Passion Together
 
[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection SortBill Kim
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트
[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트
[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트S.O.P.T - Shout Our Passion Together
 
Binary Search
Binary SearchBinary Search
Binary Searchskku_npc
 
연결리스트 복습 및 스택
연결리스트 복습 및 스택연결리스트 복습 및 스택
연결리스트 복습 및 스택Lee Geonhee
 
R의 자료구조
R의 자료구조R의 자료구조
R의 자료구조yu yeon su
 
LINQ란 무엇인가
LINQ란 무엇인가LINQ란 무엇인가
LINQ란 무엇인가Jungsoo Park
 
[Algorithm] Counting Sort
[Algorithm] Counting Sort[Algorithm] Counting Sort
[Algorithm] Counting SortBill Kim
 
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조영기 김
 
[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked List[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked ListBill Kim
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)fmbvbfhs
 

What's hot (17)

Initializer list
Initializer listInitializer list
Initializer list
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
[SOPT] 데이터 구조 및 알고리즘 스터디 - #04 : 트리 기초, 이진 트리, 우선순위 큐
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
[SOPT] 데이터 구조 및 알고리즘 스터디 - #05 : AVL 트리
 
Data Structures
Data StructuresData Structures
Data Structures
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
 
[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection Sort
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트
[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트
[SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트
 
Binary Search
Binary SearchBinary Search
Binary Search
 
연결리스트 복습 및 스택
연결리스트 복습 및 스택연결리스트 복습 및 스택
연결리스트 복습 및 스택
 
R의 자료구조
R의 자료구조R의 자료구조
R의 자료구조
 
LINQ란 무엇인가
LINQ란 무엇인가LINQ란 무엇인가
LINQ란 무엇인가
 
[Algorithm] Counting Sort
[Algorithm] Counting Sort[Algorithm] Counting Sort
[Algorithm] Counting Sort
 
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조
 
[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked List[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked List
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)
 
14 4 슬라이싱
14 4 슬라이싱14 4 슬라이싱
14 4 슬라이싱
 

Similar to 연결 리스트(기초)

2012 Ds D2 03
2012 Ds D2 032012 Ds D2 03
2012 Ds D2 03chl132435
 
2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdfkd19h
 
자료구조 2014-2018년 출석수업대체시험 기출문제
자료구조 2014-2018년 출석수업대체시험 기출문제자료구조 2014-2018년 출석수업대체시험 기출문제
자료구조 2014-2018년 출석수업대체시험 기출문제Lee Sang-Ho
 
자료구조 2014-2018년 기말시험 기출문제
자료구조 2014-2018년 기말시험 기출문제자료구조 2014-2018년 기말시험 기출문제
자료구조 2014-2018년 기말시험 기출문제Lee Sang-Ho
 
Project#3다항식의연산 Hwp
Project#3다항식의연산 HwpProject#3다항식의연산 Hwp
Project#3다항식의연산 HwpKimjeongmoo
 
자료구조3보고서
자료구조3보고서자료구조3보고서
자료구조3보고서KimChangHoen
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl승혁 조
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOSNAVER D2
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - HeapBill Kim
 

Similar to 연결 리스트(기초) (12)

2012 Ds D2 03
2012 Ds D2 032012 Ds D2 03
2012 Ds D2 03
 
2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf
 
자료구조 2014-2018년 출석수업대체시험 기출문제
자료구조 2014-2018년 출석수업대체시험 기출문제자료구조 2014-2018년 출석수업대체시험 기출문제
자료구조 2014-2018년 출석수업대체시험 기출문제
 
자료구조 2014-2018년 기말시험 기출문제
자료구조 2014-2018년 기말시험 기출문제자료구조 2014-2018년 기말시험 기출문제
자료구조 2014-2018년 기말시험 기출문제
 
자구3번
자구3번자구3번
자구3번
 
Project#3다항식의연산 Hwp
Project#3다항식의연산 HwpProject#3다항식의연산 Hwp
Project#3다항식의연산 Hwp
 
자료구조3보고서
자료구조3보고서자료구조3보고서
자료구조3보고서
 
자료구조04
자료구조04자료구조04
자료구조04
 
자료구조03
자료구조03자료구조03
자료구조03
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - Heap
 

More from Lee Geonhee

Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기Lee Geonhee
 
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초자료구조 복습 및 트리기초
자료구조 복습 및 트리기초Lee Geonhee
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들Lee Geonhee
 
HTTPS를 이용한 챗봇 웹 어플리케이션
HTTPS를 이용한 챗봇 웹 어플리케이션HTTPS를 이용한 챗봇 웹 어플리케이션
HTTPS를 이용한 챗봇 웹 어플리케이션Lee Geonhee
 
AES 알고리즘
AES 알고리즘AES 알고리즘
AES 알고리즘Lee Geonhee
 
허프만 압축 알고리즘 및 비교
허프만 압축 알고리즘 및 비교허프만 압축 알고리즘 및 비교
허프만 압축 알고리즘 및 비교Lee Geonhee
 
Shortest path algorithms
Shortest path algorithmsShortest path algorithms
Shortest path algorithmsLee Geonhee
 
5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)
5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)
5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)Lee Geonhee
 
오픈소스 라이선스
오픈소스 라이선스오픈소스 라이선스
오픈소스 라이선스Lee Geonhee
 
GitHub로 프로젝트 운영하기
GitHub로 프로젝트 운영하기GitHub로 프로젝트 운영하기
GitHub로 프로젝트 운영하기Lee Geonhee
 

More from Lee Geonhee (11)

Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기
 
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초자료구조 복습 및 트리기초
자료구조 복습 및 트리기초
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
 
HTTPS를 이용한 챗봇 웹 어플리케이션
HTTPS를 이용한 챗봇 웹 어플리케이션HTTPS를 이용한 챗봇 웹 어플리케이션
HTTPS를 이용한 챗봇 웹 어플리케이션
 
AES 알고리즘
AES 알고리즘AES 알고리즘
AES 알고리즘
 
허프만 압축 알고리즘 및 비교
허프만 압축 알고리즘 및 비교허프만 압축 알고리즘 및 비교
허프만 압축 알고리즘 및 비교
 
Shortest path algorithms
Shortest path algorithmsShortest path algorithms
Shortest path algorithms
 
5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)
5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)
5th Naver D2 FEST 결승전 발표 자료(IoT-Pet-Home-System)
 
오픈소스 라이선스
오픈소스 라이선스오픈소스 라이선스
오픈소스 라이선스
 
Web server
Web serverWeb server
Web server
 
GitHub로 프로젝트 운영하기
GitHub로 프로젝트 운영하기GitHub로 프로젝트 운영하기
GitHub로 프로젝트 운영하기
 

연결 리스트(기초)

  • 1. CHIP 2학년 수업 연결리스트 기초 2018년 1학기 2주차
  • 2. 목차 1. 연결리스트 기본 구조 2. 연결리스트 기본 연산 1. 생성 2. 삽입 3. 삭제 4. 탐색 및 출력 3. 실습
  • 4. 연결리스트 기본 구조 • 리스트(list)란? • 데이터의 목록을 다루는 구조가 단순한 자료구조 • 가장 널리 쓰이는 자료구조 • 선형 구조를 이룸. • 연결 리스트(Linked List) • 리스트의 기본 구조인 노드(Node)가 선형으로 연결된 구조
  • 5. 연결리스트 기본 구조 • 노드(Node) : 데이터+ 링크(포인터)로 구성된 기본적인 구조 Data Next - 노드 구조 코드(C언어) typedef int element; typedef struct Node{ element data; // 노드의 데이터 Node *next; // 다음 노드를 가리키는 포인터 }Node;
  • 6. 연결리스트 기본 구조 Data Next Data Next Data Next Header Pointer NULL • Header Pointer • 연결 리스트의 가장 앞 부분을 가리키는 포인터 • 이 포인터를 이용해서 앞으로 사용할 연산들이 가능해짐 • 실질적으로 리스트 자체를 가리키는 포인터.
  • 7. • Java의 예시 : • ArrayList 클래스 • import java.util.ArrayList; • Python의 예시 • 기본적으로 제공되는 자료형 • Ex ) List = [1,2,3,4,5]
  • 8. 왜 굳이 복잡한 연결리스트를 사용하나요? 차라리 배열쓰면 더 편하지 않을까요?
  • 9. • Q1 : 왜 굳이 복잡한 연결리스트를 사용하나요? • A1 : 삽입/삭제 연산이 효율적이다. 또한 동적인 구조라서 크기에 제한이 없다. • Q2 : 차라리 배열쓰면 더 편하지 않을까요? • A2 : 배열이 쓰기는 더 편하다. 하지만 효율성의 면에서는 리스트가 더 좋다.
  • 10. 예제 • Arr라는 배열이 있다. 아래의 질문에 답을 해보아라. 1. index==4(Arr[4])에 15라는 값을 끼워 넣어보아라. 2. 1번에서 완성된 배열에서 16이라는 값을 더 넣어보아라. 잘 되는가? 5 0 6 1 7 2 8 3 9 4 10 5 12 6 14 7 8 Arr
  • 11. 예제 • Arr라는 배열이 있다. 아래의 질문에 답을 해보아라. 1. index==4(Arr[4])에 15라는 값을 끼워 넣어보아라. 2. 1번에서 완성된 배열에서 16이라는 값을 더 넣어보아라. 잘 되는가? 5 0 6 1 7 2 8 3 15 4 9 5 10 6 12 7 14 8 Arr for(int i = 8; i >=4 ; i--) Arr[i] = Arr[i-1]; Arr[4] = 15
  • 12. 예제 • Arr라는 리스트가 있다. 아래의 질문에 답을 해보아라. 1. 다섯번 째 노드에 15라는 값을 끼워 넣어보아라. 2. 1번에서 완성된 리스트에서 16이라는 값을 더 넣어보아라. 잘 되는가? insert_node(&Arr, 5, 15); insert_node(&Arr, LAST_NODE, 16); 5 6 7 8 15 9 10 12 14Arr 16
  • 13. 배열과 리스트와의 결론 • 배열 • 구현이 쉽다. • 삽입/삭제 연산이 비효율적이다. • 크기가 고정되어 있다. • 연결 리스트 • 구현이 복잡하다. • 삽입/삭제 연산이 효율적이다. • 크기 제약이 없다.
  • 15. 연결리스트 생성 Node *create_node(element data){ Node *new_node new_node = (Node)malloc(sizeof(Node)); new_node->data = data; new_node->next = NULL; return new_node; } data Nextheader NULL new_node Node *header = create_node(); • 연결 리스트의 노드를 새로 생성하는 함수
  • 16. 연결리스트 삽입 • 연결 리스트에 노드를 삽입하는 함수 • 하지만 삽입을 했을 때, 전제 조건이 있다. 절대로 Header Pointer나 앞의 포인터와의 연결이 끊어지면 안된다. • 이러한 전제 조건 때문에 삽입 알고리즘은 3가지의 경우로 나눔
  • 17. 연결리스트 삽입 • Case 1 : header pointer가 NULL인 경우 (아무것도 없을 때) data Nextheader new_node NULL new_node->next = NULL; header = new_node;
  • 18. 연결리스트 삽입 • Case 2 : 리스트의 가장 앞에 삽입하는 경우 Data Next Data Next Data Nextheader NULL Data Nextnew_node new_node->next = header; header = new_node;
  • 19. 연결리스트 삽입 • Case 3 : 리스트의 중간에 삽입하는 경우 Data Next Data Next Data Nextheader NULL Data Nextnew_node point new_node->next = point->next; point->next = new_node;
  • 20. 연결리스트 삽입 void insert_node(Node **header, Node *p, Node *new_node){ if (*header == NULL){ // Case 1. 리스트에 노드가 아무것도 없을 때 new_node->next = NULL; *header = new_node; } else if (p == NULL){ // Case 2. 리스트 가장 앞에 삽입을 할 때 new_node->next = *header; *header = new_node; } else { // Case 3. 리스트 중간에 삽입을 할 때 new_node->next = p->next; p->next = new_node; } }
  • 21. 연결리스트 삭제 • Case 1 : 가장 앞 노드를 삭제 Data Next Data Next Data Nextheader NULL removed_node header = header->next;
  • 22. 연결리스트 삭제 • Case 2 : 지정한 노드를 삭제 Data Next Data Next Data Nextheader NULL removed_node front_node->next = removed_node->next; front_node
  • 23. 연결리스트 삭제 void remove_node(Node **header, Node *front_node, Node *removed_node){ if (front_node == NULL) // Case 1. 가장 앞 노드를 삭제 *header = (*header)->next; else // Case 2. 지정한 노드를 삭제 front_node->next = removed_node->next; free(removed_node); }
  • 24. 연결리스트 탐색 및 출력 Node *search_node(Node *header, int data){ Node *point = head; while ( point != NULL ) { if ( p->data == data ) return point; point = point->next; } return point; } void print_node(Node *header){ Node *point = head; while ( point != NULL ) { printf(“%d->”, p->data); point = point->next; } printf(“n”); }
  • 26. 실습 1. int형으로 0부터 15까지 값을 가지는 연결 리스트를 생성하라. 2. 위의 연결 리스트에서 짝수 값을 가지는 노드를 삭제하라. 3. 위(2번까지 완성했던 것)의 연결 리스트를 출력하라. 선택문제 : 위의 연결리스트에서 짝수와 홀수를 나타내는 연결 리스트로 각각 나눠서 출력해보아라.