queue的使用

//////////queue.h/////////
#ifndef Queue_H
#define Queue_H

typedef unsigned char Item;

typedef struct node * PNode;
typedef struct node
{
 Item data;
 PNode next;
}Node;

typedef struct
{
 PNode front;//前一個元素
 PNode rear;//後一個元素
 int size;
}Queue;

/*構造一個空隊列*/
Queue *InitQueue();

/*銷燬一個隊列*/
void DestroyQueue(Queue *pqueue);

/*清空一個隊列*/
void ClearQueue(Queue *pqueue);

/*判斷隊列是否爲空*/
int IsEmpty(Queue *pqueue);

/*返回隊列大小*/
int GetSize(Queue *pqueue);

/*返回隊頭元素*/
PNode GetFront(Queue *pqueue,Item *pitem);

/*返回隊尾元素*/
PNode GetRear(Queue *pqueue,Item *pitem);

/*將新元素入隊*/
PNode EnQueue(Queue *pqueue,Item item);

/*隊頭元素出隊*/
PNode DeQueue(Queue *pqueue,Item *pitem);

/*遍歷隊列並對各數據項調用visit函數*/
void QueueTraverse(Queue *pqueue);

#endif



///////////////queue.cpp////////////////////////////
#include "stdafx.h"
#include"queue.h"
#include<malloc.h>
#include<stdio.h>

/*構造一個空隊列*/
Queue *InitQueue()
{
 Queue *pqueue = (Queue *)malloc(sizeof(Queue));
 if(pqueue!=NULL)
 {
  pqueue->front = NULL;
  pqueue->rear = NULL;
  pqueue->size = 0;
 }
 return pqueue;
}

/*銷燬一個隊列*/
void DestroyQueue(Queue *pqueue)
{
 if(IsEmpty(pqueue)!=1)
  ClearQueue(pqueue);
 free(pqueue);
}

/*清空一個隊列*/
void ClearQueue(Queue *pqueue)
{
 while(IsEmpty(pqueue)!=1)
 {
  DeQueue(pqueue,NULL);
 }

}

/*判斷隊列是否爲空*/
int IsEmpty(Queue *pqueue)
{
 if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)
  return 1;
 else
  return 0;
}

/*返回隊列大小*/
int GetSize(Queue *pqueue)
{
 return pqueue->size;
}

/*返回隊頭元素*/
PNode GetFront(Queue *pqueue,Item *pitem)
{
 if(IsEmpty(pqueue)!=1&&pitem!=NULL)
 {
  *pitem = pqueue->front->data;
 }
 return pqueue->front;
}

/*返回隊尾元素*/

PNode GetRear(Queue *pqueue,Item *pitem)
{
 if(IsEmpty(pqueue)!=1&&pitem!=NULL)
 {
  *pitem = pqueue->rear->data;
 }
 return pqueue->rear;
}

/*將新元素入隊*/
PNode EnQueue(Queue *pqueue,Item item)
{
 PNode pnode = (PNode)malloc(sizeof(Node));
 if(pnode != NULL)
 {
  pnode->data = item;
  pnode->next = NULL;

  if(IsEmpty(pqueue))
  {
   pqueue->front = pnode;
  }
  else
  {
   pqueue->rear->next = pnode;
  }
  pqueue->rear = pnode;
  pqueue->size++;
 }
 return pnode;
}

/*隊頭元素出隊*/
PNode DeQueue(Queue *pqueue,Item *pitem)
{
 PNode pnode = pqueue->front;
 if(IsEmpty(pqueue)!=1&&pnode!=NULL)
 {
  if(pitem!=NULL)
   *pitem = pnode->data;
  pqueue->size--;
  pqueue->front = pnode->next;
  free(pnode);
  if(pqueue->size==0)
   pqueue->rear = NULL;
 }
 return pqueue->front;
}

/*遍歷隊列並對各數據項調用visit函數*/
void QueueTraverse(Queue *pqueue)
{
 PNode pnode = pqueue->front;
 int i = pqueue->size;
 while(i--)
 {
  printf("%02x ",pnode->data);
  pnode = pnode->next;
 }

}
///////////////////test.cpp/////////////////////
#include "stdafx.h"  
#include <stdio.h>  
#include <winsock2.h>  
 


#include"queue.h"
#include <conio.h>
#include<stdio.h>
void print(Item i)
{
 printf("該節點元素爲%d\n",i);
}
void main(void)
{
 Queue *pq = InitQueue();
 unsigned char i;
 unsigned char item;
 unsigned char ch;
 printf("0-9 input:\n");

 for(i=0;i<10;i++)
 {
  EnQueue(pq,(unsigned char)i);
  GetRear(pq,&item);//Rear 後部
  printf("%02x \n",item);
 }
 while(1)
 {
  ch = getchar();
  DeQueue(pq,&item);
  printf("\n出去:%02x \n",item);
  EnQueue(pq,ch);
  printf("\n進來:%02x \n",ch);
 
  printf("\nqueue display:\n");
  PNode pnode = pq->front;
  printf("second:%02x",pnode->next->data);
  //QueueTraverse(pq);
 }
 
 ClearQueue(pq);
 if(IsEmpty(pq))
  printf("\n queue is null\n");
 DestroyQueue(pq);
 printf("queue is destroy\n");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章