✨컴공주✨ [1052682] · MS 2021 · 쪽지

2022-06-27 16:45:29
조회수 166

컴공 일기93

게시글 주소: https://orbi.kr/00057343904

오늘 코딩은 요기까지예용!




#include <stdio.h>

#include <stdlib.h>


struct Node

{

    int Data;

    struct Node* NextNode;


    //단방향 연결 리스트

};


//노드 생성

Node* SLL_CreateNode(int NewData)

{

    Node* NewNode = (Node*)malloc(sizeof(Node));

    


    NewNode->Data = NewData;

    NewNode->NextNode = NULL;


    return NewNode;

}


//노드 메모리 해제

void SLL_DestroyNode(Node* Node)

{

    free(Node);

}


//노드 추가

void SLL_AppendNode(Node** Head, Node* NewNode)

{

    if ((*Head) == NULL)

    {

        *Head = NewNode;

    }

    else

    {

        Node* Tail = *Head;

        while (Tail->NextNode != NULL)

        {

            Tail = Tail->NextNode;

        }


        Tail->NextNode = NewNode;

    }

}


//노드 탐색

Node* SLL_GetNodeAt(Node* Head, int Location)

{

    

    Node* Current = Head;


    while (Current != NULL && (--Location) >= 0)

    {

        Current = Current->NextNode;

    }


    return Current;

}


//노드 삭제

void SLL_RemoveNode(Node** Head, Node* Remove)

{

    if (*Head == Remove)

    {

        *Head = Remove->NextNode;

    }


    else {

        Node* Current = *Head;

        while (Current != NULL && Current->NextNode != Remove)

        {

            Current = Current->NextNode;

        }


        if (Current != NULL)

            Current->NextNode = Remove->NextNode;

    }


     

}


//노드 정방향 삽입

void SLL_InsertAfter(Node* Current, Node* NewNode)

{

    NewNode->NextNode = Current->NextNode;

    Current->NextNode = NewNode;

}


//노드 역방향 삽입

void SLL_InsertBefore(Node**Head, Node* Current, Node* NewHead)

{

    Node* Tail = (*Head);

    while (Tail->NextNode != Current)

    {

        Tail = Tail->NextNode;

    }

    Tail->NextNode = NewHead;

    NewHead->NextNode = Current;

}


//헤드 노드 정방향 삽입

void SLL_InsertNewHead(Node** Head, Node* NewHead)

{

    if (*Head == NULL)

    {

        (*Head) = NewHead;

    }


    else

    {

        NewHead->NextNode = (*Head);

        (*Head) = NewHead;

    }

}



//노드 개수 세기

int SLL_GetNodeCount(Node* Head)

{

    int Count = 0;

    Node* Current = Head;


    while (Current != NULL)

    {

        Current = Current->NextNode;

        Count++;

    }


    return Count;

}


//전체 노드 출력

void SLL_PrintAllNodes(Node* List)

{


    Node* Current = List;


    while (Current != NULL)

    {

        printf("%d\n", Current->Data);

        Current = Current->NextNode;

    }

}


int main()

{

    int i = 0;

    int Count = 0;

    Node* List = NULL;

    Node* Current = NULL;

    Node* NewNode = NULL;


    for (i = 0; i < 5; i++)

    {

        NewNode = SLL_CreateNode(i);

        SLL_AppendNode(&List, NewNode);

    }


    NewNode = SLL_CreateNode(-1);

    SLL_InsertNewHead(&List, NewNode);


    NewNode = SLL_CreateNode(-2);

    SLL_InsertNewHead(&List, NewNode);


    Count = SLL_GetNodeCount(List);

    for (i = 0; i < Count; i++)

    {

        Current = SLL_GetNodeAt(List, i);

        printf("List[%d] : %d\n", i, Current->Data);

    }


    printf("\nInserting 3000 After[2].... \n\n");


    Current = SLL_GetNodeAt(List, 2);

    NewNode = SLL_CreateNode(3000);


    SLL_InsertAfter(Current, NewNode);


    printf("\nInserting 2999 Before 3000...\n\n");

    Current = SLL_GetNodeAt(List, 3);

    NewNode = SLL_CreateNode(2999);

    

    SLL_InsertBefore(&List, Current, NewNode);


    Count = SLL_GetNodeCount(List);


    for (i = 0; i < Count; i++)

    {

        Current = SLL_GetNodeAt(List, i);

        printf("List[%d] : %d\n", i, Current->Data);

    }

    

    printf("\n");

    

    printf("Printed by SLL_PrintAllNodes\n");

    SLL_PrintAllNodes(List);


    printf("\nDestroying List.... Thanks.");


    for (i = 0; i < Count; i++)

    {

        Current = SLL_GetNodeAt(List, 0);


        if (Current != NULL)

        {

            SLL_RemoveNode(&List, Current);

            SLL_DestroyNode(Current);

        }


    }

}


실행결과 :


List[0] : -2

List[1] : -1

List[2] : 0

List[3] : 1

List[4] : 2

List[5] : 3

List[6] : 4


Inserting 3000 After[2]....



Inserting 2999 Before 3000...


List[0] : -2

List[1] : -1

List[2] : 0

List[3] : 2999

List[4] : 3000

List[5] : 1

List[6] : 2

List[7] : 3

List[8] : 4


Printed by SLL_PrintAllNodes

-2

-1

0

2999

3000

1

2

3

4



0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.