Table of contents
코드
#include <stdio.h>
#include <stdlib.h>
void PrintNode( void ); // 리스트에 있는 Node들을 출력
void InsertNode( char* name, int age ); // 새로운 Node를 추가
void DeleteNode( unsigned int id ); // id 값을 통해 Node 제거
void FreeList( void ); // 리스트의 모든 Node를 제거
typedef struct Node
{
unsigned int id;
char *name;
int age;
struct Node *next;
}NodeStruct;
NodeStruct* g_pHead = NULL; // 리스트의 가장 첫 Node를 가르킴.
NodeStruct* g_pTail = NULL; // 리스트의 가장 마지막 Node를 가르킴.
unsigned int g_nId = 0; // Node 마다 부여 될 고유한 id 값
int main(int argc, char* argv[])
{
printf("Node를 추가합니다.\n");
InsertNode("Name1", 10);
InsertNode("Name2", 12);
InsertNode("Name3", 15);
InsertNode("Name4", 15);
InsertNode("Name5", 15);
InsertNode("Name6", 15);
InsertNode("Name7", 15);
PrintNode();
printf("\n2, 4 Node를 삭제합니다.\n");
DeleteNode(2);
DeleteNode(4);
PrintNode();
printf("\n모든 Node를 삭제합니다.\n");
FreeList();
PrintNode();
system("PAUSE");
return 0;
}
/*
가장 첫 Node부터 시작하여 마지막 Node까지 탐색하며 내용을 출력
*/
void PrintNode( void )
{
NodeStruct* pCurrentNode = g_pHead; // 이동할 포인터 (초기값은 pHead 즉, 첫번째 노드)
int nCount = 0; // 총 Node의 개수
printf("%3s %10s %3s\n", "ID", "Name", "Age");
while ( pCurrentNode != NULL ) // 마지막 Node일 경우 while문 종료
{
printf("%3d %10s %3d\n", pCurrentNode->id, pCurrentNode->name, pCurrentNode->age);
pCurrentNode = pCurrentNode->next; // 다음 Node를 가르키도록 이동
nCount++;
}
printf("총 %d개의 노드가 있습니다.\n", nCount);
}
/*
새로운 Node를 저장할 공간을 만들고 리스트의 마지막에 추가
*/
void InsertNode( char* name, int age )
{
NodeStruct* pNewNode;
g_nId++;
// 새로운 Node를 저장할 공간을 만들어서 pNewNode 포인터가 가르키게 함
pNewNode = (NodeStruct*) malloc(sizeof(NodeStruct));
(*pNewNode).id = g_nId; // pNewNode 포인터가 가르키고 있는 곳의 id를 변경
pNewNode->name = name; // 화살표 연산자를 통해서도 값 변경 가능
pNewNode->age = age;
pNewNode->next = NULL; // pNewNode의 다음 Node는 우선 NULL로 초기화
if ( g_pHead == NULL ) // 리스트가 비어 있을 경우
{
g_pHead = pNewNode; // pHead 포인터가 pNewNode가 가르키고 있는 곳을 가르키게 함
g_pTail = pNewNode; // pTail 포인터가 pNewNode가 가르키고 있는 곳을 가르키게 함
}
else // 리스트가 비어 있지 않을 경우
{
g_pTail->next = pNewNode; // 추가하기 전 마지막 Node의 다음 Node를 새로 만들어진 Node를 가르키게 함
g_pTail = pNewNode; // 새로 추가된 노드를 pTail이 가르키게 함
}
}
/*
가장 첫 Node부터 탐색하여 id 값에 해당하는 Node를 제거
*/
void DeleteNode( unsigned int id )
{
NodeStruct* pPrevNode = g_pHead;
NodeStruct* pCurrentNode = g_pHead;
while ( pCurrentNode != NULL ) // 마지막 Node일 경우 while문 종료
{
if ( pCurrentNode->id == id )
{
pPrevNode->next = pCurrentNode->next; // 이전 Node와 다음 Node 연결
free(pCurrentNode); // Node 삭제
break; // 해당 Node 삭제 후 while문 종료
}
pPrevNode = pCurrentNode; // 현재 Node를 이전 Node로 저장
pCurrentNode = pCurrentNode->next; // 다음 Node를 가르키도록 이동
}
}
/*
가장 첫 Node부터 시작하여 리스트의 Node를 하나씩 제거
*/
void FreeList( void )
{
NodeStruct* pTempNode;
while( g_pHead != NULL )
{
pTempNode = g_pHead;
g_pHead = pTempNode->next;
free(pTempNode);
}
}
'소프트웨어 > C' 카테고리의 다른 글
C언어 문자열 포인터 Swap 예시 (0) | 2022.02.20 |
---|---|
C언어 동적 할당 및 해제 malloc 예시 (0) | 2022.02.20 |
C언어 구조체 배열 선언 및 초기화 (0) | 2022.02.20 |
C언어 구조체 Swap 함수 (0) | 2022.02.20 |
C언어 영타연습기 프로그램 (0) | 2022.02.20 |