#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status DestroyQueue(LinkQueue &Q)//销毁队列
{
while (Q.front) {
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
Status CLearQueue(LinkQueue &Q)//清空队列
{
QueuePtr p, q;
if (!Q.front)
exit(OVERFLOW);
p = Q.front->next;
Q.front->next = NULL;
while (p)
{
q = p;
p = p->next;
free(q);
}
Q.rear = Q.front;
return OK;
}
Status QueueEmpty(LinkQueue Q)
{
if (Q.rear == Q.front)
return TRUE;
else
return FALSE;
}
int QueueLength(LinkQueue Q)
{
QueuePtr p;
int n = 0;
p = Q.front->next;
while (p)
{
n++;
p = p->next;
}
return n;
}
Status GetHead(LinkQueue Q, QElemType &e)
{
QueuePtr p;
if (Q.front == Q.rear)
return ERROR;
p = Q.front->next;
e = p->data;
return OK;
}
Status EnQueue(LinkQueue &Q, QElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!p)
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue &Q, QElemType &e)
{
QueuePtr p;
if (Q.front == Q.rear)
return ERROR;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front;
free(p);
return OK;
}
Status QueueTraverse(LinkQueue &Q)
{
QueuePtr p = Q.front->next;
if (p == NULL)
return ERROR;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
void main()
{
int i, n;
QElemType k, h, a, f;
LinkQueue Q;
printf("创建一个空队列!\n");
InitQueue(Q);
printf("判断队列是否为空!\n");
printf("QueueEmpty(Q)=%d\n", QueueEmpty(Q));
printf("创建队列的元素个数:\n");
cin >> n;
printf("输入%d个插入队列的元素的值:\n", n);
for (i = 0; i < n; i++)
{
cin >> k;
EnQueue(Q, k);
}
printf("输出队列元素的值:\n");
QueueTraverse(Q);
printf("输入插入队列的元素的值:");
cin >> h;
EnQueue(Q, h);
printf("输入插入一个队列元素后队列元素的值:");
QueueTraverse(Q);
DeQueue(Q, a);
printf("输入第1个删除的队头元素的值:%d\n", a);
DeQueue(Q, a);
printf("输入第2个删除的队头元素的值:%d\n", a);
printf("输出两次删除队头元素后队列的元素值:");
QueueTraverse(Q);
if (!GetHead(Q, f))
printf("输出队头元素的值:%d\n", f);
printf("输出队列元素的个数:%d\n", QueueLength(Q));
printf("将Q清为空队列!\n");
CLearQueue(Q);
printf("输出队列元素的个数:%d\n", QueueLength(Q));
printf("判断队列是否为空!\n");
printf("QueueEmpty(Q)=%d\n", QueueEmpty(Q));
system("pause");
}
队列——链式队列的实现
最新推荐文章于 2023-04-18 01:03:18 发布