일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- dbms
- c programming
- css3
- 제이쿼리
- 회원가입
- 프론트엔드
- 웹서비스
- spring
- 프레임워크
- 오라클
- 웹개발
- 풀스택
- 마이바티스
- Binding
- 서블릿
- javascript
- html5
- 웹페이지
- MVC
- 비밀번호찾기
- jsp
- 백엔드
- 로그인
- 네비게이터
- mybatis
- Linked List
- 미로 생성 알고리즘
- 스프링
- jQuery
- Ajax
Archives
- Today
- Total
Programmer's Progress
Linked List Queue 본문

#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