#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
typedef int element;
typedef struct DlistNode {
element data;
struct DlistNode *llink;
struct DlistNode *rlink;
} DlistNode;
typedef struct DequeType {
DlistNode *head;
DlistNode *tail;
} DequeType;
//오류처리
void error(char *message)
{
fprintf(stderr, "%s\n", message);
exit(1);
}
//초기화
void init(DequeType *dq)
{
dq->head = dq->tail = NULL;
}
//생성
DlistNode *cnode(DlistNode *llink, element item, DlistNode *rlink)
{
DlistNode *node = (DlistNode *)malloc(sizeof(DlistNode));
if(node == NULL) error("메모리 할당 오류");
node->llink = llink;
node->data = item;
node->rlink = rlink;
return node;
}
//공백검출
int is_empty(DequeType *dq)
{
if(dq->head == NULL) return TRUE;
else return FALSE;
}
//삽입
void add_rear(DequeType *dq, element item) //전단 삽입
{
DlistNode *new_node = cnode(dq->tail, item, NULL);
if(is_empty(dq)) dq->head = new_node;
else
dq->tail->rlink = new_node;
dq->tail = new_node;
}
void add_front(DequeType *dq, element item) //후단 삽입
{
DlistNode *new_node = cnode(NULL, item, dq->head);
if(is_empty(dq)) dq->tail = new_node;
else
dq->head->llink = new_node;
dq->head = new_node;
}
//삭제
element del_front(DequeType *dq) //전단 삭제
{
element item;
DlistNode *removed_node;
if(is_empty(dq)) error("공백 덱에서 삭제");
else {
removed_node = dq->head;
item = removed_node->data;
dq->head = dq->head->rlink;
free(removed_node);
if(dq->head == NULL) dq->tail = NULL;
else dq->head->llink = NULL;
}
return item;
}
element del_rear(DequeType *dq) //후단 삭제
{
element item;
DlistNode *removed_node;
if(is_empty(dq)) error("공백 덱에서 삭제");
else {
removed_node = dq->tail;
item = removed_node->data;
dq->tail = dq->tail->llink;
free(removed_node);
if(dq->tail == NULL) dq->head = NULL;
else dq->tail->rlink = NULL;
}
return item;
}
//출력
void display(DequeType *dq)
{
DlistNode *p;
printf("(");
for(p=dq->head; p!=NULL; p=p->rlink) {
printf(" %d ", p->data);
}
printf(")\n");
}
//메인
void main()
{
DequeType deque;
init(&deque);
add_front(&deque, 10); //전위 삽입
add_front(&deque, 20); //전위 삽입
add_rear(&deque, 30); //후위 삽입
display(&deque);
del_front(&deque); //전위 삭제
del_rear(&deque); //후위 삭제
display(&deque);
}