profile image

L o a d i n g . . .

사용자로부터 정수 값을 입력받아 이중연결 리스트로 생성한다.
리스트 노드는 입력받은 순서대로 연결한다.
이중연결 리스트 삽입 함수/삭제 함수를 사용한다.(교재 참고)
(1) 입력받은 후 display() 함수에 의해 각 노드의 내용을 출력한다. (display() 교재 참고)
(2) 마지막 데이터를 삭제 후 (삭제 함수 이용), 다시 display() 함수로 각 노드 내용을 출력한다.
- 입력을 끝내기 위해 마지막에 -1을 입력한다.
- DlistNode 타입을 정의하여 사용한다.
- 동적 메모리 할당을 사용한다.

<입출력 예1>
15 25 70 5 10 -1
15 25 70 5 10
15 25 70 5 

<입출력 예2>
7 20 12 -1
7 20 12
7 20 
#include <stdio.h>
#include <stdlib.h>

typedef struct DlistNode {
    int data;
    struct DlistNode *llink;
    struct DlistNode *rlink;
} DlistNode;

void display(DlistNode *head)
{
    DlistNode   *p;
    for (p = head->rlink; p != head; p = p->rlink){
        printf("%d ", p->data);
    }
    printf("\n");
}

void dinsert_node(DlistNode *before, DlistNode *new_node)
{
    new_node->llink = before;
    new_node->rlink = before->rlink;
    before->rlink->llink = new_node;
    before->rlink = new_node;
}

void dremove_node(DlistNode *head, DlistNode *removed)
{
    if ( removed == head ) return;
    removed->llink->rlink = removed->rlink;
    removed->rlink->llink = removed->llink;
    free(removed);
}

int main()
{
    DlistNode    header;
    DlistNode    *before, *new_node;
    int          data;

    // header node 구성 
    header.llink = &header;
    header.rlink = &header;

    before = &header;
    // 사용자 입력, 노드 생성, 리스트 삽입
    do {
        scanf("%d", &data);
        if (data == -1) break;
        // 노드를 위한 동적 메모리 할당
        new_node = (DlistNode *) malloc(sizeof(DlistNode));
        // 노드에 데이터 저장
        new_node->data = data;
        // 노드를 리스트에 삽입
        dinsert_node(before, new_node);
        before = new_node;

    } while (1);

    // 출력 : display(리스트시작주소)
    display(&header);
    // 마지막 노드 삭제: dremove_node()
    dremove_node(&header, header.llink /*befor*/ /*new_node*/);
    // 출력 : display(리스트 시작주소)
    display(&header);
 
}

'Language > C' 카테고리의 다른 글

[C / C++] 단일 Linked List 예제 1  (0) 2021.10.07
[C] Linked List - 삽입, 삭제, 순회  (0) 2021.10.04
[C] 구조체, 포인터  (0) 2021.09.20
복사했습니다!