#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 구조체 선언
typedef int elementType;
typedef struct Node {
elementType data;
struct Node* prevNode;
struct Node* nextNode;
} Node;
// 노드 생성
Node* CreateNode(elementType newData) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = newData;
newNode->prevNode = NULL;
newNode->nextNode = NULL;
return newNode;
}
// 노드 소멸
void DestroyNode(Node* node) {
free(node);
}
// 노드 삽입 : 뒤에
void InsertAfter(Node* current, Node* newNode) {
// 새로 삽입할 노드의 앞뒤 링크를, 현재노드를 이용해서 연결
newNode->nextNode = current->nextNode;
newNode->prevNode = current;
// 현재노드의 다음노드가 있는 경우에는
if(current->nextNode != NULL) {
current->nextNode->prevNode = newNode;
current->nextNode = newNode;
}
}
// 노드 삽입 : 앞에
void InsertPrev(Node* current, Node* newNode) {
// 새로 삽입할 노드의 앞뒤 링크를, 현재노드를 이용해서 연결
newNode->prevNode = current->prevNode;
newNode->nextNode = current;
// 현재노드의 이전노드가 있는 경우에는
if(current->prevNode != NULL) {
current->prevNode->nextNode = newNode;
current->prevNode = newNode;
}
}
// 노드 추가
void AppendNode(Node** head, Node* newNode) {
if( (*head)==NULL ) {
*head = newNode;
} else {
Node* tail = (*head);
// 헤드에서 시작해서 꼬리노드 찾기
while(tail->nextNode != NULL) {
tail = tail->nextNode;
}
// 찾았으면 새로운 노드를 연결
tail->nextNode = newNode;
// 새로운 노드를 삽입하기 이전의 꼬리노드를 새로운 노드와 이어줍니다
newNode->prevNode = tail;
}
}
void PrintNode(Node* headNode) {
if(headNode == NULL) {
printf("아직 노드가 존재하지 않습니다");
}
for(Node* p=headNode; p!=NULL; p=p->nextNode) {
printf("%d -> ", p->data);
}
printf("NULL \\n");
}
Node* GetNode(Node* head, int location) {
Node* current = head;
while(current!=NULL && (--location)>=0) {
current = current->nextNode;
}
return current;
}
int GetNodeCount(Node* head) {
unsigned int count= 0;
Node* current = head;
while(current != NULL) {
current = current->nextNode;
count++;
}
return count;
}
int main(void) {
Node* list = NULL;
Node* current = NULL;
srand((unsigned int)time(NULL));
int ListSize = (rand() % 10) + 1; // 1-10
list = (Node*)malloc(sizeof(Node)*ListSize); // 랜덤한 리스트 사이즈만큼 메모리 동적할당
for(int i=0; i<4; i++) {
int randomValue = (rand() % 100) + 1; // 1-100
Node* newNode = CreateNode(randomValue);
AppendNode(&list, newNode);
}
current = GetNode(list, 0);
printf("노드 생성(초기화) 후 : ");
PrintNode(current);
// 2번째 노드 위치 찾기
current = GetNode(list, 2);
// 노드 삽입
Node* newNode = CreateNode(599);
InsertAfter(current, newNode);
current = GetNode(list, 0);
printf("노드 삽입 후 : ");
PrintNode(current);
return 0;
}
포인터로 작업을 미리 해놔서 헤드노드가 0이 출력이 되는데, 고치기에 너무 많은 길을 가버린 거 같아서 우선 제출하게 되었습니다. 그래도 집에서 혼자 추가적으로 공부를 더 하고 나니까 요새는 포인터에 대해서 감이 슬슬 오는 것 같아 좋은 것 같습니다.