750 likes | 1.07k Views
▣ 수강동 의. -. http://mgr.eduitbank.com site 접속 -. 로그인 : ( 처음접속 시 ) 아이디 찾기 > 학생으로 검색 후 로그 인 ※ 주의 : 절대 비밀번호 찾기 하지 말 것 . -. 나의 정보 > 출석정보 > 자료구 조 > 수강 동의. 자료구조. ( 오른쪽 상단 ). ▣ 카페 소개. Cafe : http:// cafe.naver.com/hellolang ※ 숙제 및 문의사항은 Café 이 용. ▣ 참고사항. 자료 구조
E N D
▣ 수강동의 -. 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) ◈ 비 선형 구조 -. 데이터를 선의 형태가 아닌 다른 형태로 저장하는 방식 -. 이전 데이터와 이후 데이터는 1대 다 관계를 가짐 -. 트리(Tree) , 그래프(Graph) Data Data Data Data Data Data Data Data
▣ 자료구조 이해 ◈ 스택(Stack) -. 삽입(insert)과 삭제(delete)가 한쪽 끝에서만 수행되는 구조 -. LIFO(Last In First Out) : 마지막에 들어간 데이터가 먼저 나오는 구조 입력(Push) 출력(Pop) <Data 처리순서> 입력 : Data1 -> Data2 -> Data3 출력 : Data3 -> Data2 -> Data1 Data3 Top Data2 Data1 Bottom
▣ 자료구조 이해 ◈ 큐(Queue) -. 한쪽에선 삽입(insert)만 한쪽에선 삭제(delete)만 수행되는 구조 -. FIFO(First In First Out) : 먼저 들어간 데이터가 먼저 나오는 구조 입력 (enqueue) 출력 (dequeue) Data3 Data2 Data1 Rear Front <Data 처리순서> 입력 : Data1 -> Data2 -> Data3 출력 : Data1 -> Data2 -> Data3
▣ 자료구조 이해 ◈ 리스트(List) -. 데이터를 순서대로 저장해 놓는 구조 -. 대표적으로 배열이 있음 -. 스택, 큐도 넓은 의미로는 리스트에 해당됨 <배열> Data1 Data2 Data3 [0] [1] [2] [3] [4] Data4
▣ 자료구조 이해 ◈ 연결 리스트(List) -. 데이터들을 링크를 통해 연결시켜 저장하는 구조 노드(Node) data link
▣ 자료구조 이해 ◈ 트리(Tree) -. 나무의 뿌리에서 가지를 뻗는 것처럼 하나의 데이터에 가지를 뻗어 저장하는 구조 노드(Node) link data link
▣ 자료구조 이해 ◈ 그래프(Graph) -. 컴퓨터로 수치 계산 등을 한 결과를 그대로 숫자(number)의 나열로서 표현하는 것이 아니고, 시각적으로 이해할 수 있도록 막대 그래프, 원 그래프로 표시한 것
▣ 자료구조 이해 ◈ 알고리즘 -. 어떤문제를 해결하기 위한 방법
▣ 자료구조 구현 ◈ 스택(Stack) -. 배열을 이용한 Stack 구현 입력(Push) 출력(Pop) Data3 Top Data2 Data1
▣ 자료구조 구현 ◈ Stack Code (Node , Push 함수 구현) #include <stdio.h> typedefstruct 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 영역 Stack st; st.top = -1; top -1 [4] [3] [2] [1] [0] main() stackArea st
▣ 자료구조 구현 ◈ 분석 Stack 영역 Push(&st , 10); top -1 0 [4] [3] [2] [1] [0] main() stackArea 10 st 100번지 Push() 100 &st 10 st data
▣ 자료구조 구현 ◈ 분석 Stack 영역 Push(&st , 20); top 1 0 [4] [3] [2] [1] [0] main() stackArea 20 10 st 100번지 Push() 100 &st 20 st data
▣ 자료구조 구현 ◈ 분석 Stack 영역 Push(&st , 30); top 2 1 [4] [3] [2] [1] [0] main() stackArea 30 20 10 st 100번지 Push() 100 &st 30 st data
▣ 자료구조 구현 ◈ 분석 Stack 영역 printf("%d\n" , Pop(&st)); top 1 2 [4] [3] [2] [1] [0] main() stackArea 30 20 30 10 st 100번지 Pop() 100 &st 30 st data
▣ 자료구조 구현 ◈ 분석 Stack 영역 printf("%d\n" , Pop(&st)); top 0 1 [4] [3] [2] [1] [0] main() stackArea 30 20 20 10 st 100번지 Pop() 100 &st 20 st data
▣ 자료구조 구현 ◈ 분석 Stack 영역 printf("%d\n" , Pop(&st)); top -1 0 [4] [3] [2] [1] [0] main() stackArea 30 20 10 10 st 100번지 Pop() 100 &st 10 st data
▣ 자료구조 구현 ◈ 분석 Stack 영역 printf("%d\n" , Pop(&st)); top -1 [4] [3] [2] [1] [0] main() stackArea 30 20 0 10 st 100번지 Pop() 100 &st st data
▣ 자료구조 구현 ◈ 스택(Stack) -. 연결리스트를 이용한 Stack 구현 입력(Push) Push(Data1) 출력(Pop) Push(Data2) Push(Data3) Data3 data data data link link link Pop( ) Pop( ) Data2 Pop( ) Top Data1
▣ 자료구조 구현 ◈ Stack Code (Node , GetNode함수 구현) #include <stdio.h> #include <stdlib.h> #define EMPTY 0 struct node { int data; struct node * link; }; typedefstruct 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 영역 0 main() *top
▣ 자료구조 구현 ◈ 분석 Push(&top, 10); Stack 영역 Heap 영역 0 main() 1000 *top 100번지 Push() &top 100 10 0 **top data *tmp 1000 GetNode() 10 0 *tmp data *link 1000번지
▣ 자료구조 구현 ◈ 분석 Push(&top, 20); Stack 영역 Heap 영역 1000 main() 2000 *top 100번지 Push() &top 100 20 1000 20 1000 0 **top data *tmp data *link 2000번지 2000 GetNode() 10 0 *tmp data *link 1000번지
▣ 자료구조 구현 ◈ 분석 Push(&top, 30); Stack 영역 Heap 영역 30 2000 0 2000 main() 3000 data *link 3000번지 *top 100번지 Push() &top 100 30 2000 20 1000 **top data *tmp data *link 2000번지 3000 GetNode() 10 0 *tmp data *link 1000번지
▣ 자료구조 구현 ◈ 분석 printf("%d", Pop(&top)); Stack 영역 Heap 영역 30 2000 3000 main() 2000 data *link 3000번지 30 *top 100번지 Pop() &top 100 30 3000 20 1000 **top num *tmp data *link 2000번지 10 0 data *link 1000번지
▣ 자료구조 구현 ◈ 분석 printf("%d", Pop(&top)); Stack 영역 Heap 영역 2000 main() 1000 20 *top 100번지 Pop() &top 100 20 2000 20 1000 **top num *tmp data *link 2000번지 10 0 data *link 1000번지
▣ 자료구조 구현 ◈ 분석 printf("%d", Pop(&top)); Stack 영역 Heap 영역 1000 main() 0 10 *top 100번지 Pop() &top 100 10 1000 **top num *tmp 10 0 data *link 1000번지
▣ 자료구조 구현 ◈ 분석 Stack 영역 Heap 영역 0 main() *top 100번지
▣ 자료구조 구현 ◈ 문제 -. 미로게임 Stack 만들기
▣ 자료구조 이해 ◈ 큐(Queue) -. 연결리스트를 이용한 Queue 구현 Front Rear Data1 Data2 Data3 data data data link link link 출력 (dequeue) 입력 (enqueue) Enqueue(Data1) Dequeue( ) Enqueue(Data2) Dequeue( ) Enqueue(Data3) Dequeue( )
▣ 자료구조 구현 ◈ 문제 -. 연결리스트를 이용한 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( ) { intnum = 0; if(num == 5) return; printf("Func함수 호출\n"); num++; Func(); } main 함수 영역 Func함수 영역 Func함수 영역 Func함수 영역 0 1 num num num 0 1 0 1 º º º
▣ 함수 ◈ 문제 0 3 1 2 5 4 #include <stdio.h> void Func( ); void main(void) { Func( ); } void Func( ) { staticintnum = 0; if(num == 5) return; printf("Func함수 호출\n"); num++; Func(); } main 함수 영역 Func함수 영역 Func함수 영역 Func함수 영역 Func함수 영역 Func함수 영역 num
▣ 함수 ◈ 문제 #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함수 영역 1 num num num num num 2 3 4 5
▣ 자료구조 구현 ◈ 예제 -. 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)); } 15 main() Sum() 1 + 14 = n Sum() 2 + 12 = n Sum() 3 + 9 = n 5 Sum() 4 + = n Sum() 5 n
▣ 자료구조 구현 ◈ 연결 리스트(Linked List) -. 재귀함수를 이용한 연결리스트 구현(삽입) Head Data3 Data1 Data2 data data data link link link InsertNode(Data1) InsertNode(Data2) InsertNode(Data3)
▣ 자료구조 구현 ◈ Linked List Code (Node , GetNode함수 구현) #include <stdio.h> #include <malloc.h> typedefstruct node{ int data; struct node *link; }Linklist; Linklist * GetNode(){ Linklist * ptr; ptr = (Linklist * ) malloc ( sizeof ( Linklist ) ); ptr->link=NULL; return ptr; }