// {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** Head, Node* 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* Current, Node* NewNode) {
NewNode->next = Current->next;
Current->next = NewNode;
}
void InsertNewHead(Node** Head, Node* NewHead) {
if ((*Head) == NULL) {
*Head = NewHead;
}
else {
NewHead->next = *Head;
*Head= NewHead;
}
}
void RemoveNode(Node** Head, Node* 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(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;
}
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);
}
}
}
댓글 없음:
댓글 쓰기