자기참조 구조체(1) 먼저 자신과 같은 형의 구조체를 포인트하는 포인터 멤버 필드를 갖는 구조체를 정의한다.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
C언어 응용 제 6 주 연결 자료구조.
C 언어 (STS ) 10. Pointer Applications.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
제14장 동적 메모리.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Chapter 04. 연결 리스트(Linked List) 2
연결리스트(linked list).
제 9 장 구조체와 공용체.
Linked List 학기 SANGJI University.
Chapter 05. 연결 자료 구조.
자료 구조: Chapter 3 (2)구조체, 포인터
7장 배열 ②.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
제 3 장 선형 리스트 3.1 선형 리스트 3.2 연결 리스트 3.3 다항식.
CHAP 4:리스트 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Chapter 9 – 구조형과 리스트 처리 Outline 9.1 자신 참조 구조형 9.2 선형 연결 리스트 9.3 리스트 연산
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
제 5 장. 스택(Stack).
10장 함수.
5장. 참조 타입.
제3장 스택과 큐.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
23장. 구조체와 사용자 정의 자료형 2.
자료구조: CHAP 4 리스트 (1) 순천향대학교 컴퓨터공학과 하 상 호.
보고서 #5(제출기한: 10/14) 다음 문제를 해결하시오.
제 2장 리스트.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
11장. 1차원 배열.
Introduction To Data Structures Using C
13. 연산자 오버로딩.
JA A V W. 03.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
* 프로그램을 간단히 하기 위해 malloc 성공체크는 안 함
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
C언어 응용 제7주 실습 해보기 제6장.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
객체기반 SW설계 팀활동지 4.
Canary value 스택 가드(Stack Guard).
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
데이터 동적 할당 Collection class.
구조체 (Structure).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
컴퓨터 개론 √ 원리를 알면 IT가 맛있다 쉽게 배우는 컴퓨터 기본 원리 한빛미디어 교재출판부.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
C++ Espresso 제15장 STL 알고리즘.
Pointers summary.
7 생성자 함수.
6 객체.
제 4 장. 리스트(List).
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

자기참조 구조체(1) 먼저 자신과 같은 형의 구조체를 포인트하는 포인터 멤버 필드를 갖는 구조체를 정의한다. struct list { int data; struct list *next; } a; struct list 형으로 선언된 a는 메모리 두 워드에 저장된다.

자기참조 구조체(2) 한 워드에는 멤버 data가 저장되고 두번째 워드에는 멤버 next가 저장된다. 포인터 변수 next를 연결(link)라고 한다. 각 구조체는 멤버 next에 의해 연속적으로 연결된다. 이를 그림으로 표현하면 다음과 같다. data next

자기참조 구조체(3) 포인터변수 next는 다음 list 원소의 메모리 주소나 0으로 정의되는 특별한 NULL값을 가진다. 다음과 같이 선언되었을 때 어떻게 리스트 연산이 수행되는지 살펴보자. struct list a,b,c; 먼저 선언된 구조체에 다음과 같은 배정문을 수행하여 보자.

자기참조 구조체(4) a.data = 1; b.data =2; c.data = 3; a.next = b.next = c.next = NULL; 그림으로 보면, 이코드의 결과는 다음과 같다. 1 NULL data next 2 NULL data next 3 NULL data next

자기참조 구조체(5) 노드들의 연결은 다음과 같이 할 수 있다. a.next = &b; b.next = &c; 이 포인트 배정문으로 a,b,c가 함께 연결된다. a.next->data 는 2의 값을 가진다. a.next->next->data 는 3의 값을 가진다. 1 data next 2 3 a b c NULL

선형 연결 리스트 선형 연결 리스트는 자료구조들이 순차적으로 매달려 있는 빨래줄과 같다. 헤드 포인터는 이 리스트상의 첫 번째 원소를 포인트하며 각 원소는 다음 원소를 포인트한다. 마지막 원소는 NULL값을 가진다. 구조체는 기억장소를 동적으로 할당하는 유틸리티 함수(malloc)를 사용한다.

기억장소 할당(1) malloc(size) head = malloc(sizeof(ELEMENT)); 위 문장은 먼저 ELEMENT를 저장할 수 있는 기억장소를 할당하고, 그 주소를 포인터 head에 배정한다. sizeof() 연산자는 특정 자료구조를 저장하기 위해 필요한 바이트 수를 계산한다.

기억장소할당(2) head = malloc(sizeof(ELEMENT)); head -> d = ‘n’; head -> next = NULL; 위의 코드는 리스트의 한 원소를 생성한다. n NULL data next head

기억장소할당(3) 두 번째 원소는 다음 배정문들로 추가된다. head -> next = malloc(sizeof(ELEMENT)); head -> next -> d = ‘e’; head -> next -> next = NULL; n e NULL head

기억장소할당(4) 다음 코드로 마지막 원소를 추가한다. head -> next -> next = malloc(sizeof(ELEMENT)); head -> next -> next -> d = ‘w’; head -> next -> next -> next = NULL; n e w NULL head

리스트 연산(1) 선형 리스트에 대한 기본 연산으로는 다음과 같은 것이 있다. 1. 리스트 생성 2. 원소 개수 세기 3. 원소 탐색 4. 두 리스트 결합 5. 원소 삽입 6. 원소 삭제

리스트 연산(2) 재귀적 리스트 생성 : p447-448 반복적 리스트 생성 : p449

리스트 처리 함수(1) 리스트에 있는 원소의 수를 세는 함수 int count(LINK head) { } if( head == NULL) return; else return ( 1 + count(head -> next)); } COUNT() 함수는 리스트가 공백이면 0을 리턴하고 그렇지 않으면 리스트의 원소의 수를 리턴한다.

리스트 처리 함수(2) 리스트의 원소를 출력하는 함수 void print_list(LINK head) { if(head == NULL) printf(“NULL”); else { printf(“%c --> “, head -> d); print_list(head -> next); } 재귀적으로 리스트의 원소를 방문하면서 멤버 변수 d의 값을 출력한다.

리스트 삽입(1) 리스트의 가장 유용한 특성은 원소를 삽입할 경우 고정된 시간내에 수행될 수 있다는 것이다. 배열을 사용할 경우 새로운 삽입시 배열 길이에 비례하게 된다. 왜냐하면 새로 삽입된 값 다음에 오는 모든 원소 값을 한 위치씩 이동해야 되기 때문이다. 다음 그림은 p1과 p2가 인접한 원소를 포인트 하고 있고, 그 사이에 q가 포인트하고 있는 새로운 원소를 삽입하는 경우를 나타낸 것이다

리스트 삽입(2) 삽입전 B A C p1 p2 NULL q

리스트 삽입(3) 삽입후 p1 p2 void insert(LINK p1, LINK p2, LINK q) { p1 -> next = q; q -> next = p2; } p1과 p2가 포인트하는 원소 사이에 q가 포인트하는 원소를 삽입하는 것이다. B A C p1 p2 q

리스트 삭제(1) 삭제될 원소의 후속자를 삭제될 원소의 선행자에 연결하면 된다. 삭제전(B를 삭제하려고 한다.) 다음 코드를 실행해 보자. p -> next = p -> next -> next A B C p

리스트 삭제(2) 삭제후 p void delete_list(LINK head) { if(head != NULL) { delete_list(head -> next); free(head); } free() 함수는 할당받은 기억장소를 시스템에 반납하는 함수 이다. p A B C

스 택 스택은 서류함을 쌓아 놓은 것으로 볼 수 있다. 이 더미에서 서류함을 가져 갈 때는 항상 제일 위(top)에 있는 것을 가져 가고, 서류함을 쌓을 때도 항상 제일 위(top)에 올려 놓는다. top B A

스택에 삽입 push()루틴은 시스템에 기억장소를 리턴하기 위해 free()함수를 사용하였으며 리스트에서 삽입과 같다. void push(data d, stack *stk) { elem *p; p = malloc(sizeof(elem)); p -> d = d; p -> next = stk -> top; stk -> top = p; stk -> cnt++; }

스택에서 삭제 pop()루틴은 새로운 스택 원소를 생성하기 위해 기억장소 할당자 malloc()을 사용하였고 리스트에서 삭제와 같다. data pop(stack *stk) { data d; elem *p; d = stk -> top -> d; p = stk -> top; stk -> top = stk -> top -> next; stk -> cnt--; free(p); return d; }