/////
Search
📝

4월16일(월)

1. 소스코드

#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; }
C
복사

2. 실행 결과

3. 고찰

포인터로 작업을 미리 해놔서 헤드노드가 0이 출력이 되는데, 고치기에 너무 많은 길을 가버린 거 같아서 우선 제출하게 되었습니다. 그래도 집에서 혼자 추가적으로 공부를 더 하고 나니까 요새는 포인터에 대해서 감이 슬슬 오는 것 같아 좋은 것 같습니다.