연결리스트를 구현해보자
연결리스트를 그림으로 그리면 다음과 같다.
이런 느낌인데 실제 코드를 구현하기 위해 다음과 같이 보충 후 코딩하였다.
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 |