자료구조 강의노트 - kocwcontents.kocw.net/kocw/document/2015/cup/weonsunghyun2/5.pdf ·...
TRANSCRIPT
소프트웨어학과 원성현 교수 1
자료구조 강의노트
교재 : C로 배우는 쉬운 자료구조(개정판) 출판사 : 한빛미디어(2011년 3월 발행) 저자 : 이지영
소프트웨어학과 원성현 교수 49
5장 연결 자료구조
소프트웨어학과 원성현 교수 50
1. 연결 자료구조
• 배열을 이용한 순차 리스트의 문제점 • 크기가 고정되어 데이터 수의 변동에 대처하지 못함 • 데이터 삽입과 삭제를 위해 다른 데이터의 이동이 필요하고 이에 따른 시간 지연 발생
• 메모리 할당 기법 • 정적 메모리 할당
• 변수와 배열처럼 프로그램이 실행되기 전 해당되는 크기만큼의 기억 공간을 미리 확보하는 방식 • 정적 메모리 할당은 메모리를 비효율적으로 사용할 수 있음
• 동적 메모리 할당 • 프로그램이 실행되는 도중 필요한 만큼의 메모리 공간을 확보하는 방식. • malloc(), sizeof(), free() 등의 함수를 사용
• 동적 메모리 할당 기법을 이용하여 데이터의 논리적 순서와 물리적 순서가 일치하지 않아도 되는 새로운 데이터 구조의 필요성 제기
순차 리스트의 문제점
소프트웨어학과 원성현 교수 51
• 노드(node)란? • 저장해야 할 데이터와 다음 데이터의 주소 데이터를 동시에 저장할 수 있는 기억 공간의 단위
• 노드 구조 • 현재 저장해야 할 데이터를 저장하는 필드(data field)와 다음 데이터의 주소 데이터를 저장하는 필드(link field) 등 최소한 2개의 필드를 갖는 구조체가 필요함 • 구조체로 쓰는 이유는 데이터 필드는 저장해야 할 데이터의 종류에 따라 정수형, 실수형, 문자형 등이 될 수 있고, 링크 필드는 주소 데이터를 저장해야 하므로 반드시 포인터 변수여야 하므로 서로 다른 데이터 타입을 저장할 수 있는 구조체가 필수임
노드
data link
• 필드의 이름은 어떤 것으로 하든 상관없음 • 데이터가 2개 필요하면 데이터 필드는 2개 만듬
• 필드의 이름은 어떤 것으로 하든 상관없음 • 지시할 데이터가 2개면 링크 필드도 2개 만듬
typedef struct Node { char data[4]; struct Node *link; };
소프트웨어학과 원성현 교수 52
• 연결 리스트(linked list) • 데이터의 논리적 순서와 물리적 순서가 굳이 일치되지 않아도 상관없도록 모든 데이터는 자신의 다음 데이터가 있는 주소 데이터를 가질 수 있도록 만든 데이터 구조
월 화 수 목 금 토 일
[0] 월
화
수
목
금
토
일
[1]
[2]
[3]
[4]
[5]
[6]
요일의 논리적 순서(순차 리스트)
월 화 수 목 금 토 일
요일의 논리적 순서(연결 리스트)
N
월
화
수
목
금
토
일
요일의 물리적 순서(순차 리스트) 요일의 물리적 순서(연결 리스트)
소프트웨어학과 원성현 교수 53
2. 단순 연결 리스트
• 삽입 절차 • 데이터를 저장할 새로운 노드 생성 • 새로운 노드에 저장해야 할 데이터 저장 • 삽입되어야 할 위치 앞 노드의 링크 필드값을 새로운 노드의 링크 필드에 저장 • 삽입되어야 할 위치 앞 노드의 링크 필드가 새로운 노드를 가리키도록 설정
단순 연결 리스트에서의 삽입 연산
data link
월 200
100
data link
금 300
200
data link
일 null
300
data link
수
150
new
data link
월 150
100
data link
금 300
200
data link
일 null
300
data link
수 200
150
new
소프트웨어학과 원성현 교수 54
• 삭제 절차 • 삭제할 노드의 데이터를 다른 곳으로 복사
• 혹시 발생할 수 있는 상황에 대비하기 위함 • 삭제할 노드의 앞 노드(선행 노드) 탐색 • 삭제할 노드의 링크 필드 값을 선행 노드의 링크 필드에 저장 • free()를 호출하여 삭제된 노드가 사용하던 기억공간을 운영체제에 반납
단순 연결 리스트에서의 삭제 연산
data link
월 150
100
data link
금 300
200
data link
일 null
300
data link
수 200
150
link
월 200
100
data link
금 300
200
data link
일 null
300
data
소프트웨어학과 원성현 교수 55
단순 연결 리스트의 삽입 알고리즘
• 첫번째 노드로 삽입하기 • 교재 195쪽 알고리즘 5-3 참조
• 중간 노드로 삽입하기 • 교재 196쪽 알고리즘 5-4 참조
• 마지막 노드로 삽입하기 • 교재 198쪽~199쪽 알고리즘 5-5 참조
단순 연결 리스트의 삭제 알고리즘
• 교재 200쪽~201쪽 알고리즘 5-6 참조
소프트웨어학과 원성현 교수 56
3. 원형 연결 리스트
• 원형 연결 리스트(circular linked list) • 단순 연결 리스트의 마지막 노드의 링크 필드가 첫 번째 노드를 가리키도록 한 연결 리스트
• 원형 연결 리스트가 필요한 이유 • 단순 연결 리스트는 시작 노드를 출발하여 링크를 따라 마지막 노드까지 이동하면 순회가 종료되지만 원형 연결 리스트는 계속 반복 수행할 수 있음
원형 연결 리스트
data link
월 150
100
data link
금 300
200
data link
일 100
300
data link
수 200
150
소프트웨어학과 원성현 교수 57
원형 연결 리스트의 삽입 알고리즘
data link
월 150
100
data link
금 300
200
data link
일 100
300
data link
수 200
150
new new
CL
• 첫번째 노드로 삽입하기 • 교재 214쪽 알고리즘 5-8 참조
• 중간 노드로 삽입하기 • 교재 217쪽 알고리즘 5-9 참조
소프트웨어학과 원성현 교수 58
원형 연결 리스트의 삭제 알고리즘
data link
월 200
100
data link
금 300
200
data link
일 100
300
data link
수 200
150 old pre CL
• 교재 219쪽 알고리즘 5-10 참조
소프트웨어학과 원성현 교수 59
4. 이중 연결 리스트
• 이중 연결 리스트(doubly linked list) • 단순 연결 리스트나 원형 연결 리스트는 현재 노드의 바로 앞 선행 노드로 이동할 수 없음 • 이러한 문제점을 해결하기 위해 모든 노드는 선행 노드와 후행 노드 모두를 가리키는 2개의 링크 필드를 갖도록 하는 것을 이중 연결 리스트라고 함
이중 연결 리스트
data rlink
월 150
100
금 300
200
일
300
수 200
150
llink
100 200 150
data rlink llink data rlink llink data rlink llink
data rlink
• 필드의 이름은 어떤 것으로 하든 상관없음 • 선행 노드를 가리킴
• 필드의 이름은 어떤 것으로 하든 상관없음 • 후행 노드를 가리킴
typedef struct Dnode { struct Dnode *llink; char data[5]; struct Dnode *rlink; };
llink
소프트웨어학과 원성현 교수 60
이중 연결 리스트의 삽입 알고리즘
data rlink
월 150 금 300 일 수 180
llink
100 200 180
data rlink llink data rlink llink data rlink llink
100 200 300 150
목
new
목 200 150
new
180
180
pre
DL
• 교재 226쪽 알고리즘 5-11 참조
소프트웨어학과 원성현 교수 61
이중 연결 리스트의 삭제 알고리즘
data rlink
월 200 금 300 일 수 200
llink
100 200 100
data rlink llink data rlink llink data rlink llink
100 200 300 150
data rlink
월 150 금 300 일 수 200
llink
100 200 150
data rlink llink data rlink llink data rlink llink
100 200 300 150 old
old
DL
DL
• 교재 230쪽 알고리즘 5-12 참조
소프트웨어학과 원성현 교수 62
5. 다항식의 연결 자료구조 표현
• 연결 리스트를 이용한 다항식의 표현 • 다항식의 계수, 지수 그리고 링크 필드 등 총 3개의 필드를 갖는 구조체 정의 • 각 노드에 하나의 항을 표현 • 각 노드에 표현된 항끼리 연산 • 연산 결과 항이 없어지는 경우는 노드도 삭제
연결 리스트를 이용한 다항식의 표현
지수 링크
expo link
typedef struct Node { float coef; int expo; struct Node *link; };
계수
coef
3x4+x3+2x+1
expo link
4 1 0 null 3 3
coef
1 1 2
expo link coef expo link coef expo link coef
소프트웨어학과 원성현 교수 63
다항식 연결자료구조의 삽입
4x3+3x2+5x
expo link
3 1 0 null 2 4
coef
3 2 5
expo link coef expo link coef expo link coef
new 2x0
• 교재 233쪽 알고리즘 5-13 참조
다항식끼리의 덧셈 알고리즘
• 교재 238쪽 알고리즘 5-14 참조