1 / 34

D ata s tructures

D ata s tructures. 01.3: C++ p ointers. 동의대학교 멀티미디어공학과 이광의교수. T oday’s t opic. 자료구조의 정의 정의 1: 자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다 . 정의 2: 자료구조는 추상자료형이다 . 정의 3: 자료구조는 잘 알려지고 유용한 추상자료형이다 . C++ 클래스 : 추상자료형의 구현 클래스 기초 클래스 구현 예 1: 채널목록 추상자료형의 ( 정렬되지 않은 목록 ) 구현

indiya
Download Presentation

D ata s tructures

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Data structures 01.3: C++ pointers 동의대학교 멀티미디어공학과 이광의교수

  2. Today’s topic • 자료구조의정의 • 정의1: 자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다. • 정의2: 자료구조는 추상자료형이다. • 정의3: 자료구조는 잘 알려지고 유용한 추상자료형이다. • C++클래스: 추상자료형의 구현 • 클래스 기초 • 클래스 구현 예 1: 채널목록 추상자료형의(정렬되지 않은 목록) 구현 • 클래스 구현 예 2: 채널목록 추상자료형의(채널이름 순으로 정렬된 목록) 구현 • 포인터 • 포인터 기초 • 포인터 활용 예 1 Dept. of Multimedia Engineering, DongEui Univ.(2)

  3. Fundamentals of pointers • 포인터(포인터변수)란무엇인가? • 메모리 번지를 저장할 수 있는 변수 • 다른 변수의 위치를 저장할 수 있는 변수 • 또 다른 정의 • 포인터는 왜 사용하는가? • 메모리를 동적으로 할당 받을 때 • 매개변수가 변경되어 돌려지기를 원할 때 • 이름 없는 변수의 사용 • 또 다른 이유 Dept. of Multimedia Engineering, DongEui Univ.(3)

  4. 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)

  5. 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)

  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; • } a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(6)

  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; • } x 3 4 y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(7)

  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; • } tmp 3 x 3 >> 4 4 >> 3 y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(8)

  9. 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)

  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; • } • // 출력은 4 3 a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(10)

  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; • } x y a 3 4 b Dept. of Multimedia Engineering, DongEui Univ.(11)

  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; • } tmp 3 x y a 3 >> 4 4 >> 3 b Dept. of Multimedia Engineering, DongEui Univ.(12)

  13. 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)

  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).chn ptr1 14 동의TV (*ptr1).name 0 (*ptr1).nptr Dept. of Multimedia Engineering, DongEui Univ.(14)

  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 동의TV CJ홈쇼핑 0 0 Dept. of Multimedia Engineering, DongEui Univ.(15)

  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 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(16)

  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 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(17)

  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.(18)

  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->next = 0; ptr1=0; • }; … ptr1 ptr2 14 2 7 동의TV CJ홈쇼핑 시네마TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(19)

  20. 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)

  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 0 lst.head Dept. of Multimedia Engineering, DongEui Univ.(21)

  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 시네마TV 0 Dept. of Multimedia Engineering, DongEui Univ.(22)

  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.(23)

  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 시네마 TV CJ홈쇼핑 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(24)

  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.(25)

  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.(26)

  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.(27)

  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.(28)

  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 2 14 시네마 TV CJ홈쇼핑 동의TV 0 node3 Dept. of Multimedia Engineering, DongEui Univ.(29)

  30. 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)

  31. 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)

  32. 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)

  33. 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)

  34. summaries • 포인터 • 포인터 기초 • 매개변수에 사용되는 포인터 • 동적 메모리 할당 • 포인터 활용 예 1 • 포인터에기반한 채널목록의 또 다른 구현 • 연결 리스트에서 노드 간의 연결에 활용되는 포인터 • 포인터를 자유자재로 쓸 수 있도록 연습합시다. practice makes perfect!!! Dept. of Multimedia Engineering, DongEui Univ.(34)

More Related