I/T/C2010. 5. 7. 18:25
포인터에 대해 알고 있다고 생각하였지만.. 자바를 하다보면 금새 까먹는 것 같습니다....^^;
그래서 다시 한번 리스트를 통해 연습 해보았습니다.

가장 심플하게 만든다고 만들어 보았습니다.
삭제나 검색도 차후에 추가 시켜야죠.
하지만 그 전에 필요하신 분들은 PrintNode와 FreeList 함수를 참고하신다면 작성하실 수 있을거라 생각됩니다.

※2010.06.01
id 값을 추가하여 id를 통해 삭제하는 함수를 작성해 보았습니다.
하지만 검색의 경우.. 굳이 할 필요가 없다고 생각되어 그냥 생략..^^;

실행화면

#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);
 	}
}


Posted by 황타