//------------------------------------------------------------------------------ // 队列 即比单链表多了头尾标志而已,本质还是单链表 //------------------------------------------------------------------------------ #include <iostream> using namespace std; typedef struct Node { int data; Node* next; } Node, *LPNode; typedef struct Queue { Node* first; // 头 Node* rear; // 尾 }Queue, *LPQueue; //****************************************************************************** // Name: CreateQueue // Desc: 创建队列 //****************************************************************************** Queue* CreateQueue() { // 创建并返回一个空的队列 Queue* tempQueue = new Queue; tempQueue->first = NULL; tempQueue->rear = NULL; return tempQueue; } //****************************************************************************** // Name: Insert // Desc: 入队 //****************************************************************************** Queue* Insert(Queue* que, int data) { // 队里为空,不能进行入队操作 if(que == NULL) { return NULL; } // 先创建一个节点 Node* newNode = new Node; newNode->data = data; newNode->next = NULL; // 因为队列的特点是先进先出,所以入队的时候,插入的位置在最后 if(que->first == NULL) { //---------------------------------------------------------------------- // 头和尾公用一块地址,所以后面插入的时候,队首也将会自动设置next //---------------------------------------------------------------------- que->first = newNode; // 队首 que->rear = newNode; } else { que->rear->next = newNode; que->rear = newNode; // 队尾 } // 返回队列 return que; } //****************************************************************************** // Name: OutOfQueue // Desc: 出队列, 返回队首元素使用一维指针,因为已经是指针的指针,能改变内容 //****************************************************************************** Node* OutOfQueue1(Queue* que) { if(que == NULL) { cout<<"队列为空"<<endl; return NULL; } // 先进先出原则 Node* outNode = que->first; que->first = que->first->next; return outNode; // 返回出队列的元素 } //****************************************************************************** // Name: OutOfQueue // Desc: 出队列, 返回队首元素,改变了队列的指针,使用二维指针 //****************************************************************************** Node* OutOfQueue2(Queue** que) { if(*que == NULL) { cout<<"队列为空"<<endl; return NULL; } // 先进先出原则 Node* outNode = (*que)->first; (*que)->first = (*que)->first->next; return outNode; // 返回出队列的元素 } //****************************************************************************** // Name: PrintQueue // Desc: 打印队列 //****************************************************************************** void PrintQueue(Queue* que) { /* 改变指针的指针,改变了堆内存的东西,不想单双链表那样 Queue* tempQue = que; while(tempQue->first != NULL) { cout<<tempQue->first->data<<" "; tempQue->first = tempQue->first->next; } cout<<endl; */ if(que == NULL) { cout<<"队列为空"<<endl; } Node* tempNode = que->first; while(tempNode != NULL) { cout<<tempNode->data<<" "; tempNode = tempNode->next; } cout<<endl; } //****************************************************************************** // Name: QueueLength // Desc: 返回队列长度 //****************************************************************************** int QueueLength(Queue* que) { if(que == NULL) { return 0; } int currentLength = 0; Node* tempNode = que->first; while(tempNode != NULL) { ++currentLength; tempNode = tempNode->next; } return currentLength; } int main() { // 创建队列 Queue* que = CreateQueue(); cout<<"创建队列成功,输入几组要入队的元素"<<endl; // 入队 int insertElem; while(cin>>insertElem) { que = Insert(que, insertElem); } // 打印 cout<<"打印队列:"<<endl; PrintQueue(que); // 打印 cout<<"打印队列:"<<endl; PrintQueue(que); // 出队列 Node* outNode = OutOfQueue1(que); cout<<"队列首出队:"<<outNode->data<<endl; // 再次打印 PrintQueue(que); // 打印长度 cout<<"当前队列长度为:"<<QueueLength(que)<<endl; system("pause"); return 0; }