
typedef int ElemType
struct Node
{
ElemType data;
struct Node * pNext;
};
struct LinkQueue
{
struct Node * front;
struct Node * rear;
};
//链队列的基本操作(9个)
//1构造一个空队列
void init_queueLink(struct LinkQueue * pLQ)
{
pLQ->front = pLQ->rear = (struct Node *) malloc(sizeof (struct Node));
if (!pLQ->front)
exit(-1);
pLQ->front->pNext = NULL;
}
//2销毁队列
void destroy_queueLink(struct LinkQueue * pLQ)
{
while (pLQ->front)
{
pLQ->rear = pLQ->front->pNext;
free(pLQ->front);
pLQ->front = pLQ->rear;
}
}
//3清空队列
void clear_queueLink(struct LinkQueue * pLQ)
{
destroy_queueLink(pLQ);
init_queueLink(pLQ);
}
//4判断队列是否为空
bool is_emptyLink(struct LinkQueue * pLQ)
{
if (pLQ->front->pNext == NULL)
return true;
else
return false;
}
//5求队列长度
int queue_lengthLink(struct LinkQueue * pLQ)
{
int i = 0;
struct Node * p = pLQ->front;
while (pLQ->rear != p)
{
i++;
p = p->pNext;
}
return i;
}
//6求队列的头元素
bool get_headLink(struct LinkQueue * pLQ, ElemType * val)
{
struct Node * p;
if(is_emptyLink(pLQ))
return false;
p = pLQ->front->pNext;
*val = p->data;
return true;
}
//7入队
void en_queueLink(struct LinkQueue * pLQ, ElemType val)
{
struct Node * p;
p = (struct Node *) malloc(sizeof (struct Node));
if (!p)
exit(-1);
p->data = val;
p->pNext = NULL;
pLQ->rear->pNext = p;
pLQ->rear = p;
}
//8出队
bool out_queueLink(struct LinkQueue * pLQ, ElemType * val)
{
if (is_emptyLink(pLQ))
return false;
struct Node * p = pLQ->front->pNext;
struct Node * q = p->pNext;
*val = p->data;
pLQ->front->pNext = q;
if (pLQ->rear == p)
pLQ->rear = pLQ->front;
free(p);
return true;
}
//9遍历队列
void traverse_queueLink(struct LinkQueue * pLQ)
{
struct Node * p = pLQ->front->pNext;
while (p)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("n");
}
(2)静态队列(循环队列)
typedef int ElemType;
struct Queue
{
ElemType * pBase;
ElemType front;
ElemType rear;
};
//循环队列的基本操作(9个)
//1构造一个空队列
void init_queue(struct Queue * pQ)
{
pQ->pBase = (ElemType *) malloc(MAX_SIZE * sizeof (ElemType));
if (!pQ->pBase)
exit(-1);
pQ->front = pQ->rear = 0;
}
//2销毁队列
void destroy_queue(struct Queue * pQ)
{
if (pQ->pBase)
free(pQ->pBase);
pQ->pBase = NULL;
pQ->front = pQ->rear = 0;
}
//3清空队列
void clear_queue(struct Queue * pQ)
{
pQ->front = pQ->rear = 0;
}
//4判断是否为空
bool is_empty(struct Queue * pQ)
{
if (pQ->front == pQ->rear)
return true;
else
return false;
}
//5如果队列不为空,用val返回队头元素
bool get_head(struct Queue * pQ, ElemType * val)
{
if (is_empty(pQ))
return false;
*val = pQ->pBase[pQ->front];
return true;
}
//6入队
bool en_queue(struct Queue * pQ, ElemType val)
{
if ((pQ->rear + 1) % MAX_SIZE == pQ->front)
return false;
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear + 1) % MAX_SIZE;
return true;
}
//7出队
bool out_queue(struct Queue * pQ, ElemType * val)
{
if (is_empty(pQ))
return false;
*val = pQ->pBase[pQ->front];
pQ->front = (pQ->front + 1) % MAX_SIZE;
return true;
}
//8返回队列长度
int queue_length(struct Queue * pQ)
{
int len;
len = (pQ->rear - pQ->front + MAX_SIZE) % MAX_SIZE;
return len;
}
//9遍历队列
void traverse_queue(struct Queue * pQ)
{
ElemType i;
i = pQ->front;
while (i != pQ->rear)
{
printf("%d ", pQ->pBase[i]);
i = (i + 1) % MAX_SIZE;
}
printf("n");
}
测试
#include#include #include #define MAX_SIZE 6 int main() { struct Queue Q; init_queue(&Q); en_queue(&Q, 3); en_queue(&Q, 6); en_queue(&Q, 7); en_queue(&Q, 20); en_queue(&Q, 32); en_queue(&Q, 8); traverse_queue(&Q); ElemType val; out_queue(&Q, &val); printf("val = %dn",val); traverse_queue(&Q); int len; len = queue_length(&Q); printf("len = %dn", len); ElemType val_head; get_head(&Q, &val_head); printf("val_head = %dn", val_head); printf("----------------------------n"); struct LinkQueue LQ; init_queueLink(&LQ); en_queueLink(&LQ, 3); en_queueLink(&LQ, 6); en_queueLink(&LQ, 7); en_queueLink(&LQ, 20); en_queueLink(&LQ, 32); en_queueLink(&LQ, 8); traverse_queueLink(&LQ); ElemType valLink; out_queueLink(&LQ, &valLink); printf("val = %dn",val); traverse_queueLink(&LQ); int len_L; len_L = queue_lengthLink(&LQ); printf("len_L = %dn", len_L); ElemType val_head_L; get_headLink(&LQ, &val_head_L); printf("val_head_L = %dn", val_head_L); return 0; }