반응형
    
    
    
  [ 구조체(C) 및 클래스(C++) 두가지 방식으로 구현하는 연결 리스트 ]
지금부터 node node1; node node2;
이런 식으로 node를 생성하는 것이 아닌 메모리 할당으로 node를 생성하고 각 node끼리 연결하는법의 코드를 본다.
[ 구조체를 통한 표현 ]
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <stdio.h> #include <malloc.h> typedef struct Node {     int data;     Node *next; }node; int main() {     node *head = NULL; // 이것은 구조체를 만든 것이 아닌 node 구조체를 가리킬 수 있는 포인터를 만든 것이다.     node *tail = NULL; // node node1; 과는 다르다.     node *cur = NULL;     node *newnode = NULL;     int value;     while (1)     {         printf("자연수를 입력해 주세요 : ");         scanf("%d", &value);         if (value < 1) // 예외처리는 모든 코딩에서 아주 중요하다.         {             printf("다시 입력해 주세요.\n");             continue;         }         // 노드의 추가 과정         newnode = (node*)malloc(sizeof(node));         newnode->data = value; // 새로 생긴 node에 data를 넣는다.         newnode->next = NULL; // 새로 생긴 node의 next 포인터는 NULL을 가리키도록 한다.          if (head == NULL)             head = newnode; // 만약 head가 아무것도 가리키지 않고있다면 newnode를 가리키게 한다.         else             tail->next = newnode; // 그렇지 않다면 tail의 next 즉, tail은 node를 가리키니 node의 next가 newnode를 가리키게 한다.         tail = newnode;     }     return 0; } | Crocus | 
[ 클래스를 통한 표현 ]
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <iostream> using namespace std; class node { private:     int data;     node *next; public:     void inputData(int value)     {         data = value;     }     void init()     {         next = NULL;     }     void doNext(node *newnode)     {         next = newnode;     }     void see(node *head)      {         node *pos = head;         int val = pos->data;         while (1)         {             cout << val << " ";             if (pos->next == NULL)             {                 pos = NULL; // 이 과정이 없다면 delete pos시 연결 리스트 마지막 값 메모리가 해제 되어버린다.                 delete pos;                 break;             }             pos = pos->next;             val = pos->data;         }         cout << endl;     } }; int main() {     node *head = NULL; // 이것은 구조체를 만든 것이 아닌 node 구조체를 가리킬 수 있는 포인터를 만든 것이다.     node *tail = NULL; // node node1; 과는 다르다.     node *cur = NULL;     node *newnode = NULL;     int value;     while (1)     {         cout << "자연수를 입력해 주세요 : " ;         cin >> value;         if (value < 1) // 예외처리는 모든 코딩에서 아주 중요하다.         {             cout << "다시 입력해 주세요."<< endl;             head->see(head); // 연결 리스트가 잘 연결되고 있는지 한번 확인해 본다. (이때는 첫부분인 head를 기점으로 본다.)             continue;         }         // 노드의 추가 과정         newnode = new node; // node의 크기만큼 newnode에 공간을 할당해 준다.         newnode->inputData(value);  // 새로 생긴 node에 data를 넣는다.         newnode->init();  // 새로 생긴 node의 next 포인터는 NULL을 가리키도록 한다.          if (head == NULL)             head = newnode; // 만약 head가 아무것도 가리키지 않고있다면 newnode를 가리키게 한다.         else             tail->doNext(newnode); // 그렇지 않다면 tail의 next 즉, tail은 node를 가리키니 node의 next가 newnode를 가리키게 한다.         tail = newnode;     }     return 0; } | Crocus | 
위의 클래스 코드에서 중요한 내용들이 몇가지 있다. 다음 게시물 [ 자료구조 코딩 시 주의사항 ]에서 기술하겠다.
head는 가장 처음을 가리키는 포인터이다.
cur은 순차 접근을 하기위해 head에서 tail까지 순차적 접근을 하는 포인터이다.
tail은 가장 마지막을 가리키는 포인터이다.
| 1 2 3 4 5 |  if(head == NULL)     head = newNode; // 만약 head가 아무것도 가리키지 않고있다면 newNode를 가리키게 한다.  else     tail->next = newNode; // 그렇지 않다면 tail | Crocus | 
이 코드가 없다면?
첫 노드와 두번째 이상의 노드부터의 경계가 모호해지면서
head가 첫 노드를 가리키게 하는것이 힘들어지고 노드를 순차적으로 연결하기 애매해진다.
물론 다른 방법으로도 할 수 있지만, 이 방법을 추천하는 바 이다.
이 코드를 계속 반복한다면 결국 아래와 같은 그림이 된다.
반응형
    
    
    
  'Applied > 자료구조' 카테고리의 다른 글
| 연결 리스트(Linked List) 개념 (4) - 최종 코드 및 과정 수록 (0) | 2016.05.04 | 
|---|---|
| 자료구조 코딩 시 주의사항 (0) | 2016.05.03 | 
| 연결 리스트(Linked List) 개념 (2) (0) | 2016.05.03 | 
| 연결 리스트(Linked List) 개념 (1) (0) | 2016.05.03 | 
| 트리(Tree) 용어 (2) (0) | 2016.05.01 |