728x90
반응형
tildacoderecorder.tistory.com/96
저번 글에서 연결리스트의 생성과 출력에 대한 기본적인 것들에 대해 알아봤다.
이번 글에서는 조건이 있는 출력에 대해 알아볼 것이다.
*예제에 쓰인 연결리스트는 전 글의 연결리스트와 동일
마지막에서 두 번째 데이터만 출력하기
마지막에서 두번째만 출력하기 위해서는 먼저 세 가지 조건을 살펴봐야한다.
1. 연결리스트에 다른 노드 없이 head만 있을 경우
2. head와 노드 하나, 딱 두 가지만 있을 경우
3. 노드가 여러개인 연결 리스트일 경우
head에는 데이터 값이 담겨있지 않기 때문에 1번과 2번의 경우 마지막에서 두번째 노드의 값을 출력할 수 없다.
typedef struct node {
char data;
struct node* next;
} Node;
Node* head;
void Print_Second_Last() {
Node* tmp = head, * pre = NULL;
if (head == NULL) {
printf("ERROR!!");
return;
}
if (head->next == NULL) {
printf("ERROR!!");
return;
}
while (tmp->next != NULL) {
pre = tmp;
tmp = tmp->next;
}
printf("%s", pre->data);
}
|
cs |
마지막에서 두번째 노드를 찾으려면 마지막 노드를 찾을 변수와 그 변수의 뒷 노드를 가리킬 변수, 총 두가지가 필요하다.
구조체 포인터 변수 tmp와 pre를 선언하고 tmp에 head 값을 담는다.
if문을 활용하여 위에서 언급한 조건 중 첫번째와 두번째에 해당될 때 ERROR 메세지를 출력하고 리턴시킨다.
tmp->next가 NULL이 아닐 때, pre는 tmp의 값을 담게 되고 tmp는 다음 노드로 넘어가게 된다.
while문을 그림으로 보자면 아래와 같다.
- tmp = head, pre = NULL. head는 node1를 가리키므로 tmp->next는 node1의 next를 가리킨다.
- node1의 next인 node2가 NULL이 아니므로 while문을 돌게 된다. pre 변수에 tmp값을 넣어주고 tmp = tmp->next로 tmp가 다음 노드를 가리키게 만든다면 pre는 node1을, tmp는 node2를 가리키게 된다.
- 2번째와 같은 과정으로 pre는 node2를, tmp는 node3을 가리키게 된다.
- tmp가 node3일 때 tmp->next는 NULL이므로 while문을 돌지 않고 종료하게 된다. pre는 node2를 가리키고 있으므로 pre->data를 출력하면 마지막에서 두번째 노드의 데이터 값을 출력할 수 있다.
참조 : C로 배우는 쉬운 자료구조 / 이지영 / 한빛아카데미
728x90
반응형
'C' 카테고리의 다른 글
연결리스트(Linked list) 노드 삭제 - C 언어 (0) | 2021.04.09 |
---|---|
연결리스트(Linked list) 노드 삽입 - C 언어 (0) | 2021.04.09 |
연결리스트(Linked list) 생성 / 출력 - C 언어 (0) | 2021.04.09 |
포인터를 이용한 swap 함수 만들기 - C 언어 (0) | 2021.03.03 |
C - While문 이용하여 *별로 삼각형 만들기 3 (0) | 2020.10.08 |