340 likes | 503 Views
D ata s tructures. 01.3: C++ p ointers. 동의대학교 멀티미디어공학과 이광의교수. T oday’s t opic. 자료구조의 정의 정의 1: 자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다 . 정의 2: 자료구조는 추상자료형이다 . 정의 3: 자료구조는 잘 알려지고 유용한 추상자료형이다 . C++ 클래스 : 추상자료형의 구현 클래스 기초 클래스 구현 예 1: 채널목록 추상자료형의 ( 정렬되지 않은 목록 ) 구현
E N D
Data structures 01.3: C++ pointers 동의대학교 멀티미디어공학과 이광의교수
Today’s topic • 자료구조의정의 • 정의1: 자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다. • 정의2: 자료구조는 추상자료형이다. • 정의3: 자료구조는 잘 알려지고 유용한 추상자료형이다. • C++클래스: 추상자료형의 구현 • 클래스 기초 • 클래스 구현 예 1: 채널목록 추상자료형의(정렬되지 않은 목록) 구현 • 클래스 구현 예 2: 채널목록 추상자료형의(채널이름 순으로 정렬된 목록) 구현 • 포인터 • 포인터 기초 • 포인터 활용 예 1 Dept. of Multimedia Engineering, DongEui Univ.(2)
Fundamentals of pointers • 포인터(포인터변수)란무엇인가? • 메모리 번지를 저장할 수 있는 변수 • 다른 변수의 위치를 저장할 수 있는 변수 • 또 다른 정의 • 포인터는 왜 사용하는가? • 메모리를 동적으로 할당 받을 때 • 매개변수가 변경되어 돌려지기를 원할 때 • 이름 없는 변수의 사용 • 또 다른 이유 Dept. of Multimedia Engineering, DongEui Univ.(3)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예 • voidmain ( ) { • int a = 3; • int *pa = &a; • cout << a << “ ” << *pa << endl; • intarr[10]; • arr[2] = 3; • cout << arr[2] << endl; • int* prr; • prr = new int[10] • // int * prr = new int[10]; • prr[2] = 3; • cout << prr[2] << endl; • } pa 3 a [4] [3] 3 [2] [1] [0] arr [4] [3] 3 [2] [1] prr [0] Dept. of Multimedia Engineering, DongEui Univ.(4)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: 동적 기억장소 할당 • voidmain ( ) { • int n; • cin >> n; • // intarr[n] 오류!! • int* prr = new int[n]; • if(n>=3) { • prr[2] = 4; • cout<< prr[2] << endl; • } • } prr ? [4] [3] 4 [2] [1] prr [0] Dept. of Multimedia Engineering, DongEui Univ.(5)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by value값에 의한 호출 • void swap (int x, int y) { • inttmp = x; • x = y; • y = tmp; • } • voidmain ( ) { • int a = 3; b = 4; ◀ • swap (a, b); • cout << a << “ ” << b << endl; • } a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(6)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by value값에 의한 호출 • void swap (int x, int y) { ◀ • inttmp = x; • x = y; • y = tmp; • } • voidmain ( ) { • int a = 3; b = 4; • swap (a, b); ◀ • cout << a << “ ” << b << endl; • } x 3 4 y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(7)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by value값에 의한 호출 • void swap (int x, int y) { • inttmp = x; ◀ • x = y; ◀ • y = tmp; ◀ • } • voidmain ( ) { • int a = 3; b = 4; • swap (a, b); ◀ • cout << a << “ ” << b << endl; • } tmp 3 x 3 >> 4 4 >> 3 y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(8)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by value값에 의한 호출 • void swap (int x, int y) { • inttmp = x; • x = y; • y = tmp; • } • voidmain ( ) { • int a = 3; b = 4; • swap (a, b); • cout << a << “ ” << b << endl; ◀ • } • // 출력은 3 4 tmp 3 x 3 >> 4 4 >> 3 y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(9)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by reference참조에 의한 호출 • void swap (int *x, int *y) { • inttmp = *x; • *x = *y; • *y = tmp; • } • voidmain ( ) { • int a = 3; b = 4; ◀ • swap (&a, &b); • cout << a << “ ” << b << endl; • } • // 출력은 4 3 a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(10)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by reference참조에 의한 호출 • void swap (int *x, int *y) { ◀ • inttmp = *x; • *x = *y; • *y = tmp; • } • voidmain ( ) { • int a = 3; b = 4; • swap (&a, &b); ◀ • cout << a << “ ” << b << endl; • } x y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(11)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by reference참조에 의한 호출 • void swap (int *x, int *y) { • inttmp = *x; ◀ • *x = *y; ◀ • *y = tmp; ◀ • } • voidmain ( ) { • int a = 3; b = 4; • swap (&a, &b); ◀ • cout << a << “ ” << b << endl; • } tmp 3 x y a 3 >> 4 4 >> 3 b Dept. of Multimedia Engineering, DongEui Univ.(12)
Fundamentals of pointers • 포인터의 사용 예 • 단순변수의 포인터 활용 예: call by reference참조에 의한 호출 • void swap (int *x, int *y) { • inttmp = *x; • *x = *y; • *y = tmp; • } • voidmain ( ) { • int a = 3; b = 4; • swap (&a, &b); • cout << a << “ ” << b << endl; ◀ • } • // 출력은 4 3 tmp 3 x y a 3 >> 4 4 >> 3 b Dept. of Multimedia Engineering, DongEui Univ.(13)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); ◀ • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); • } node3.nptr = ptr2; • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; • intchn; cout << node3.nptr->nptr->chn << endl; • string name; deleteptr1; • class Node * nptr; node3.nptr->next = 0; ptr1=0; • }; … (*ptr1).chn ptr1 14 동의TV (*ptr1).name 0 (*ptr1).nptr Dept. of Multimedia Engineering, DongEui Univ.(14)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); ◀ • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); • } node3.nptr = ptr2; • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; • intchn; cout << node3.nptr->nptr->chn << endl; • string name; deleteptr1; • class Node * nptr; node3.nptr->next = 0; ptr1=0; • }; … ptr1 ptr2 14 2 동의TV CJ홈쇼핑 0 0 Dept. of Multimedia Engineering, DongEui Univ.(15)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); ◀ • } node3.nptr = ptr2; • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; • intchn; cout << node3.nptr->nptr->chn << endl; • string name; deleteptr1; • class Node * nptr; node3.nptr->next = 0; ptr1=0; • }; … ptr1 ptr2 14 2 7 동의TV CJ홈쇼핑 시네마TV 0 0 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(16)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); • } node3.nptr = ptr2; ◀ • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; • intchn; cout << node3.nptr->nptr->chn << endl; • string name; deleteptr1; • class Node * nptr; node3.nptr->next = 0; ptr1=0; • }; … ptr1 ptr2 14 2 7 동의TV CJ홈쇼핑 시네마TV 0 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(17)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); • } node3.nptr = ptr2; • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; ◀ • intchn; cout << node3.nptr->nptr->chn << endl; ◀ • string name; deleteptr1; • class Node * nptr; node3.nptr->next = 0; ptr1=0; • }; … ptr1 ptr2 14 2 7 동의TV CJ홈쇼핑 시네마TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(18)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); • } node3.nptr = ptr2; • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; • intchn; cout << node3.nptr->nptr->chn << endl; • string name; deleteptr1; ◀ • class Node * nptr; node3.nptr->next = 0; ptr1=0; • }; … ptr1 ptr2 14 2 7 동의TV CJ홈쇼핑 시네마TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(19)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node노드 • class Node { … • public: Node * ptr1 = new Node(14, “동의TV”); • Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ홈쇼핑”); • chn = nu; name = na; nptr = ptr; Nodenode3(7, “시네마TV”); • } node3.nptr = ptr2; • public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; • intchn; cout << node3.nptr->nptr->chn << endl; • string name; deleteptr1; • class Node * nptr; node3.nptr-> nptr= 0; ptr1=0; ◀★★★ • }; … ptr1 0 ptr2 14 2 7 동의TV CJ홈쇼핑 시네마TV 0 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(20)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; ◀ • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); • Node * head; … • }; lst 0 lst.head Dept. of Multimedia Engineering, DongEui Univ.(21)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); ◀ • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); • Node * head; … • }; lst 7 시네마TV 0 Dept. of Multimedia Engineering, DongEui Univ.(22)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); ◀ • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); • Node * head; … • }; lst 7 2 시네마 TV CJ홈쇼핑 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(23)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); ◀ • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); • Node * head; … • }; lst 7 2 시네마 TV CJ홈쇼핑 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(24)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); ◀ • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); • Node * head; … • }; lst 7 2 14 시네마 TV CJ홈쇼핑 동의 TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(25)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); ◀ • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); • Node * head; … • }; lst 7 2 14 시네마 TV CJ홈쇼핑 동의 TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(26)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; ◀ • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; ◀ • private: lst.delete Num(2); • Node * head; … • }; lst 7 2 14 시네마 TV CJ홈쇼핑 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(27)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); ◀ • Node * head; … • }; lst 7 2 14 시네마 TV CJ홈쇼핑 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(28)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); ◀ • Node * head; … • }; lst 7 2 14 시네마 TV CJ홈쇼핑 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(29)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: node list노드목록 • class Node { … } … • class channelList { // NodeListchannelListlst; • public: lst.addCh(7, “시네마TV”); • channelList ( ) { head = 0; }; lst.addCh(2, “CJ홈쇼핑”); • string chNameOf (int nu); lst.addCh(14, “동의TV”); • void deleteNum (int nu); cout << “7: ”; • void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; • private: lst.delete Num(2); ◀ • Node * head; … • }; lst 7 14 시네마 TV 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(30)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: 함수의 구현 string chNameOf (int nu); • class Node { … } string chNameOf(int nu) { • class channelList { // NodeList Node * ptr = head; • public: while (ptr!=0) { • channelList ( ) { head = 0; }; if (ptr->chn==nu) • string chNameOf (int nu); retrunptr->name; • void deleteNum (int nu); ptr = ptr->nptr; ★★★ • void addCh (int nu, string na); } • private: return “채널없음”; • Node * head; } • }; lst 7 2 14 시네마 TV CJ홈쇼핑 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(31)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: 함수의 구현 void deleteNum (int nu, string na); • class Node { … } void deleteNum (int nu) { • class channelList { // NodeList if (head==0) return; • public: if (head->nu==nu) { • channelList ( ) { head = 0; }; Node *tmp = head; • string chNameOf (int nu); head = head->nptr; • void deleteNum (int nu); delete tmp; return; • void addCh (int nu, string na); } • private: Node ptr = head; • Node * head; while (ptr->nptr!=0 && ptr->nptr->chn!=nu) { • }; ptr = ptr->nptr; • } • if (ptr->next==0) return; • Node *tmp = ptr->nptr; ★★★ • ptr->nptr= ptr->nptr->nptr; • delete tmp; • } lst 7 2 14 시네마 TV CJ홈쇼핑 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(32)
Another implementation of channel list • 포인터의활용 • 포인터 클래스 작성: 함수의 구현 void addCh (int nu, string na); • class Node { … } string addCh (int nu, string na) { • class channelList { // NodeList Node *ptr = new Node(nu, na); • public: ptr->nptr = head; • channelList ( ) { head = 0; }; head = ptr; • string chNameOf (int nu); } • void deleteNum (int nu); // string addCh (int nu, string na) { • void addCh (int nu, string na); // head = new Node(nu, na, head); • private: // } • Node * head; • }; lst 7 2 시네마 TV CJ홈쇼핑 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(33)
summaries • 포인터 • 포인터 기초 • 매개변수에 사용되는 포인터 • 동적 메모리 할당 • 포인터 활용 예 1 • 포인터에기반한 채널목록의 또 다른 구현 • 연결 리스트에서 노드 간의 연결에 활용되는 포인터 • 포인터를 자유자재로 쓸 수 있도록 연습합시다. practice makes perfect!!! Dept. of Multimedia Engineering, DongEui Univ.(34)