Stack/Data struct

C Linked List(연결리스트 구현)

Seo_re: 2021. 9. 5. 17:27
반응형

연결리스트

- 추상적 자료형인 리스트를 구현한 자료구조로 노드(데이터 덩어리)를 저장할 때 다음 순서의 자료가 있는 위치를 데이터에 포함시키는 자료구조이다.

  ※ 그렇기때문에 구조체 멤머변수 중 자신과 동일한 구조체의 주소를 저장할 수 있는 변수를 만들어 참조해야한다. (이 때, 주소를 저장하는 멤버 변수를 자기참조 구조체라고 함.)

- 장점 : 배열과 다르게 데이터를 동적으로 추가, 삭제가 가능하다.

- 단점 : 배열처럼 정렬되어있지 않고, 흩어져있기 때문에 배열의 인덱스로 접근하는것 처럼 특정 노드에 빠른 접근은 불가능하다.

  ※ 일일이 탐색하는 과정을 거쳐서 데이터를 찾아야 한다.

 

Linked List를 위한 구조체

typedef struct Node
{
    int data
    struct Node* Next;
}Node;

 

위의 구조체를 바탕으로 우리가 구현할 연결리스트의 그림을 그려보자면 다음과 같이 표현할 수 있다.

추가

- 가장 마지막 노드를 찾아 그 뒤에 데이터를 추가한다.

1. 재귀함수를 통해 마지막 노드까지 찾아간다.

2. 새로운 데이터를 동적할당을 한 뒤, 마지막 노드에 연결해준다.

Node* AddData(Node* node, int data)
{
    if (node == NULL)
    {
    	Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = data;
        newNode->NEXT = NULL;

        return newNode;
    }

    node->NEXT = AddData(node->NEXT, data);
    return node;
}

 

 

탐색

- 이부분 역시 재귀함수로 데이터를 비교해서 같은 노드를 반환하면 된다.

Node* Search(Node* node, int data)
{
    if (node == NULL)
        return NULL;
	
    if (node->data == data)
        return node;

    return Search(node->NEXT, data);
}

 

 

삭제

1. 재귀함수로 데이터가 같은 노드를 찾는다.

2. 같은 노드를 찾으면 찾은 노드에 연결된 리스트를 임시 변수에 저장해둔다.

3. 찾은 노드의 동적할당을 해제한다.

4. 2번에 저장해둔 다음 리스트를 반환한다.

Node* Delete(Node* node, int data)
{
    if (node == NULL) return NULL;
	
    if (node->data == data)
    {
        Node* nextNode = node->NEXT;
        free(node);
		
        return nextNode;
    }
	
    node->NEXT = Delete(node->NEXT, data);
    return node;
}

 

 

여기까지만 구현해 두면, 어느 특정 위치에 데이터를 끼워넣든 삭제하든 나머지는 응용하기 나름이다.

마지막으로 풀 소스 코드를 올려본다.

#include <stdio.h>
#define MAX 10

typedef struct Node
{
    int data;
    struct Node* NEXT;
}Node;

Node* AddData(Node* node, int data)
{
    if (node == NULL)
    {
    	Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = data;
        newNode->NEXT = NULL;

        return newNode;
    }

    node->NEXT = AddData(node->NEXT, data);
    return node;
}

void ShowAllData(Node* node)
{
    if (node == NULL) return;

    printf("%d ", node->data);
    ShowAllData(node->NEXT);
}

Node* Search(Node* node, int data)
{
    if (node == NULL)
        return NULL;
	
    if (node->data == data)
        return node;

    return Search(node->NEXT, data);
}

Node* Delete(Node* node, int data)
{
    if (node == NULL) return NULL;
	
    if (node->data == data)
    {
        Node* nextNode = node->NEXT;
        free(node);
		
        return nextNode;
    }
	
    node->NEXT = Delete(node->NEXT, data);
    return node;
}

void main()
{
    Node* head = NULL;
    //데이터 추가
    for(int i = 0; i < MAX; i++)
        head = AddData(head, i);
    ShowAllData(head);
    
    //결과 : 0 1 2 3 4 5 6 7 8 9
    
    //탐샋
    Node* someNode = Search(head, 5);
    if(someNode != NULL)
        printf("%d\n", someNode->data);
        
    //결과 : 5
    
    //삭제
    head = Delete(head, 8);
    ShowAllData(head);
    //결과 : 0 1 2 3 4 5 6 7 9
}
반응형