Download - ▣ 수강동 의
▣ 수강동의
-. http://mgr.eduitbank.com site 접속 -. 로그인 : ( 처음접속 시 ) 아이디 찾기 > 학생으로 검색 후 로그인
※ 주의 : 절대 비밀번호 찾기 하지 말 것 .
-. 나의 정보 > 출석정보 > 자료구조 > 수강 동의
( 오른쪽 상단 )
자료구조
▣ 카페 소개
Cafe : http://cafe.naver.com/hellolang
※ 숙제 및 문의사항은 Café 이용
▣ 참고사항
자료 구조(Data Struc-
ture)
▣ 자료구조 이해
◈ 자료 구조 란 ? -. 사전적 의미 : 데이터를 처리하는 입장에서 데이터 사이에 존재하는
관계를 개념적으로 잡은 것 -. 데이터를 효율적으로 사용할 수 있도록 구조를 만들어서 저장하는 것
Data
Data
Data
Data Dat
a
Data
Data
Data
Data
Data
Data
Data
▣ 자료구조 이해
◈ 선형 구조 -. 데이터를 선의 형태로 일렬로 저장하는 방식 -. 이전 데이터와 이후 데이터는 1 대 1 관계를 가짐 -. 스택 (Stack) , 큐 (Queue) , 연결리스트 (Linked List)
◈ 비 선형 구조 -. 데이터를 선의 형태가 아닌 다른 형태로 저장하는 방식 -. 이전 데이터와 이후 데이터는 1 대 다 관계를 가짐 -. 트리 (Tree) , 그래프 (Graph)
Data Data Data
Data
Data
Data
Data
Data
▣ 자료구조 이해
◈ 스택 (Stack) -. 삽입 (insert) 과 삭제 (delete) 가 한쪽 끝에서만 수행되는 구조 -. LIFO(Last In First Out) : 마지막에 들어간 데이터가 먼저 나오는 구조
Data1
Data2
Data3
입력 (Push) 출력 (Pop)
Bottom Top
<Data 처리순서 >입력 : Data1 -> Data2 -> Data3출력 : Data3 -> Data2 -> Data1
▣ 자료구조 이해
◈ 큐 (Queue) -. 한쪽에선 삽입 (insert) 만 한쪽에선 삭제 (delete) 만 수행되는 구조 -. FIFO(First In First Out) : 먼저 들어간 데이터가 먼저 나오는 구조
Data3 Data2 Data1
입력(enqueue)
출력(dequeue)
Front
Rear<Data 처리순서 >입력 : Data1 -> Data2 -> Data3출력 : Data1 -> Data2 -> Data3
▣ 자료구조 이해
◈ 리스트 (List) -. 데이터를 순서대로 저장해 놓는 구조 -. 대표적으로 배열이 있음 -. 스택 , 큐도 넓은 의미로는 리스트에 해당됨
[0] [1] [2] [3] [4]
Data1 Data2 Data3
Data4
< 배열 >
▣ 자료구조 이해
◈ 연결 리스트 (List) -. 데이터들을 링크를 통해 연결시켜 저장하는 구조
data link
노드 (Node)
▣ 자료구조 이해
◈ 트리 (Tree) -. 나무의 뿌리에서 가지를 뻗는 것처럼 하나의 데이터에 가지를 뻗어 저장하는 구조
data linklink
노드 (Node)
▣ 자료구조 이해
◈ 그래프 (Graph) -. 컴퓨터로 수치 계산 등을 한 결과를 그대로 숫자 (number) 의 나열로서 표현하는 것이 아니고 , 시각적으로 이해할 수 있도록 막대 그래프 , 원 그래프로 표시한 것
▣ 자료구조 이해
◈ 알고리즘 -. 어떤 문제를 해결하기 위한 방법
▣ 자료구조 구현
◈ 스택 (Stack) -. 배열을 이용한 Stack 구현
Data1
Data2
Data3
입력 (Push) 출력 (Pop)
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" , Pop(&st));printf("%d\n" , Pop(&st));printf("%d\n" , Pop(&st));printf("%d\n" , Pop(&st));
}
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
stackArea
top
st
-1
[4
]
[3
]
[2
]
[1
]
[0
]
st.top = -1;Stack st;
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
stackArea
top
st
-1
Push() &st 10
100 번지
100
st data
0
[4
]
[3
]
[2
]
[1
]
[0
]
10
Push(&st , 10);
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
Push() &st 20100
st data
stackArea
top
st100 번지
[4
]
[3
]
[2
]
[1
]
[0
]
0
10
1
20
Push(&st , 20);
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
Push() &st 30100
st data
stackArea
top
st100 번지
[4
]
[3
]
[2
]
[1
]
[0
]
1
10
2
20
30
Push(&st , 30);
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
Pop() &st100
st data
stackArea
top
st100 번지
[4
]
[3
]
[2
]
[1
]
[0
]
2
10
1
20
30
30
30
printf("%d\n" , Pop(&st));
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
Pop() &st100
st data
stackArea
top
st100 번지
[4
]
[3
]
[2
]
[1
]
[0
]
1
10
0
20
30
20
20
printf("%d\n" , Pop(&st));
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
Pop() &st100
st data
stackArea
top
st100 번지
[4
]
[3
]
[2
]
[1
]
[0
]
0
10
-1
20
30
10
10
printf("%d\n" , Pop(&st));
▣ 자료구조 구현
◈ 분석
Stack 영역
main()
Pop() &st100
st data
stackArea
top
st100 번지
[4
]
[3
]
[2
]
[1
]
[0
]
10
-1
20
30
0
printf("%d\n" , Pop(&st));
▣ 자료구조 구현
◈ 스택 (Stack) -. 연결리스트를 이용한 Stack 구현
입력 (Push) 출력 (Pop)
Top
data link
Data1
data link
Data2
data link
Data3
Push(Data1)
Push(Data2)
Push(Data3)
Pop( )
Pop( )
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 영역
▣ 자료구조 구현
◈ 분석 Stack * top=EMPTY;
main()
*top
0
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석 Push(&top, 10);
main()
*top
0
Push() &top 10
**top data
100 번지
100
*tmp
0
GetNode()
*tmpdata *link1000 번지
10000
1000
10
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석 Push(&top, 20);
main()
*top
1000
Push() &top 20
**top data
100 번지
100
*tmp
1000
GetNode()
*tmpdata *link1000 번지
20000
2000
10
data *link2000 번지
020 1000
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석 Push(&top, 30);
main()
*top
2000
Push() &top 30
**top data
100 번지
100
*tmp
2000
GetNode()
*tmpdata *link1000 번지
30000
3000
10
data *link2000 번지
20 1000
data *link3000 번지
030 2000
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석 printf("%d", Pop(&top));
main()
*top
3000
Pop() &top 30
**top num
100 번지
100
*tmp
3000
data *link1000 번지
0
2000
10
data *link2000 번지
20 1000
data *link3000 번지
30 2000
30
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석 printf("%d", Pop(&top));
main()
*top
2000
Pop() &top 20
**top num
100 번지
100
*tmp
2000
data *link1000 번지
0
1000
10
data *link2000 번지
20 1000
20
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석 printf("%d", Pop(&top));
main()
*top
1000
Pop() &top 10
**top num
100 번지
100
*tmp
1000
data *link1000 번지
0
0
10
10
Stack 영역 Heap 영역
▣ 자료구조 구현
◈ 분석
main()
*top
0
100 번지
▣ 자료구조 구현
◈ 문제
-. 미로게임 Stack 만들기
▣ 자료구조 이해
◈ 큐 (Queue) -. 연결리스트를 이용한 Queue 구현
Front Rear
data link
출력(dequeue)
입력(enqueue)
Enqueue(Data1)
Enqueue(Data2)
Enqueue(Data3)
Dequeue( )
Dequeue( )
Dequeue( )
Data1
data link
Data2
data link
Data3
▣ 자료구조 구현
◈ 문제
-. 연결리스트를 이용한 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 함수 영역
ººº
num01
Func 함수 영역num
01
Func 함수 영역num
01
◈ 문제
#include <stdio.h>void Func( );void main(void){
Func( );}void Func( ){
static int num = 0;if(num == 5)
return;printf("Func 함수 호출 \
n");num++;Func();
}
▣ 함수
main 함수 영역
Func 함수 영역
num01
Func 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
2345
◈ 문제
#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 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
Func 함수 영역
num1
num2
num3
num4
num5
◈ 예제
-. 1 ~ 5 까지의 합을 구하는 함수를 작성하시오 ( 재귀함수 사용 )
▣ 자료구조 구현
◈ 예제
-. 1 ~ 5 까지의 합을 구하는 함수를 작성하시오 ( 재귀함수 사용 )
#include <stdio.h>
int Sum(int n){
if(n==5){
return n;}return n+Sum(n+1);
}
void main(){
printf("%d\n" , Sum(1));}
▣ 자료구조 구현
main()Sum()
n1
Sum()
n2
Sum()
n3
Sum()
n4
Sum()
n5
5+ =
9+ =
12+ =
14+ =
15
▣ 자료구조 구현
◈ 연결 리스트 (Linked List) -. 재귀함수를 이용한 연결리스트 구현 ( 삽입 )
Head
data link
Data1
data link
Data2
data link
Data3
InsertNode(Data1)
InsertNode(Data2)
InsertNode(Data3)
▣ 자료구조 구현
◈ 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
data link
Data1
data link
Data2
data link
Data3
AddNode(Data1 , Data4)
data link
Data4
▣ 자료구조 구현
◈ 연결 리스트 (Linked List) -. 재귀함수를 이용한 연결리스트 구현 ( 삭제 )
Head
data link
Data1
data link
Data2
data link
Data3
DeleteNode(Data2)
▣ 자료구조 구현
◈ 문제
-. 연결리스트 추가 / 삭제 함수 만들기
▣ 자료구조 구현
◈ 문제
-. 연결리스트를 이용한 학생관리 프로그램 만들기
▣ 자료구조 구현
◈ 트리 (TREE) -. 계층적 구조를 가진 데이터를 표현
A
B D
E GF
C
IH
ROOT Node
Node
Leap Node( 말단 Node)
형제 Node
부모 Node
자식 Node
▣ 자료구조 구현
◈ 이진 트리 (BINARY TREE) -. Node 의 자식 수가 2 이하인 트리
A
B C
D E F
▣ 자료구조 구현
◈ 전 이진 트리 (FULL BINARY TREE) -. 단말 Node 가 아닌 모든 Node 가 2 개의 자식을 가진 트리
A
B C
D E GF
▣ 자료구조 구현
◈ 이진 탐색 트리 (BINARY SEARCH TREE) -. 순서가 있는 이진 트리
4
2 6
1 3 75
▣ 자료구조 이해
◈ 이진 탐색 트리 (BINARY SEARCH TREE) 구현 -. 순서가 있는 이진 트리
data RightLeft
ROOTInsertNode(10)
10
InsertNode(20)
20
InsertNode(5)
15
InsertNode(15)
5
▣ 자료구조 구현
◈ 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, 10);InsertNode(&root, 20);InsertNode(&root, 5);InsertNode(&root, 15);
}
▣ 자료구조 구현
◈ 트리의 순회
A
B C
[ 전위 순회 ](PreOrder)
탐색 :ROOT-> 왼쪽 -> 오른쪽
A
B C
[ 중위 순회 ](InOrder)
탐색 :왼쪽 ->ROOT-> 오른쪽
A
B C
[ 후위 순회 ](PostOrder)
탐색 :왼쪽 -> 오른쪽 ->ROOT
A B C B A C B C A
▣ 자료구조 구현
◈ 트리의 전위 순회 구현 (PreOrder) : ROOT-> 왼쪽 -> 오른쪽
A
B C
D FE G
①
②
③ ④
⑤
⑥
A B D E C F G
⑦
▣ 자료구조 구현
◈ 트리의 중위 순회 구현 (InOrder) : 왼쪽 ->ROOT-> 오른쪽
A
B C
D FE G①
②
③
④
⑤
⑥
D B E A F C G
⑦
▣ 자료구조 구현
◈ 트리의 중위 순회 구현 (PostOrder) : 왼쪽 -> 오른쪽 ->ROOT
A
B C
D FE G① ②
③
④ ⑤
⑥
D E B F G C A
⑦
▣ 자료구조 구현
◈ 문제
-. 트리 출력 함수 만들기
▣ 자료구조 이해
◈ 이진 탐색 트리 (BINARY SEARCH TREE) 삭제
data RightLeft
ROOTDeleteNode(5)
10
20
15
5
▣ 자료구조 이해
◈ 이진 탐색 트리 (BINARY SEARCH TREE) 삭제
data RightLeft
ROOTDeleteNode(20)
10
20
15
5
▣ 자료구조 이해
◈ 이진 탐색 트리 (BINARY SEARCH TREE) 삭제
data RightLeft
ROOTDeleteNode(20)
10
20
15
5 15
▣ 자료구조 이해
◈ 이진 탐색 트리 (BINARY SEARCH TREE) 삭제
data RightLeft
ROOTDeleteNode(10)
10
20
15
5
15
▣ 자료구조 구현
◈ 문제
-. 트리 삭제 함수 만들기