目录
包含头结点的实现:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define OK 1
#define ERROR -1
#define INIT_SIZE 100
typedef int Status;
typedef int QElemType;
typedef struct qnode {
QElemType data;
struct qnode* next;
}QNode;
typedef struct queue {
QNode* head;
QNode* end;
int length;
}Queue;
Status InitQueue(Queue& Q);
Status CreateQueue(Queue& Q);
Status DestroyQueue(Queue& Q);
Status ClearQueue(Queue& Q);
Status QueueEmpty(Queue& Q);
long long QueueLength(Queue& Q);
QElemType GetHead(Queue& Q);
Status EnQueue(Queue& Q, QElemType e);
Status DeQueue(Queue& Q, QElemType& e);
Status QueueTraverse(Queue& Q);
int main() {
Queue Q;
QElemType e = 0, i = 0;
int k = 0;
do {
std::cout << "\n=========队列的操作===========";
std::cout << "\n 1.初始化队列";
std::cout << "\n 2.创建队列";
std::cout << "\n 3.将一个数x插到队尾";
std::cout << "\n 4.删除队头元素";
std::cout << "\n 5.判定队列是否为空,若不空输出队头元素";
std::cout << "\n 6.队列的长度";
std::cout << "\n 7.输出队列中所有元素";
std::cout << "\n 0.结束程序运行";
std::cout << "\n================================";
std::cout << "\n 请输入您的选择(1,2,3,4,5,6,7,0)";
std::cin >> k;
switch (k)
{
case 1:
if (InitQueue(Q) == OK)
std::cout << "初始化成功!";
else
std::cout << "初始化失败!";
break;
case 2:
if (CreateQueue(Q) == OK)
std::cout << "创建成功!";
else
std::cout << "创建失败!";
break;
case 3:
std::cout << "请输入插入元素的值x:";
std::cin >> e;
if (EnQueue(Q, e) == OK)
std::cout << "插入成功!";
else
std::cout << "插入失败!";
QueueTraverse(Q);
break;
case 4:
DeQueue(Q, i);
std::cout << "删除的队头元素为:" << i << std::endl;
QueueTraverse(Q);
break;
case 5:
if (QueueEmpty(Q) == false) {
std::cout << "队头元素为:" << GetHead(Q) << std::endl;
}
else {
std::cout << "队列为空或者队列不存在" << std::endl;
}
break;
case 6:
std::cout << "队列的长度为:" << QueueLength(Q) << std::endl;
break;
case 7:
QueueTraverse(Q);
break;
case 0:
break;
default:
std::cout << "无效选项,请重新输入!" << std::endl;
}
} while (k != 0);
system("pause");
return 0;
return 0;
}
Status InitQueue(Queue& Q) {
if (Q.length >= 0 && Q.head != 0) {
std::cerr << "请勿重复初始化。" << std::endl;
return ERROR;
}
Q.length = 0;
Q.head = (QNode*)malloc(sizeof(QNode));
if (!Q.head) {
std::cerr << "申请内存空间失败。" << std::endl;
exit(ERROR);
}
Q.head->next = 0;
Q.end = Q.head;
return OK;
}
Status CreateQueue(Queue& Q) {
if (InitQueue(Q) == ERROR) {
return ERROR;
}
std::cout << "请输入队列的元素个数n:";
int i;
std::cin >> i;
if (i <= 0) {
std::cerr << "输入的数字不合法。" << std::endl;
return ERROR;
}
Q.length = i;
std::cout << "请输入创建的队列的各个元素。\n" << "共" << i << "个元素:" << std::endl;
for (int n = 0; n < i; ++n) {
QNode *temp = (QNode*)malloc(sizeof(QNode));
if (!temp) {
std::cerr << "申请内存空间失败。" << std::endl;
exit(ERROR);
}
QElemType e = 0;
std::cin >> e;
temp->data = e;
temp->next = 0;
Q.end->next = temp;
Q.end = Q.end->next;
}
return OK;
}
Status DestroyQueue(Queue& Q) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要销毁的队列不存在。" << std::endl;
return ERROR;
}
QNode* temp = Q.head;
QNode* temp1 = 0;
while (temp) {
temp1 = temp;
temp = temp->next;
free(temp1);
}
Q.end = 0;
Q.head = 0;
Q.length = -1;
return OK;
}
Status ClearQueue(Queue& Q) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要清空的队列不存在。" << std::endl;
return ERROR;
}
QNode* temp = Q.head->next;
QNode* temp1 = 0;
while (temp) {
temp1 = temp;
temp = temp->next;
free(temp1);
}
Q.end = 0;
Q.head->next = 0;
Q.length = 0;
return OK;
}
Status QueueEmpty(Queue& Q) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要判断的队列不存在。" << std::endl;
return ERROR;
}
return !Q.length ? true : false;
}
long long QueueLength(Queue& Q) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要查询的队列不存在。" << std::endl;
return ERROR;
}
return Q.length;
}
QElemType GetHead(Queue& Q) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要查询的队列不存在。" << std::endl;
return ERROR;
}
if (!Q.length) {
std::cerr << "队列为空。" << std::endl;
return ERROR;
}
return Q.head->next->data;
}
Status EnQueue(Queue& Q, QElemType e) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要修改的队列不存在。" << std::endl;
return ERROR;
}
QNode* temp = (QNode*)malloc(sizeof(QNode));
if (!temp) {
std::cerr << "申请内存空间失败。" << std::endl;
exit(ERROR);
}
temp->data = e;
temp->next = 0;
Q.end->next = temp;
Q.end = Q.end->next;
++Q.length;
return OK;
}
QElemType DeQueue(Queue& Q, QElemType& e) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要修改的队列不存在。" << std::endl;
return ERROR;
}
QNode* temp = Q.head->next;
Q.head->next = temp->next;
e = temp->data;
free(temp);
--Q.length;
return OK;
}
Status QueueTraverse(Queue& Q) {
if (Q.length < 0 && Q.head || !Q.head) {
std::cerr << "要查询的队列不存在。" << std::endl;
return ERROR;
}
if (!Q.length) {
std::cerr << "队列为空。" << std::endl;
return ERROR;
}
QNode* temp = Q.head->next;
std::cout << "以下是存储在队列的内容:" << std::endl;
while (temp) {
std::cout << temp->data << " " << std::ends;
temp = temp->next;
}
std::cout << std::endl;
return OK;
}
不包含头结点的实现:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define OK 1
#define ERROR -1
#define INIT_SIZE 100
typedef int Status;
typedef int QElemType;
typedef struct qnode{
QElemType data;
struct qnode * next;
}QNode;
typedef struct queue{
QNode* head;
QNode* end;
int length;
}Queue;
Status InitQueue(Queue& Q);
Status CreateQueue(Queue& Q);
Status DestroyQueue(Queue& Q);
Status ClearQueue(Queue& Q);
Status QueueEmpty(Queue& Q);
long long QueueLength(Queue& Q);
QElemType GetHead(Queue& Q);
Status EnQueue(Queue& Q,QElemType e);
Status DeQueue(Queue& Q,QElemType& e);
Status QueueTraverse(Queue& Q);
int main() {
Queue Q;
CreateQueue(Q);
QueueTraverse(Q);
EnQueue(Q, 999);
QueueTraverse(Q);
std::cout<<QueueLength(Q) << std::endl;
DestroyQueue(Q);
QueueTraverse(Q);
EnQueue(Q, 999);
QueueTraverse(Q);
EnQueue(Q, 777);
QueueTraverse(Q);
EnQueue(Q, 333);
QueueTraverse(Q);
QElemType e = 0;
DeQueue(Q,e);
QueueTraverse(Q);
std::cout << GetHead(Q)<<std::endl;
ClearQueue(Q);
std::cout << QueueEmpty(Q) << std::endl;
QueueTraverse(Q);
return 0;
}
Status InitQueue(Queue& Q){
if(Q.length>=0 && Q.head !=0){
std::cerr<<"请勿重复初始化。"<<std::endl;
return ERROR;
}
Q.length = 0;
Q.head = 0;
Q.end = 0;
return OK;
}
Status CreateQueue(Queue& Q) {
if (InitQueue(Q) == ERROR) {
return ERROR;
}
std::cout << "请输入队列的元素个数n:";
int i;
std::cin >> i;
if (i <= 0) {
std::cerr << "输入的数字不合法。" << std::endl;
return ERROR;
}
Q.length = i;
std::cout << "请输入创建的队列的各个元素。\n" << "共" << i << "个元素:" << std::endl;
QNode* temp = (QNode*)malloc(sizeof(QNode));
if (!temp) {
std::cerr << "申请内存空间失败。" << std::endl;
exit(ERROR);
}
QElemType e = 0;
std::cin >> e;
temp->data = e;
temp->next = 0;
Q.end = temp;
Q.head = temp;
for (int n = 1; n < i; ++n) {
temp = (QNode*)malloc(sizeof(QNode));
if (!temp) {
std::cerr << "申请内存空间失败。" << std::endl;
exit(ERROR);
}
std::cin >> e;
temp->data = e;
temp->next = 0;
Q.end ->next = temp;
Q.end = Q.end->next;
}
return OK;
}
Status DestroyQueue(Queue& Q){
if(Q.length < 0 && Q.head){
std::cerr<<"要销毁的队列不存在。"<<std::endl;
return ERROR;
}
QNode* temp = Q.head;
QNode* temp1 = 0;
while(temp){
temp1 = temp;
temp = temp->next;
free(temp1);
}
Q.end = 0;
Q.head = 0;
Q.length = -1;
return OK;
}
Status ClearQueue(Queue& Q){
if(Q.length < 0 && Q.head){
std::cerr<<"要清空的队列不存在。"<<std::endl;
return ERROR;
}
QNode* temp = Q.head;
QNode* temp1 = 0;
while(temp){
temp1 = temp;
temp = temp->next;
free(temp1);
}
Q.end = 0;
Q.head = 0;
Q.length = 0;
return OK;
}
Status QueueEmpty(Queue& Q){
if(Q.length < 0 && Q.head){
std::cerr<<"要判断的队列不存在。"<<std::endl;
return ERROR;
}
return !Q.length?true:false;
}
long long QueueLength(Queue& Q){
if(Q.length < 0 && Q.head){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
return Q.length;
}
QElemType GetHead(Queue& Q){
if(Q.length < 0 && Q.head){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
if(!Q.length){
std::cerr<<"队列为空。"<<std::endl;
return ERROR;
}
return Q.head->data;
}
Status EnQueue(Queue& Q,QElemType e){
if(Q.length<0&&Q.head){
std::cerr<<"要修改的队列不存在。"<<std::endl;
return ERROR;
}
QNode* temp = (QNode*)malloc(sizeof(QNode));
if (!temp) {
std::cerr << "申请内存空间失败。" << std::endl;
exit(ERROR);
}
temp->data = e;
temp->next = 0;
if (!Q.head && !Q.end) {
Q.head = temp;
Q.end = temp;
}
else {
Q.end->next = temp;
Q.end = Q.end->next;
}
++Q.length;
return OK;
}
QElemType DeQueue(Queue& Q,QElemType& e){
if (Q.length < 0 && Q.head) {
std::cerr << "要修改的队列不存在。" << std::endl;
return ERROR;
}
QNode* temp = Q.head;
Q.head = Q.head->next;
e = temp->data;
free(temp);
--Q.length;
return OK;
}
Status QueueTraverse(Queue& Q){
if(Q.length < 0 && Q.head){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
if(!Q.length){
std::cerr<<"队列为空。"<<std::endl;
return ERROR;
}
QNode* temp = Q.head;
std::cout << "以下是存储在队列的内容:" << std::endl;
while(temp){
std::cout << temp->data << " "<<std::ends;
temp = temp->next;
}
std::cout << std::endl;
return OK;
}