자료 구조

Download Report

Transcript 자료 구조

▣ 수강동의
-. http://mgr.eduitbank.com site 접속
-. 로그인 : (처음접속 시)아이디 찾기 > 학생으로 검색 후 로그인
※ 주의 : 절대 비밀번호 찾기 하지 말 것.
-. 나의 정보 > 출석정보 > 자료구조> 수강 동의
자료구조
(오른쪽 상단)
▣ 카페 소개
Cafe : http://cafe.naver.com/hellolang
※ 숙제 및 문의사항은 Café 이용
▣ 참고사항
자료 구조
(Data Structure)
▣ 자료구조 이해
◈ 자료 구조 란?
-. 사전적 의미 : 데이터를 처리하는 입장에서 데이터 사이에 존재하는
관계를 개념적으로 잡은 것
-. 데이터를 효율적으로 사용할 수 있도록 구조를 만들어서 저장하는 것
Data
Data
Data
Data
Data
Data
Data
Data
Data
Data
Data
Data
▣ 자료구조 이해
◈
-.
-.
-.
선형 구조
데이터를 선의 형태로 일렬로 저장하는 방식
이전 데이터와 이후 데이터는 1 대 1 관계를 가짐
스택(Stack) , 큐(Queue) , 연결리스트(Linked List)
Data
◈
-.
-.
-.
Data
Data
비 선형 구조
데이터를 선의 형태가 아닌 다른 형태로 저장하는 방식
이전 데이터와 이후 데이터는 1 대 다 관계를 가짐
트리(Tree) , 그래프(Graph)
Data
Data
Data
Data
Data
▣ 자료구조 이해
◈ 스택(Stack)
-. 삽입(insert)과 삭제(delete)가 한쪽 끝에서만 수행되는 구조
-. LIFO(Last In First Out) : 마지막에 들어간 데이터가 먼저 나오는 구조
입력(Push)
출력(Pop)
<Data 처리순서>
입력 : Data1 -> Data2 -> Data3
출력 : Data3 -> Data2 -> Data1
Data3
Data2
Data1
Bottom
Top
▣ 자료구조 이해
◈ 큐(Queue)
-. 한쪽에선 삽입(insert)만 한쪽에선 삭제(delete)만 수행되는 구조
-. FIFO(First In First Out) : 먼저 들어간 데이터가 먼저 나오는 구조
입력
(enqueue)
Data3
Data2
Data1
Front
<Data 처리순서>
입력 : Data1 -> Data2 -> Data3
출력 : Data1 -> Data2 -> Data3
Rear
출력
(dequeue)
▣ 자료구조 이해
◈
-.
-.
-.
리스트(List)
데이터를 순서대로 저장해 놓는 구조
대표적으로 배열이 있음
스택 , 큐도 넓은 의미로는 리스트에 해당됨
<배열>
Data1
Data2
Data3
[0]
[1]
[2]
Data4
[3]
[4]
▣ 자료구조 이해
◈ 연결 리스트(List)
-. 데이터들을 링크를 통해 연결시켜 저장하는 구조
노드(Node)
data
link
▣ 자료구조 이해
◈ 트리(Tree)
-. 나무의 뿌리에서 가지를 뻗는 것처럼 하나의 데이터에 가지를 뻗어
저장하는 구조
노드(Node)
link
data
link
▣ 자료구조 이해
◈ 그래프(Graph)
-. 컴퓨터로 수치 계산 등을 한 결과를 그대로 숫자(number)의 나열로서
표현하는 것이 아니고, 시각적으로 이해할 수 있도록 막대 그래프, 원 그
래프로 표시한 것
▣ 자료구조 이해
◈ 알고리즘
-. 어떤 문제를 해결하기 위한 방법
▣ 자료구조 구현
◈ 스택(Stack)
-. 배열을 이용한 Stack 구현
입력(Push)
출력(Pop)
Data3
Data2
Data1
Top
▣ 자료구조 구현
◈ Stack Code (Node , Push 함수 구현)
#include <stdio.h>
typedef struct stack{
int stackArea[5];
int top;
}Stack , *PStack;
void Push(Stack *st , int data){
if(st->top>=((int)sizeof(st->stackArea)/4)-1)
{
printf("Stack is FULL\n");
return;
}
st->top++;
st->stackArea[st->top] = data;
}
▣ 자료구조 구현
◈ Stack Code (Pop 함수 구현)
int Pop(Stack *st){
int data;
if(st->top<0)
{
printf("Stack is EMPTY\n");
return 0;
}
data = st->stackArea[st->top];
st->top--;
return data;
}
▣ 자료구조 구현
◈ Stack Code (main 함수 구현)
void main(void)
{
Stack st;
st.top = -1;
Push(&st , 10);
Push(&st , 20);
Push(&st , 30);
}
printf("%d\n"
printf("%d\n"
printf("%d\n"
printf("%d\n"
,
,
,
,
Pop(&st));
Pop(&st));
Pop(&st));
Pop(&st));
▣ 자료구조 구현
◈ 분석
Stack 영역
top
-1
main()
[4]
[3]
[2]
[1]
st
[0]
stackArea
Stack st;
st.top = -1;
▣ 자료구조 구현
◈ 분석
Stack 영역
top
-1
0
main()
[4]
[3]
[2]
stackArea
[1]
100번지
Push()
10
st
[0]
100
&st
10
st
data
Push(&st , 10);
▣ 자료구조 구현
◈ 분석
Stack 영역
top
1
0
main()
[4]
[3]
[2]
100번지
Push()
st
20
[1]
10
[0]
stackArea
100
&st
20
st
data
Push(&st , 20);
▣ 자료구조 구현
◈ 분석
Stack 영역
top
2
1
main()
[4]
[3]
100번지
Push()
st
30
[2]
20
[1]
10
[0]
stackArea
100
&st
30
st
data
Push(&st , 30);
▣ 자료구조 구현
◈ 분석
Stack 영역
top
1
2
main()
printf("%d\n" , Pop(&st));
[4]
[3]
100번지
Pop()
st
30
[2]
20
[1]
10
[0]
stackArea
30
100
&st
30
st
data
▣ 자료구조 구현
◈ 분석
Stack 영역
top
0
1
main()
printf("%d\n" , Pop(&st));
[4]
[3]
100번지
Pop()
st
30
[2]
20
[1]
10
[0]
stackArea
20
100
&st
20
st
data
▣ 자료구조 구현
◈ 분석
Stack 영역
top
-1
0
main()
printf("%d\n" , Pop(&st));
[4]
[3]
100번지
Pop()
st
30
[2]
20
[1]
10
[0]
stackArea
10
100
&st
10
st
data
▣ 자료구조 구현
◈ 분석
Stack 영역
top
-1
main()
printf("%d\n" , Pop(&st));
[4]
[3]
100번지
Pop()
st
30
[2]
20
[1]
10
[0]
stackArea
0
100
&st
st
data
▣ 자료구조 구현
◈ 스택(Stack)
-. 연결리스트를 이용한 Stack 구현
입력(Push)
출력(Pop)
Push(Data1)
Push(Data2)
Push(Data3)
Data3
data
link
Pop( )
Data2
data
Top
link
Data1
data
Pop( )
link
Pop( )
▣ 자료구조 구현
◈ Stack Code (Node , GetNode 함수 구현)
#include <stdio.h>
#include <stdlib.h>
#define EMPTY 0
struct node {
int data;
struct node * link;
};
typedef struct node Stack;
Stack * GetNode(){
Stack * tmp;
tmp=(Stack *)malloc(sizeof(Stack));
tmp->link=EMPTY;
return tmp;
}
▣ 자료구조 구현
◈ Stack Code (Push 함수 구현)
void Push(Stack **top, int data){
Stack *tmp;
tmp=*top;
*top=GetNode();
}
(*top)->data=data;
(*top)->link=tmp;
▣ 자료구조 구현
◈ Stack Code (Pop 함수 구현)
int Pop (Stack **top) {
Stack *tmp;
int num;
if(*top==EMPTY){
printf("Stack is empty!!!!");
return NULL;
}
tmp=*top;
num=tmp->data;
*top=(*top)->link;
}
free(tmp);
return num;
▣ 자료구조 구현
◈ Stack Code (Main 함수 구현)
void main () {
Stack * top=EMPTY;
Push(&top, 10);
Push(&top, 20);
Push(&top, 30);
}
printf("%d", Pop(&top));
printf("%d", Pop(&top));
printf("%d", Pop(&top));
▣ 자료구조 구현
◈ 분석
Stack * top=EMPTY;
Stack 영역
main()
0
*top
▣ 자료구조 구현
◈ 분석
Push(&top, 10);
Stack 영역
main()
100번지
Push()
GetNode()
Heap 영역
0
1000
*top
&top
100
10
0
**top
data
*tmp
1000
*tmp
1000번지
10
0
data
*link
▣ 자료구조 구현
◈ 분석
Push(&top, 20);
Stack 영역
main()
100번지
Push()
GetNode()
Heap 영역
1000
2000
*top
&top
100
20
1000
**top
data
*tmp
2000번지
2000
*tmp
1000번지
20
1000
0
data
*link
10
0
data
*link
▣ 자료구조 구현
◈ 분석
Push(&top, 30);
Stack 영역
main()
100번지
Push()
GetNode()
Heap 영역
2000
3000
3000번지
*top
&top
100
30
2000
**top
data
*tmp
2000번지
3000
*tmp
1000번지
30
2000
0
data
*link
20
1000
data
*link
10
0
data
*link
▣ 자료구조 구현
◈ 분석
printf("%d", Pop(&top));
Stack 영역
main()
100번지
Pop()
Heap 영역
3000
2000
3000번지
*top
30
&top
100
30
3000
**top
num
*tmp
2000번지
1000번지
30
2000
data
*link
20
1000
data
*link
10
0
data
*link
▣ 자료구조 구현
◈ 분석
printf("%d", Pop(&top));
Stack 영역
main()
100번지
Pop()
Heap 영역
2000
1000
*top
20
&top
100
20
2000
**top
num
*tmp
2000번지
1000번지
20
1000
data
*link
10
0
data
*link
▣ 자료구조 구현
◈ 분석
printf("%d", Pop(&top));
Stack 영역
main()
100번지
Pop()
Heap 영역
1000
0
*top
10
&top
100
10
1000
**top
num
*tmp
1000번지
10
0
data
*link
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
100번지
0
*top
Heap 영역
▣ 자료구조 구현
◈ 문제
-. 미로게임 Stack 만들기
▣ 자료구조 이해
◈ 큐(Queue)
-. 연결리스트를 이용한 Queue 구현
Front
Data1
data
출력
(dequeue)
Data2
link
data
Rear
Data3
link
data
Enqueue(Data1)
Dequeue( )
Enqueue(Data2)
Dequeue( )
Enqueue(Data3)
Dequeue( )
link
입력
(enqueue)
▣ 자료구조 구현
◈ 문제
-. 연결리스트를 이용한 Queue 구현하기
▣ 자료구조 구현
◈ 재귀함수
-. 함수 내에서 자기 자신을 다시 호출하는 함수
Func( ) 함수
Func( );
Func( ) 함수
Func( );
Func( ) 함수
……..
Func( );
-. 종료되는 시점을 제대로 지정해주지 않으면 메모리가 가득 찰 때까지
계속해서 호출 하게 됨
▣ 함수
◈ 문제
#include <stdio.h>
void Func( );
void main(void)
{
Func( );
}
void Func( )
{
printf("Func 함수 호출\n");
Func( );
}
main 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
º
º
º
▣ 함수
◈ 문제
#include <stdio.h>
void Func( );
void main(void)
{
Func( );
}
void Func( )
{
int num = 0;
if(num == 5)
return;
printf("Func 함수 호출\n");
num++;
Func();
}
main 함수 영역
Func 함수 영역
0
1
num
Func 함수 영역
0
1
num
Func 함수 영역
0
1
num
º
º
º
▣ 함수
◈ 문제
#include <stdio.h>
void Func( );
void main(void)
{
Func( );
}
void Func( )
{
static int num = 0;
if(num == 5)
return;
printf("Func 함수 호출\n");
num++;
Func();
}
3
1
0
2
5
4
num
main 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
▣ 함수
◈ 문제
#include <stdio.h>
void Func( );
void main(void)
{
Func( 1 );
}
void Func( int num )
{
if(num == 5)
return;
printf("Func 함수 호출\n");
}
Func( num+1 );
main 함수 영역
Func 함수 영역
1
num
Func 함수 영역
2
num
Func 함수 영역
3
num
Func 함수 영역
4
num
Func 함수 영역
5
num
▣ 자료구조 구현
◈ 예제
-. 1 ~ 5 까지의 합을 구하는 함수를 작성하시오 (재귀함수 사용)
▣ 자료구조 구현
◈ 예제
-. 1 ~ 5 까지의 합을 구하는 함수를 작성하시오 (재귀함수 사용)
#include <stdio.h>
int Sum(int n)
{
if(n==5)
{
}
Sum()
1
n
+ 14
=
Sum()
2
n
+ 12
=
Sum()
3
n
+
9
=
Sum()
4
n
+
5
=
Sum()
5
n
return n;
}
return n+Sum(n+1);
void main()
{
printf("%d\n" , Sum(1));
}
15
main()
▣ 자료구조 구현
◈ 연결 리스트(Linked List)
-. 재귀함수를 이용한 연결리스트 구현(삽입)
Head
Data1
data
Data3
Data2
link
InsertNode(Data1)
InsertNode(Data2)
InsertNode(Data3)
data
link
data
link
▣ 자료구조 구현
◈ Linked List Code (Node , GetNode 함수 구현)
#include <stdio.h>
#include <malloc.h>
typedef struct node{
int data;
struct node *link;
}Linklist;
Linklist * GetNode(){
Linklist * ptr;
ptr = (Linklist * ) malloc ( sizeof ( Linklist ) );
ptr->link=NULL;
return ptr;
}
▣ 자료구조 구현
◈ Linked List Code (InsertNode , main 함수 구현)
void InsertNode (Linklist **head, int data) {
if ( *head == NULL ) {
*head = GetNode( );
(*head)->data = data;
return ;
}
InsertNode( &(*head)->link , data );
}
void main ( ) {
Linklist * head =NULL;
}
InsertNode( &head, 10 );
InsertNode( &head, 20 );
InsertNode( &head, 30 );
▣ 자료구조 구현
◈ 문제
-. 연결리스트 출력 함수 만들기
▣ 자료구조 구현
◈ 연결 리스트(Linked List)
-. 재귀함수를 이용한 연결리스트 구현(추가)
Head
Data1
data
Data3
Data2
link
data
Data4
data
AddNode(Data1 , Data4)
link
link
data
link
▣ 자료구조 구현
◈ 연결 리스트(Linked List)
-. 재귀함수를 이용한 연결리스트 구현(삭제)
Head
Data1
data
Data3
Data2
link
DeleteNode(Data2)
data
link
data
link
▣ 자료구조 구현
◈ 문제
-. 연결리스트 추가/삭제 함수 만들기
▣ 자료구조 구현
◈ 문제
-. 연결리스트를 이용한 학생관리 프로그램 만들기
▣ 자료구조 구현
◈ 트리(TREE)
-. 계층적 구조를 가진 데이터를 표현
Node
A
ROOT Node
부모 Node
B
C
형제 Node
D
자식 Node
E
F
G
H
I
Leap Node
(말단Node)
▣ 자료구조 구현
◈ 이진 트리(BINARY TREE)
-. Node 의 자식 수가 2 이하인 트리
A
B
D
C
E
F
▣ 자료구조 구현
◈ 전 이진 트리(FULL BINARY TREE)
-. 단말 Node 가 아닌 모든 Node 가 2개의 자식을 가진 트리
A
B
D
C
E
F
G
▣ 자료구조 구현
◈ 이진 탐색 트리(BINARY SEARCH TREE)
-. 순서가 있는 이진 트리
4
2
1
6
3
5
7
▣ 자료구조 이해
◈ 이진 탐색 트리(BINARY SEARCH TREE) 구현
-. 순서가 있는 이진 트리
InsertNode(10)
ROOT
Left
InsertNode(20)
data Right
InsertNode(5)
10
InsertNode(15)
5
20
15
▣ 자료구조 구현
◈ Tree Code (Node , GetNode 함수 구현)
#include <stdio.h>
#include <malloc.h>
typedef struct node {
struct node *left;
int data;
struct node *right;
}BST , *PBST;
PBST GetNode(){
PBST node = (PBST) malloc (sizeof (BST));
node->left = node->right = NULL;
return node;
}
▣ 자료구조 구현
◈ Tree Code (InsertNode 함수 구현)
void InsertNode(PBST *root , int data){
if ((*root) == NULL){
(*root) = GetNode();
(*root)->data = data;
}
else if ((*root)->data > data )
InsertNode(&(*root)->left, data);
else
InsertNode(&(*root)->right, data);
}
▣ 자료구조 구현
◈ Tree Code (main 함수 구현)
void main (){
PBST root = NULL;
InsertNode(&root,
InsertNode(&root,
InsertNode(&root,
InsertNode(&root,
}
10);
20);
5);
15);
▣ 자료구조 구현
◈ 트리의 순회
A
B
A
C
B
A
C
B
C
[전위 순회]
(PreOrder)
[중위 순회]
(InOrder)
[후위 순회]
(PostOrder)
탐색:
ROOT->왼쪽->오른쪽
탐색:
왼쪽->ROOT->오른쪽
탐색:
왼쪽->오른쪽->ROOT
ABC
BAC
BCA
▣ 자료구조 구현
◈ 트리의 전위 순회 구현(PreOrder) : ROOT->왼쪽->오른쪽
①
A
② B
③ D
C ⑤
E
④
⑥
F
A B D E C F G
G ⑦
▣ 자료구조 구현
◈ 트리의 중위 순회 구현(InOrder) : 왼쪽->ROOT->오른쪽
④ A
② B
① D
⑥ C
③
E
⑤
F
D B E A F C G
G ⑦
▣ 자료구조 구현
◈ 트리의 중위 순회 구현(PostOrder) : 왼쪽->오른쪽->ROOT
⑦
③
① D
A
B
C
E ②
④
F
D E B F G C A
⑥
G ⑤
▣ 자료구조 구현
◈ 문제
-. 트리 출력 함수 만들기
▣ 자료구조 이해
◈ 이진 탐색 트리(BINARY SEARCH TREE) 삭제
DeleteNode(5)
ROOT
Left
data Right
10
5
20
15
▣ 자료구조 이해
◈ 이진 탐색 트리(BINARY SEARCH TREE) 삭제
DeleteNode(20)
ROOT
Left
data Right
10
5
20
15
▣ 자료구조 이해
◈ 이진 탐색 트리(BINARY SEARCH TREE) 삭제
DeleteNode(20)
ROOT
Left
data Right
10
5
20
15
15
▣ 자료구조 이해
◈ 이진 탐색 트리(BINARY SEARCH TREE) 삭제
DeleteNode(10)
ROOT
Left
data Right
10
15
5
20
15
▣ 자료구조 구현
◈ 문제
-. 트리 삭제 함수 만들기