7.11.2017

// {1,2,3,4,5,6,7,8,9}
// {1,2,3,?,5,6,7,8,9}
// 노드 : 값, 다음 노드의 주소
// {1,2,3,5,6,7,8,9}
// 4. 메모리 해제

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct Node {
        int data;
        struct Node * prev;
        struct Node * next;

}Node;
//노드의 생성/소멸

Node * CreateNode(int NewData);
void DestroyNode(Node* Node);
void AppendNode(Node** HeadNode* NewNode);
void InsertAfter(Node* CurrentNodeNewNode);
void RemoveNode(Node** HeadNode* Remove);
Node* GetNodeAt(NodeHeadint Location);
int GetNodeCount(NodeHead);

void main() {
        Node *List = NULL;
        Node *Current = NULL;
        Node *NewNode = NULL;
        int Count;
        /*노드 5개 삽입*/
        for (int i = 0; i < 5; i++) {
                NewNode = CreateNode(i);
                AppendNode(&List, NewNode);
       }

        /*리스트 출력*/
        Count = GetNodeCount(List);

        for (int i = 0; i < Count; i++) {
                Current = GetNodeAt(List, i);
                printf("List[%d] : %d\n", i, Current->data);
        }
        /*printf("\nInserting 3000 After [2]...\n\n");

        Current = GetNodeAt(List, 2);
        NewNode = CreateNode(3000);

        InsertAfter(Current, NewNode);*/

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

        for (int i = 0; i < Count; i++) {
                Current = GetNodeAt(List, 0);
                if (Current != NULL) {
                        RemoveNode(&List, Current);
                        DestroyNode(Current);
                }
        }
}

Node * CreateNode(int NewData) {
        Node *NewNode = (Node *)malloc(sizeof(Node)); //현재 생성한 노드 메모리 할당
        NewNode->data = NewData; //현재 생성한 노드에 data 대입
        NewNode->next = NULL;  //현재 생성한 노드의 next가 NULL을 참조
        NewNode->prev = NULL;
        return NewNode; //현재 생성한 노드의 주소값 반환
}

void DestroyNode(Node* Node) {
        free(Node);
}
void AppendNode(Node** Head, Node* NewNode) {
        if ((*Head) == NULL) {
                *Head = NewNode;
        }
}
void InsertAfter(Node* Current, Node* NewNode) {
        NewNode->next = Current->next;
        Current->next = NewNode;
        if (Current->next != NULL) {
                Current->next->prev = NewNode;
        }
        Current->next = NewNode;
}

void RemoveNode(Node** Head, Node* Remove) {
        if (*Head == Remove) {
                *Head = Remove->next;
                if ((*Head) != NULL) {
                        (*Head)->prev = NULL;
                }
                Remove->prev = NULL;
                Remove->next = NULL;
        }
        else {
                Node* Current = *Head;
                while (Current != NULL && Current->next != Remove) {
                        Current = Current->next;
                }
                if (Current != NULL) {
                        Current->next = Remove->next;
                }
        }
}

Node* GetNodeAt(Node* Head, int Location) {
        Node *Current = Head;
        while (Current != NULL && (--Location) >= 0) {
                Current = Current->next;
        }
        return Current;
}

int GetNodeCount(Node* Head) {
        int count = 0;
        Node *Current = Head;
        while (Current->next != NULL) {
                Current = Current->next;
                count++;
        }
        return count;
}

댓글 없음:

댓글 쓰기