7.12.2017

자료구조

#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

댓글 없음:

댓글 쓰기