덱 deque

C/C자료구조 : 2007. 11. 9. 09:54
#include <stdio.h>
#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);
}

Posted by 청웨일