본문 바로가기
DataStructure

단일 연결 리스트 -Linked List(2) (노드탐색, 삭제, 삽입) - C 언어

by neohtux 2019. 4. 10.
728x90

단일 연결 리스트의 노드 탐색은 한계점이 많다.

탐색 방향이 일편적이고, 순차적으로 노드의 수를 세어나가서

원하는 요소에 접근해야 한다는 점이 있다.

1. 노드 탐색

1
2
3
4
5
6
7
8
9
10
11
12
Node* search_Node(Node* Head, unsigned short SearchValue, unsigned short *search_count)
{
    Node* Current = Head;
    
    while (Current->Data != SearchValue)
    {
        Current = Current->Next;
        
        (*search_count)++;
    }
    return Current;
}
 

2. 노드 탐색 실행 결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main(void)
{
    Node* List = NULL;
    Node* NewNode = NULL;
    unsigned short search_count = 1;
    NewNode = Create_Node(100);
    AddNode(&List, NewNode);
 
    NewNode = Create_Node(200);
    AddNode(&List, NewNode);
 
    NewNode = Create_Node(300);
    AddNode(&List, NewNode);
 
 
    NewNode = search_Node(List, 300&search_count);
    printf("search value = %d\nserch_count = %d\n", NewNode->Data, search_count);
 
    search_count = 0;
    
}
 

 

 

3. 노드 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Node* delete_Node(Node** Head, Node* RemoveItem)
{
    if (*Head == RemoveItem) 
    {
        *Head = RemoveItem->Next; //이전 노드가 삭제한 노드가 가리킨 다음 노드를 가리키게함.
    }
    else
    {
        Node* Current = *Head;
 
        //삭제할 노드를 찾을때까지 순차적으로 다음노드를 탐색한다.
        while (Current != NULL && Current->Next != RemoveItem)
        {
            Current = Current->Next;
        }
 
        if (Current != NULL//이전 노드가 삭제한 노드가 가리킨 다음 노드를 가리키게함.
        {
            Current->Next = RemoveItem->Next;
        }
 
    }
}
 

삭제시킬 노드를 반환해서 free를 통해 할단된 노드의 메모리를 해제 시켜주는것이 바람직하다.

 

 

4. 노드 삽입

1
2
3
4
5
void InsertNode(Node* head, Node* NewItem)
{
    head->Next = NewItem; //기존 노드의 링크에 새 노드를 가리키게 하고,
    NewItem->Next = head->Next; // 새로운 노드의 링크에 기존 노드가 가리킨 링크를 걸자
}
 
 

300x250

댓글