Programmer's Progress

Linked List Queue 본문

C Programming/Project

Linked List Queue

Blanc et Noir 2021. 1. 24. 17:45

#include <stdio.h>
#include <malloc.h>

typedef struct node {
	int data;
	struct node *p_next;
}NODE;

void push(NODE **p_head, NODE **p_tail, int data) {
	//**p_head : 노드의 시작 포인터 주소를 받는다.
	//**p_tail : 노드의 끝 포인터 주소를 받는다. push 작업을 할때 반복문을 사용하지 않고
	//바로 추가하기 위해서 필요하다.
	//data : 추가하고자 하는 정보
	//헤드포인터가 널이 아니라면 이는 이미 데이터가 하나 이상은 추가되었다는 의미다.
	if (*p_head != NULL) {
		//맨 마지막 노드의 다음 노드를 위한 공간을 확보한다.
		(*p_tail)->p_next = (NODE*)malloc(sizeof(NODE));
		//맨 마지막 노드의 주소를 다음 노드로 갱신한다.
		*p_tail = (*p_tail)->p_next;
	}
	else {
		//헤드포인터가 널이라면 데이터가 하나도 추가되지 않은 것이므로 공간을 할당한다.
		*p_head = (NODE*)malloc(sizeof(NODE));
		//헤드포인터가 곧 테일 포인터이다.
		*p_tail = *p_head;
	}
	//다음노드가 없음을 명시하는 NULL을 대입한다. 즉 테일 포인터가 가장 마지막 노드이다.
	(*p_tail)->p_next = NULL;
	//테일 포인터의 data변수에 추가할 값을 대입한다. 
	(*p_tail)->data = data;
}
int pop(NODE **p_head, NODE **p_tail) {
	//**p_head : 맨 처음 노드의 주소를 받는 매개변수
	//**p_tail : 맨 마지막 노드의 주소를 받는 매개변수
	//result : 리턴할 값을 가지는 변수
	int result;
	//*p_head가 가진 값은 기억하고 있어야 한다. 메모리 해제시에 필요하기 때문이다.
	NODE *p = *p_head;
	//테일포인터와 헤드포인터가 가진 값이 다르다면 이는 저장된 데이터가 2개 이상이란 뜻이다.
	if (*p_tail != *p_head) {
		//테일포인터가 가진 값을 result 변수에 기록한다.
		result = (*p_tail)->data;
		//포인터 p는 *p_head와 같은 값을 가지고 있는데, 처음 노드부터 탐색하며 만약
		//현재 노드의 다음 노드가 테일포인터라면 반복문을 탈출한다.
		while (p->p_next != *p_tail) {
			p = p->p_next;
		}
		//반복문을 빠져나갔다면 p는 테일포인터 바로 앞의 노드의 주소를 가지고 있는 것이다.
		//테일포인터의 메모리를 해제한다.
		free((*p_tail));
		//테일포인터가 그 이전 노드의 주소를 갖도록 갱신한다.
		(*p_tail) = p;
		//테일포인터 이후의 노드가 없음을 명시하기위헤 NULL을 대입한다.
		(*p_tail)->p_next = NULL;
		//결과를 리턴한다.
		return result;
	}
	//만약 헤드포인터와 테일포인터의 주소가 같다면 이는 저장된 데이터가 하나밖에 없음을 의미한다.
	else if (*p_tail == *p_head&&*p_tail != NULL) {
		//데이터를 result 변수에 대입한다.
		result = (*p_tail)->data;
		//테일포인터를 널로 초기화 한다.
		*p_tail = NULL;
		//헤드포인터의 메모리를 해제한다.
		free(*p_head);
		//헤드포인터 역시 NULL로 초기화 한다.
		*p_head = *p_tail;
		//결과를 리턴한다.
		return result;
	}
	else {
		//더이상 저장된 값이 없는데 pop()을 호출하면 오류 코드를 리턴한다.
		return 0x7FFFFFFF;
	}
}

int main(void) {
	NODE *p_head = NULL;
	NODE *p_tail = NULL;

	push(&p_head, &p_tail, 1);
	push(&p_head, &p_tail, 2);
	push(&p_head, &p_tail, 3);
	push(&p_head, &p_tail, 4);
	push(&p_head, &p_tail, 5);

	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
	printf("%d\n", pop(&p_head, &p_tail));
}

'C Programming > Project' 카테고리의 다른 글

Tokenize( )  (0) 2021.01.24
Linked List Stack  (0) 2021.01.24
Comments