#include<iostream> //队列(C++),Q为头结点
using namespace std; // Q->front->next->data 为第一个元素
#include <malloc.h> // Q->rear->data 为最后一个元素
//typedef struct BiTNode { //测试存放的指针类型
// int data;
// struct BiTNode* lchild, * rchild;
//}BiTNode, * BiTree;
//
//BiTree createb(BiTree T) {
// T->data = 1;
// T->lchild = (BiTree)malloc(sizeof(BiTNode));
// T->rchild = (BiTree)malloc(sizeof(BiTNode));
// T->lchild->data = 2;
// T->rchild->data = 3;
// return T;
//}
typedef int ElemType; //用来更换队列存储的数据类型,可以是char、指针等
typedef struct Node { //存放数据域和指针域(辅)
ElemType data;
struct Node* next;
}QNode, * QueuePtr;
typedef struct { //队列的头尾指针(主)
QueuePtr front;
QueuePtr rear;
}LinkQ, * LinkQueue;
LinkQueue InitQueue() { //构造空队列
LinkQueue Q;
//Q = (LinkQueue)malloc(sizeof(LinkQ));
Q = new LinkQ();
//Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
Q->front = Q->rear = new QNode();
Q->front->next = NULL;
return Q;
}
void PrintQueue(LinkQueue Q) { //输出队列
//注:此处若不用临时指针q1->front指向Q->front的话,若直接用Q->front,那么
// Q->front的地址会改变,调用此函数后,指向的就不是队列的头结点了
//详见下面的function()函数
LinkQueue q1;
//q1 = (LinkQueue)malloc(sizeof(LinkQ));
q1 = new LinkQ();
q1->front = Q->front;
while (q1->front->next) {
//注:若调用BiTree,则此处还要后加->data
//因为此时q1->front->next->data存储的是BiTree型指针
cout << q1->front->next->data << " ";
q1->front = q1->front->next;
}
}
void DestroyQueue(LinkQueue Q) { //销毁队列
while (Q->front) {
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
}
void push(LinkQueue Q, ElemType e) { //插入元素e为队尾元素
//QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
QueuePtr p = new QNode();
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
void pop(LinkQueue Q) { //移除队列第一个元素
Q->front = Q->front->next;
}
ElemType Q_front(LinkQueue Q) { //返回队头元素
if (Q->front == Q->rear) return 0;
ElemType e = Q->front->next->data;
return e;
}
ElemType Q_back(LinkQueue Q) { //返回队尾元素
if (Q->front == Q->rear) return 0;
ElemType e = Q->rear->data;
return e;
}
int Q_size(LinkQueue Q) { //返回队列长度
LinkQueue q1;
//q1 = (LinkQueue)malloc(sizeof(LinkQ));
q1 = new LinkQ();
q1->front = Q->front;
int length = 0;
while (q1->front->next) {
length++;
q1->front = q1->front->next;
}
return length;
}
int empty(LinkQueue Q) { //判断队列是否为空,是—1,否—0
if (Q->front == Q->rear)
return 1;
else
return 0;
}
//证明:1.移动前后,头结点q1和Q都不会变(q1和Q仅仅代表结构体,不是头指针)
// 2.移动后,当定义q1 = Q时:q1->front和Q->front同步同地址变化(因为二者从根源上相同)
// 当定义q1->front = Q->front(q1->front头指针指向Q->front头指针)时:q1->front变,Q->front不变
// 移动本质:定义另一个指针q1->front指向Q->front,q1->front的移动,不会影响到Q->front
// 3.只是q1->front移动,q1->front地址改变,但不会改变头结点q1(结构体)的地址
void function(LinkQueue Q) {
LinkQueue q1;
q1 = InitQueue();
*q1 = *Q; //相当于把Q完全复制一份给q1,q1的操作不会影响到Q
cout << "移动前,q1地址:" << q1 << endl;
cout << "移动前, Q地址:" << Q << endl;
cout << "移动前,q1->front地址:" << q1->front << endl;
cout << "移动前, Q->front地址:" << Q->front << endl;
q1->front = q1->front->next;
cout << endl;
cout << "移动后,q1地址:" << q1 << endl;
cout << "移动后, Q地址:" << Q << endl;
cout << "移动后,q1->front地址:" << q1->front << endl;
cout << "移动后, Q->front地址:" << Q->front << endl;
}
int main() {
/*LinkQueue Q;
Q = InitQueue();
BiTree T;
//T = (BiTree)malloc(sizeof(BiTNode));
T = new BiTNode();
T = createb(T);
push(Q, T);
push(Q, T->lchild);
push(Q, T->rchild);
PrintQueue(Q);
return 0;*/
int i, j, temp, number;
LinkQueue Q;
Q = InitQueue();
cin >> number;
for (i = 0; i < number; i++) {
cin >> temp;
push(Q, temp);
}
function(Q);
return 0;
}
测试结果: