Data Structure 3

684 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
684
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Data Structure 3

  1. 1. 자료구조 세미나 포인터
  2. 2. 포인터는 추상적이다 ? <ul><li>포인터는 추상적으로 가질 수 없는 개념이다. </li></ul><ul><li>포인터에 대한 개념을 추상적으로 가질 경우 포인터를 100% 활용할 수 없다. </li></ul><ul><li>그렇다면 포인터를 어떻게 바라봐야 할까 </li></ul>
  3. 3. 포인터의 정체 <ul><li>포인터는 int 변수 </li></ul><ul><li>int 변수가 하드웨어 및 운영체제에 따라 그 크기가 달라지는 것처럼 포인터 변수의 크기도 같이 달라짐 </li></ul><ul><li>sizeof( 포인터 변수 ) == sizeof( int ) </li></ul><ul><li>sizeof( char * ) > sizeof( char ) </li></ul><ul><li>그렇다면 왜 따로 포인터 변수라는 것을 사용하는가 ? </li></ul>
  4. 4. 어셈블러에서 포인터 <ul><li>어셈블러에서 OFFSET 이나 ADDR 의 값을 저장할 때 모드에 따라 DWORD 나 WORD 를 사용했다 . </li></ul><ul><ul><li>즉 , 어셈블러에서도 포인터 변수는 int 였다 . </li></ul></ul><ul><ul><li>하지만 어셈블러에서는 포인터 변수가 따로 없어서 주소에 있는 값을 참조할 때 여러 가지 처리를 해줘야 했다 . 크기를 모르기 때문에 PTR 을 사용해야 했고 크기에 따라 다르게 주소 값을 증가시켰다 . </li></ul></ul>
  5. 5. 어셈블러에서 포인터 <ul><li>어셈블러에서 포인터 사용 </li></ul><ul><ul><li>mov esi, myaddress </li></ul></ul><ul><ul><li>mov ax, WORD PTR [esi] </li></ul></ul><ul><ul><li>add esi, TYPE myaddress </li></ul></ul><ul><ul><li>mov ax, WORD PTR [esi] </li></ul></ul>
  6. 6. C 언어에서 포인터 <ul><li>포인터는 가리키는 메모리가 어떤 메모리인지 알 수 있게 한다. </li></ul><ul><li>char * 형의 포인터 변수는 1바이트 변수를 가리키고 있다. </li></ul><ul><li>FILE * 형의 포인터 변수는 FILE 구조체를 가리키고 있으며 FILE 구조체의 멤버변수에 접근할 수 있게 한다. </li></ul>
  7. 7. C 언어에서 포인터 <ul><li>C 언어에서 포인터 사용 </li></ul><ul><ul><li>int a, b, c, k[10], *addr; </li></ul></ul><ul><ul><li>addr = &k[0]; // &k[0] == k </li></ul></ul><ul><ul><li>a = *addr; </li></ul></ul><ul><ul><li>addr++; </li></ul></ul><ul><ul><li>b = *addr; </li></ul></ul><ul><ul><li>c = *(addr + 4) </li></ul></ul>
  8. 8. 자료구조 세미나 링크드 리스트
  9. 9. 정의 <ul><li>메모리상에서 인접하지 않은 데이터들을 인접한 것처럼 포인터로 연결한 자료구조 </li></ul><ul><li>동적으로 생성되는 메모리에 기반 </li></ul><ul><li>삽입 삭제가 빠르고 메모리의 낭비가 적음 </li></ul>
  10. 10. 개념도 head tail 데이터 데이터 데이터 데이터
  11. 11. 구조체 <ul><li>구조체의 정의 </li></ul><ul><ul><li>typedef struct _link </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>  int data; </li></ul></ul><ul><ul><li>  _link *prev; </li></ul></ul><ul><ul><li>  _link *next; </li></ul></ul><ul><ul><li>} LINK; </li></ul></ul>
  12. 12. 초기화 <ul><li>초기화 코드 </li></ul><ul><ul><li>LINK *head, *tail; </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>void init() </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>  head = new LINK; </li></ul></ul><ul><ul><li>  tail = new LINK; </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>  head->next = tail; </li></ul></ul><ul><ul><li>  head->prev = head; </li></ul></ul><ul><ul><li>  tail->next = tail; </li></ul></ul><ul><ul><li>  tail->prev = head; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  13. 13. 초기화 <ul><li>구조 </li></ul><ul><ul><li>[ data ][ prev ][ next ] </li></ul></ul><ul><ul><li>앞에서부터 data, previous, next </li></ul></ul><ul><li>진행과정 </li></ul><ul><ul><li>head [        ][        ][        ] </li></ul></ul><ul><ul><li>tail [        ][        ][        ] </li></ul></ul><ul><ul><li>초기화 후 </li></ul></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul>
  14. 14. 삽입 <ul><li>삽입 코드 </li></ul><ul><ul><li>void put( int a ) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>  LINK *t; </li></ul></ul><ul><ul><li>  t = new LINK; </li></ul></ul><ul><ul><li>  t->data = a; </li></ul></ul><ul><ul><li>  t->next = head->next; </li></ul></ul><ul><ul><li>  t->prev = head; </li></ul></ul><ul><ul><li>  head->next->prev = t; </li></ul></ul><ul><ul><li>  head->next = t; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  15. 15. 삽입 <ul><li>진행과정 </li></ul><ul><ul><li>put( 5 ) 를 실행 </li></ul></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>t(10704 번지 ) [        ][        ][        ] </li></ul></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>t(10704 번지 ) [ 5  ][        ][        ] </li></ul></ul>
  16. 16. 삽입 <ul><li>진행과정 </li></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>t(10704 번지 ) [ 5 ][  10680 ][  10692 ] </li></ul></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][  10704 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][  10704 ][ 10692 ] </li></ul></ul><ul><ul><li>t(10704 번지 ) [ 5 ][ 10680 ][ 10692 ] </li></ul></ul>
  17. 17. 삭제 <ul><li>삭제 코드 </li></ul><ul><ul><li>void pop(LINK *k) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>  k->next->prev = k->prev; </li></ul></ul><ul><ul><li>  k->prev->next = k->next; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  18. 18. 삭제 <ul><li>진행과정 </li></ul><ul><ul><li>pop( head->next ) 을 실행 </li></ul></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][ 10704 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][  10680 ][ 10692 ] </li></ul></ul><ul><ul><li>k(10704 번지 ) [ 5 ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>head(10680 번지 ) [        ][ 10680 ][  10692 ] </li></ul></ul><ul><ul><li>tail(10692 번지 ) [        ][ 10680 ][ 10692 ] </li></ul></ul><ul><ul><li>k(10704 번지 ) [ 5 ][ 10680 ][ 10692 ] </li></ul></ul>
  19. 19. 탐색 <ul><li>탐색 코드 </li></ul><ul><ul><li>LINK *t; </li></ul></ul><ul><ul><li>for( t=head->next ; t!=tail ; t=t->next ) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>  .. 처리 .. </li></ul></ul><ul><ul><li>} </li></ul></ul>
  20. 20. 트리 구현 <ul><li>트리 또한 링크드 리스트로 구현이 가능 </li></ul><ul><li>구조체 </li></ul><ul><ul><li>typedef struct _node </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>int data; </li></ul></ul><ul><ul><li>_node *child[ MAX ], *parent; </li></ul></ul><ul><ul><li>} NODE; </li></ul></ul><ul><li>자식노드 또한 링크드 리스트로 만들 수 있다 . </li></ul>

×