双端队列链式实现完整代码

看看思想,,,代码都是调试通过的。

#ifndef  _TWO_QUEUE_H_
#define  _TWO_QUEUE_H_

typedef int ElemType;

typedef  struct _two_queue
{
 ElemType a;
 struct _two_queue *prev;
 struct _two_queue *next;
}tq;


typedef  struct _node
{
 tq *first_head;
 tq *first_tail;
 tq *last_head;
 tq *last_tail;
}pnode;

typedef  enum _status
{
 first,last
}status;

//初始化空队列:
void init_queue(pnode *p);

//销毁队列:
void destroy_queue(pnode *p);

//判断是否为空队列:
bool is_empty(pnode *p);

//获得队头元素:
void get_head(pnode *p,ElemType *e,status sign);

//入队:
void push_queue(pnode *p,ElemType e,status sign);

//出队:
void pop_queue(pnode *p,ElemType *e,status sign);
#endif


/*双端队列函数基本操作实现如下*/

#include"two_queue.h"
#include
#include

//初始化空队列:
void init_queue(pnode *p)
{
 if(p == NULL)
 {
  printf("error\n");
  exit(1);
 }
 else
 {
  p->first_head = NULL;
  p->first_tail = NULL;
  p->last_head = NULL;
  p->last_tail = NULL;
 }
}

//判断是否为空队列:
bool is_empty(pnode *p)
{
 return p->first_head == NULL;
}

//入队:
void push_queue(pnode *p,ElemType e,status sign)
{
 tq *tmp = (tq *)malloc(sizeof(tq)*1);
 tmp->a  = e;
 tmp->next = NULL;
 if(is_empty(p))
 {
  p->first_head = tmp;
  p->first_tail = tmp;
  p->last_head = tmp;
  p->last_tail = tmp;
 }
 else
 {
  if(sign == first)
  {
    tmp->next = p->first_head;
     p->first_head ->prev = tmp;
        p->first_tail = tmp;
     p->first_head = tmp;
  }
  else
  {
     tmp->prev = p->last_head;
     p->last_head->next = tmp;
        p->last_tail = tmp;
     p->last_head = tmp;
  }
 }

}

//出队:
void pop_queue(pnode *p,ElemType *e,status sign)
{
 if(is_empty(p))
 {
  printf("error\n");
  exit(1);
 }
 else
 {
  if(sign == first)
  {
     *e = p->first_head->a;
        p->first_head = p->first_head->next;
  }
  else
  {
     *e = p->last_head ->a;
        p->last_head = p->last_head->prev;
  }
 }
}

//销毁队列:
void destroy_queue(pnode *p)
{
 tq *s = p->first_head;
 if(is_empty(p))
 {
  printf("error\n");
  exit(1);
 }
 else
 {
  while(s)
  {
   p->first_head = p->first_head->next;
   free(s);
   s = p->first_head;
  }
  p->first_head = NULL;
  p->first_tail = NULL;
  p->last_head  = NULL;
  p->last_tail = NULL;
  printf("the queue is destroyed successfully\n ");
 }
}

//获得队头元素:
void get_head(pnode *p,ElemType *e,status sign)
{
 if(is_empty(p))
 {
  printf("the queue is NULL,no top number\n");
  exit(1);
 }
 else
 {
  if(sign == first)
  {
    *e = p->first_head->a;
  }
  else
  {
   *e = p->last_head->a;
  }
 }
}



//主函数

#include
#include"two_queue.h"

int main()
{
 int n = 10;
 int x = -99;
 int k = 100;
 int y;
 int t;
 pnode m;
 init_queue(&m);
 push_queue(&m,n,first);
 push_queue(&m,k,last);
 push_queue(&m,x,first);
 //get_head(&m,&t,first);
 //printf("%d\n",t);
 //get_head(&m,&y,last);
 //printf("%d\n",y);
 pop_queue(&m,&y,first);
 //pop_queue(&m,&t,first);
 printf("%d\n",y);
 //printf("%d\n",t);
 destroy_queue(&m);
 get_head(&m,&t,first);
 printf("%d\n",t);
 return 0;
}







你可能感兴趣的:(数据结构)