7.11.2017

자료구조 list 및 노드

// {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 * next;

}Node ;
//노드의 생성/소멸
//노드 추가
//노드 탐색
//노드 삽입

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

void DestroyNode(Node* Node) {
        free(Node);
}

void AppendNode(Node** HeadNode* NewNode) {
       //헤드노드가 NULL이라면 새로운 노드가 Head
        if ((*Head) == NULL) {
                *Head NewNode;
        }
        else {
                //tail을 찾아 NewNode를 연결함.
                Node*tail = (*Head);
                while (tail->next != NULL) {
                        tail = tail->next;
                }tail->next = NewNode;
        }
}

void InsertAfter(Node* CurrentNodeNewNode) {
        NewNode->next = Current->next;
        Current->next = NewNode;
}

void InsertNewHead(Node** HeadNode* NewHead) {
        if ((*Head) == NULL) {
                *Head NewHead;
        }
        else {
                NewHead->next = *Head;
                *HeadNewHead;
        }
}

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

Node* GetNodeAt(NodeHead, 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;
}

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);
        }

        NewNode = CreateNode(-1);
        InsertNewHead(&List, NewNode);

        NewNode = CreateNode(-2);
        InsertNewHead(&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);
                }
        }
}

댓글 없음:

댓글 쓰기