队列编程

720阅读 0评论2013-03-14 cainiao413
分类:LINUX

队列

typedef
struct QNode
{
  QElemType data;
  struct QNode *next;
}*QueuePtr;

typedef struct Queue
{
  QueuePtr front,rear; //对头队尾指针

}LinkQueue;



点击(此处)折叠或打开

  1. Status InitQueue(LinkQueue **Q)
  2. {//构造一个空队列

  3.   if(!((*Q)->front = (*Q)->rear =(struct QNode *)malloc(sizeof(struct QNode))))
  4.   exit(OVERFLOW);
  5.   (*Q)->front->next = NULL;
  6.   return OK;
  7. }

  8. Status DestroyQueue(LinkQueue *Q)
  9. {//销毁队列Q

  10.   while(Q->front)
  11.   {
  12.     Q->rear = Q->front->next;
  13.     free(Q->front);
  14.     Q->front = Q->rear;
  15.   }
  16.   return OK;
  17. }

  18. Status ClearQueue(LinkQueue *Q)
  19. {//将Q清为空

  20.   QueuePtr p,q;
  21.   Q->rear = Q->front;
  22.   p = Q->front->next;
  23.   Q->front->next = NULL;
  24.     while(p)
  25.     {
  26.       q = p;
  27.       p=p->next;
  28.       free(q);
  29.     }
  30.   return OK;
  31. }

  32. Status QueueEmpty(LinkQueue *Q)
  33. {//若Q为空队列,则返回TRUE,否则返回FALSE

  34.   if(Q->front == Q->rear)
  35.   {
  36.     return TRUE;
  37.   }
  38.   else
  39.   {
  40.     return FALSE;
  41.   }
  42. }

  43. int QueueLength(LinkQueue *Q)
  44. {//求队列的长度

  45.   int i=0;
  46.   QueuePtr p;
  47.   p = Q->front;
  48.   while(Q->rear !=p)
  49.   {
  50.     i++;
  51.     p=p->next;
  52.   }
  53.   return i;
  54. }

  55. Status GetHead(LinkQueue *Q,QElemType *e)
  56. {//若队列不空,用e返回Q的队头元素,并返回OK ,否则返回ERROR;

  57.   QueuePtr p;
  58.   if(Q->front == Q->rear)
  59.     return ERROR;
  60.   p=Q->front->next;
  61.   *e = p->data;
  62.   return OK;
  63. }

  64. Status EnQueue(LinkQueue *Q,QElemType e)
  65. {//插入元素e为Q的新的队尾元素

  66.   QueuePtr p;
  67.   if(!(p = (QueuePtr)malloc(sizeof(struct QNode))))
  68.     exit(OVERFLOW);
  69.   p->data = e;
  70.   p->next = NULL;
  71.   Q->rear->next = p;
  72.   Q->rear = p;
  73.   return OK;
  74. }

  75. Status DeQueue(LinkQueue *Q,QElemType *e)
  76. {//若队列不空,删除Q的对头元素,用e返回其值,并返回OK,否则返回ERROR

  77.   QueuePtr p;
  78.   if(Q->front == Q->rear)
  79.     return ERROR;
  80.   p = Q->front->next;
  81.   *e = p->data;
  82.   Q->front->next = p->next;
  83.   if(Q->rear == p)
  84.     Q->rear = Q->front;
  85.   free(p);
  86.   return OK;
  87. }

  88. Status QueueTraverse(LinkQueue *Q,void(*vi)(QElemType))
  89. {// 从队头到队尾依次对队列Q中每个元素调用函数vi().

  90.   QueuePtr p;
  91.   p = Q->front->next;
  92.   while(p)
  93.   {
  94.     vi(p->data);
  95.     p=p->next;
  96.   }
  97.   printf("\n");
  98.   return OK;
  99. }


上一篇:链表
下一篇:typeof在linux中妙用