본문 바로가기

자료구조

연결 리스트 #1 구현

연결리스트를 구현해보자

 

연결리스트를 그림으로 그리면 다음과 같다.

 

 

이런 느낌인데 실제 코드를 구현하기 위해 다음과 같이 보충 후 코딩하였다.

 

 

TAIL에 들어가는 조건은 String으로 입력이 Finish로 들어왔을 시 TAIL에 저장이 되고 HEAD는 첫 데이터 입력시에만

저장된다.

 

LinkedList의 구조체는 다음과 같다.

typedef struct __LinkedList
{
	char data[50];
	struct __LinkedList *next;

}LinkedList;

 

data버퍼는 String 값을 저장하고 Next는 다음 LinkedList의 구조체를 나타낸다.

 

LinkedList를 만들기 위해 HEAD, BODY, TAIL이 필요하고 각각 HEAD, BODY, TAIL을 연결해주기 위한 

 

LinkedList의 현재 나타내고 있는 구조체가 필요하다.

 

ex) 첫 진입시 

 

두번째 진입시

세번째 진입시

 

 

이런식으로 CurPoint가 마지막 할당된 구조체를 나타내고 있어야 계속 연결을 할 수 있다.

 

Malloc을 호출 했으면 해제를 해야한다.

 

메모리를 해제할 경우 포인트는 두개가 필요하다. 왜냐하면 CurPoint 하나만 썼을 시 Curpoint를 해제 후 다음 구조체를

나타낼 수 없어 문제가 발생한다

 

ex)

 

main.c

int main(void)
{
	char RecvData[50];

	LinkedList *HEAD = NULL;
	LinkedList *BODY = NULL;
	LinkedList *TAIL = NULL;

	LinkedList *CurPoint = NULL;
	LinkedList *NextPoint = (LinkedList*) malloc(sizeof(LinkedList));

	printf("hello world \r\n");
	setvbuf(stdout, NULL, _IONBF, 0);


	while (1)
	{
		printf("please Enter String: ");
		setvbuf(stdout, NULL, _IONBF, 0);

		gets(RecvData);
		setvbuf(stdout, NULL, _IONBF, 0);

		printf("Recv String: %s \r\n", RecvData);
		setvbuf(stdout, NULL, _IONBF, 0);

		if (HEAD == NULL)  
		{
       		/* 처음 데이터 저장 시 Head 저장 */
			HEAD = (LinkedList*) malloc(sizeof(LinkedList));
			strcpy(HEAD->data, RecvData);
			CurPoint = HEAD;
		}
		else if (strncmp((char*) RecvData, "finish", 6) == 0)
		{
        /* 입력을 Finish로 할 경우 TAIL에 저장 */
			printf("Program Finished \r\n");

			TAIL = (LinkedList*) malloc(sizeof(LinkedList));
			strcpy(TAIL->data, RecvData);
			CurPoint->next = TAIL; //CurPoint 화살표에 TAIL을 저장한다.
			TAIL->next = NULL; //마지막이므로 다음 화살표는 NULL로 저장한다.
			break;
		}
		else
		{
        	/* HEAD와 TAIL이 아닌 경우 BODY에 저장 */
			BODY = (LinkedList*) malloc(sizeof(LinkedList));
			strcpy(BODY->data, RecvData);
			CurPoint->next = BODY;  // CurPoint 화살표에 방금 만든 BODY를 저장한다.
			CurPoint = BODY; //CurPoint를 방금만든 Body로 저장한다.
		}

	}

	/* 저장되어있던 데이터를 출력후 메모리를 해체한다. */
	for (CurPoint = HEAD; CurPoint != NULL; CurPoint = NextPoint->next)
	{
		printf("Struct Data String: %s \n", CurPoint->data);
		NextPoint->next = CurPoint->next;
		free(CurPoint);
		printf("Memory Free\n");

	}

	/* 처음 만들었던 NextPoint를 해제한다. */
	free(NextPoint);
	printf("program exit \n");
	return 0;

}

 

실행 결과

 

 

'자료구조' 카테고리의 다른 글

STACK 구현  (0) 2020.10.22
연결리스트 #2 리스트 추가기능  (0) 2020.10.16
배열 리스트  (0) 2020.10.10
재귀알고리즘(하노이타워)  (0) 2020.10.03
이진 탐색 알고리즘  (0) 2020.10.01