** 자료 구조 공부법 : 그림을 그리며 이해하고 설명하자 ! ***
배열 (자료 구조 ) 의 특징
장점 : 순차 접근이 가능하다.
단점 : 메모리의 특성이 정적이다. / 길이 변경이 불가하다. !
그래서 연결리스트는 ? " 연결하며 확장한다. "
LinkedRead.c
연결리스트 분석 연습 하기
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 | #include <stdio.h> #include <stdlib.h> typedef struct _node { int data; struct _node * next; } Node; int main(void) { Node * head = NULL; // NULL 포인터 초기화 Node * tail = NULL; Node * cur = NULL; Node * newNode = NULL; int readData; /**** 데이터를 입력 받는 과정 ****/ while(1) { printf("자연수 입력: "); scanf("%d", &readData); if(readData < 1) break; /*** 노드의 추가과정 ***/ newNode = (Node*)malloc(sizeof(Node)); newNode->data = readData; newNode->next = NULL; if(head == NULL) head = newNode; else tail->next = newNode; tail = newNode; } printf("\n"); /**** 입력 받은 데이터의 출력과정 ****/ printf("입력 받은 데이터의 전체출력! \n"); if(head == NULL) { printf("저장된 자연수가 존재하지 않습니다. \n"); } else { cur = head; printf("%d ", cur->data); // 첫 번째 데이터 출력 while(cur->next != NULL) // 두 번째 이후의 데이터 출력 { cur = cur->next; printf("%d ", cur->data); } } printf("\n\n"); /**** 메모리의 해제과정 ****/ if(head == NULL) { return 0; // 해제할 노드가 존재하지 않는다. } else { Node * delNode = head; Node * delNextNode = head->next; printf("%d을(를) 삭제합니다. \n", head->data); free(delNode); // 첫 번째 노드의 삭제 while(delNextNode != NULL) // 두 번째 이후의 노드 삭제 위한 반복문 { delNode = delNextNode; delNextNode = delNextNode->next; printf("%d을(를) 삭제합니다. \n", delNode->data); free(delNode); // 두 번째 이후의 노드 삭제 } } return 0; } | cs |
분석
head 가 NULL 일 때와 아닐 때로 나뉜다.
어떤 것도 추가 되지 않았다면 당연히 head == newNode; 가 되는 것이고
만약 헤드가 이미 있다면
tail-> next = newNode; 이다.
cur = head; // cur이 리스트의 첫번째 노드를 가리킨다.
cur = cur -> next; // cur이 다음 노드를 가리키게 한다. 위 반복문의 핵심이다.
Node * delNode = head;
Node * delNextNode = head -> next;
포인터 변수를 추가로 선언한 사실에 주목하자
"head가 가리키는 노드를 그냥 삭제해 버리면 , 그 다음 노드에 접근이 불가합니다. "
4가 저장된 노드의 주소 값을 아는 것은 2가 저장된 노드가 유일한데, 이 노드를
그냥 소멸시킨 결과로 4가 저장된 노드의 주소 값은 어디에도 존재하지 않게 된다.
그래서 위 2번째 그림처럼 삭제될 노드가 가리키는 다음 노드의 주소 값을 별도로 저장하는 것이다.