// {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** Head, Node* NewNode);
void InsertAfter(Node* Current, Node* NewNode);
void RemoveNode(Node** Head, Node* Remove);
Node* GetNodeAt(Node* Head, int Location);
int GetNodeCount(Node* Head);
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;
}
댓글 없음:
댓글 쓰기