1、采用书上第 61 页定义的队列的链式存储结构,编程实现队列的下列基本操作。
(1)构造空列(2)销毁队列 (3)清空队列 (4)判断队列是否为空 (5)求队列长度 (6)取队头元素 (7)插入队尾元素 (8)删除队头元素 (9)输出队列元素
2、采用书上第 64 页定义的队列的顺序存储结构,编程实现循环队列的下列基本操作。
(1)构列(2)清空队列 (3)判断队列是否为空 (4)求队列长度 (5)取队头元素 (6)插入队尾元素 (7删除队头元素 (8)输出队列元素
例题一:
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode, * QuenePtr;
typedef struct
{
QuenePtr front;
QuenePtr rear;
}LinkQuene;
Status InitQueue(LinkQuene& Q)
{
Q.front = Q.rear = (QuenePtr)malloc(sizeof(QNode));
if (!Q.front)exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status DestoryQuene(LinkQuene& Q)
{
while (Q.front)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
Status ClearQuene(LinkQuene& Q)
{
while (Q.front->next)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
Q.front->next = NULL;
Q.front->data = NULL;
return OK;
}
Status QueneEmpty(LinkQuene Q)
{
if (Q.front==Q.rear)return TRUE;
else return FALSE;
}
int QueneLength(LinkQuene Q)
{
QuenePtr p=Q.front;
int n=0;
while (p != Q.rear) {
n++;
p = p->next;
}
return n;
}
Status GetHead(LinkQuene Q, QElemType& e)
{
QuenePtr p;
if (Q.front == Q.rear)return ERROR;
e = Q.front->next->data;
printf("获取队头元素:%d\n", e);
return OK;
}
Status EnQuene(LinkQuene& Q, QElemType e)
{
QuenePtr p;
p = (QuenePtr)malloc(sizeof(QNode));
if (!p)exit(OVERFLOW);
p->data = e; p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQuene(LinkQuene& Q, QElemType& e)
{
QuenePtr p;
if (Q.front == Q.rear)return ERROR;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)Q.rear = Q.front;
free(p);
return OK;
}
Status QueneTraverse(LinkQuene& Q)
{
QuenePtr p = Q.front->next;
if (p == NULL)return ERROR;
while (p) {
printf("%d->", p->data);
p = p->next;
}
printf("\n");
return OK;
}
int main()
{
int i, n;
QElemType k, h, a, f;
LinkQuene Q;
printf("创建一个空队列!\n");
InitQueue(Q);
printf("判断队列是否为空!\n");
printf("QueneEmpty(Q)=%d\n",QueneEmpty(Q));
printf("创建队列的元素个数\n");
scanf("%d", &n);
printf("输入%d个插入队列的元素的值:\n",n);
for (i = 0; i < n; i++)
{
scanf("%d", &k);
EnQuene(Q, k);
}
printf("输出队列元素的值:\n");
QueneTraverse(Q);
printf("输入插入队列元素的值:");
scanf("%d", &h);
EnQuene(Q, h);
printf("输出插入一个队列元素后队列元素的值:\n");
QueneTraverse(Q);
DeQuene(Q, a);
printf("输出第1个删除的队头元素的值:%d\n",a);
DeQuene(Q, a);
printf("输出第2个删除的队头元素的值:%d\n",a);
printf("输出两次删除队头元素后队列的元素值:\n");
QueneTraverse(Q);
if (GetHead(Q, f))
printf("输出队头元素的值:%d\n",f);
printf("输出队列元素的个数:%d\n",QueneLength(Q));
printf("将Q清为空队列!\n");
ClearQuene(Q);
printf("输出队列元素的个数:%d\n",QueneLength(Q));
printf("判断队列是否为空!\n");
printf("QueneEmpty(Q)=%d\n", QueneEmpty(Q));
}
例题二:
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXQSIZE 100
typedef int Status;
typedef int QElemType;
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQuene;
Status InitQueue(SqQuene& Q)
{
Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));
if (!Q.front)exit(OVERFLOW);
Q.front = Q.rear=0;
return OK;
}
Status ClearQuene(SqQuene& Q)
{
if (!Q.base)exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
Status QueneEmpty(SqQuene Q)
{
if (Q.front == Q.rear)return TRUE;
else return FALSE;
}
int QueneLength(SqQuene& Q)
{
return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
Status GetHead(SqQuene& Q,QElemType &e)
{
if (Q.front == Q.rear)return ERROR;
e = Q.base[Q.front];
printf("获取头元素:%d\n", e);
return OK;
}
Status EnQuene(SqQuene& Q,QElemType e)
{
if ((Q.rear + 1) % MAXQSIZE == Q.front)
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXQSIZE;
return OK;
}
Status DeQuene(SqQuene& Q,QElemType &e)
{
if (Q.front == Q.rear)
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;
printf("删除的队头元素:%d\n", e);
return OK;
}
Status QueneTraverse(SqQuene &Q)
{
if (Q.front == Q.rear)return ERROR;
int p = Q.front;
while (p != Q.rear)
{
printf("%d->", Q.base[p]);
p = (p + 1) % MAXQSIZE;
}
printf("\n");
return OK;
}
int main()
{
int i, n;
QElemType k, h, a, f;
SqQuene Q;
printf("创建一个空队列!\n");
InitQueue(Q);
printf("判断队列是否为空!\n");
printf("QueneEmpty(Q)=%d\n", QueneEmpty(Q));
printf("创建队列的元素个数\n");
scanf("%d", &n);
printf("输入%d个插入队列的元素的值:\n", n);
for (i = 0; i < n; i++)
{
scanf("%d", &k);
EnQuene(Q, k);
}
printf("输出队列元素的值:\n");
QueneTraverse(Q);
printf("输入插入队列元素的值:");
scanf("%d", &h);
EnQuene(Q, h);
printf("输出插入一个队列元素后队列元素的值:\n");
QueneTraverse(Q);
DeQuene(Q, a);
printf("输出第1个删除的队头元素的值:%d\n", a);
DeQuene(Q, a);
printf("输出第2个删除的队头元素的值:%d\n", a);
printf("输出两次删除队头元素后队列的元素值:\n");
QueneTraverse(Q);
if (GetHead(Q, f))
printf("输出队头元素的值:%d\n", f);
printf("输出队列元素的个数:%d\n", QueneLength(Q));
printf("将Q清为空队列!\n");
ClearQuene(Q);
printf("输出队列元素的个数:%d\n", QueneLength(Q));
printf("判断队列是否为空!\n");
printf("QueneEmpty(Q)=%d\n", QueneEmpty(Q));
}