#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 *NewNode = NULL;
Node *Current = NULL;
int Count = 0;
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);
//0번째의 노드, 1번째의 노드, 2번째의 노드... 가져옴
printf("List[%d] : %d\n", i, Current->data);
}
Current = GetNodeAt(List, 2);
printf("List[2] : %d\n", Current->data);
printf("List[2]->prev->data : %d\n", Current->prev->data);
printf("List[2]->next->data : %d\n", Current->next->data);
RemoveNode(&List, Current);
DestroyNode(Current);
Current = GetNodeAt(List, 2);
printf("List[2] : %d\n", Current->data);
printf("List[2]->prev->data : %d\n", Current->prev->data);
printf("List[2]->next->data : %d\n", Current->next->data);
}
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* Temp = Remove;
if (Remove->prev != NULL) {
Remove->prev->next = Temp->next;
}
if (Remove->next != NULL) {
Remove->next->prev = Temp->prev;
}
}
}
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;
}
========================================
//main함수 수정
void main() {
Node *List = NULL;
Node *NewNode = NULL;
int Count = 0;
for (int i = 0; i < 5; i++) {
NewNode = CreateNode(i);
AppendNode(&List, NewNode);
}
//리스트의 세 번째 칸 뒤에 노드 삽입
printf("\nInserting 3000 After [2]...\n\n");
Current = GetNodeAt(List, 2);
NewNode = CreateNode(3000);
InsertAfter(Current, NewNode);
Count = GetNodeCount(List);
for (int i = 0; i < Count*2; i++) {
if (i == 0) {
Current = List;
}
else {
Current = Current->next;
} printf("List[%d] : %d\n", i, Current->data);
/*Current = GetNodeAt(List, i);
printf("List[%d] : %d\n", i, Current->data);*/
}
Current = GetNodeAt(List, 3);
RemoveNode(&List, Current);
DestroyNode(Current);
}
// 46900, 32000
댓글 없음:
댓글 쓰기