W 개발 일지

[자료구조] C언어 연결리스트(Linked list) 마지막에서 두번째 데이터 출력 본문

C/자료구조-알고리즘

[자료구조] C언어 연결리스트(Linked list) 마지막에서 두번째 데이터 출력

waVwe 2021. 4. 9. 20:06
반응형

tildacoderecorder.tistory.com/96

 

[자료구조] C언어 연결리스트(Linked list) 생성 / 출력

연결리스트 만들기 "월" "화" "수" "목" "금" 등 요일을 데이터값으로 갖는 연결리스트를 만들어보자. typedef struct node {         char data;         struct node* next;     } ..

tildacoderecorder.tistory.com

저번 글에서 연결리스트의 생성과 출력에 대한 기본적인 것들에 대해 알아봤다.

이번 글에서는 조건이 있는 출력에 대해 알아볼 것이다.

*예제에 쓰인 연결리스트는 전 글의 연결리스트와 동일

 

마지막에서 두 번째 데이터만 출력하기

 

마지막에서 두번째만 출력하기 위해서는 먼저 세 가지 조건을 살펴봐야한다.

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문을 그림으로 보자면 아래와 같다.

 

  1. tmp = head, pre = NULL. head는 node1를 가리키므로 tmp->next는 node1의 next를 가리킨다.
  2. node1의 next인 node2가 NULL이 아니므로 while문을 돌게 된다. pre 변수에 tmp값을  넣어주고 tmp = tmp->next로 tmp가 다음 노드를 가리키게 만든다면 pre는 node1을, tmp는 node2를 가리키게 된다.
  3. 2번째와 같은 과정으로 pre는 node2를, tmp는 node3을 가리키게 된다.
  4. tmp가 node3일 때 tmp->next는 NULL이므로 while문을 돌지 않고 종료하게 된다. pre는 node2를 가리키고 있으므로 pre->data를 출력하면 마지막에서 두번째 노드의 데이터 값을 출력할 수 있다.

 

 

참조 : C로 배우는 쉬운 자료구조 / 이지영 / 한빛아카데미

 

반응형