
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LinkNode
{ElemType data;struct LinkNode *next;
} LinkNode;
typedef struct
{LinkNode *front, *rear;
} LinkQueue;
void InitQueue(LinkQueue &Q)
{Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));Q.front->next = NULL;
}
bool EnQueue(LinkQueue &Q, ElemType x)
{LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));p->data = x;p->next = NULL;Q.rear->next = p;Q.rear = p;return true;
}
bool DeQueue(LinkQueue &Q, ElemType &x)
{if (Q.front == Q.rear){return false;}LinkNode *p = Q.front->next;x = p->data;Q.front->next = p->next;if (Q.rear == p){Q.rear = Q.front;}free(p);return true;
}
void Traverse(LinkQueue Q)
{LinkNode *p = Q.front->next;while (p != NULL){cout << p->data << " ";p = p->next;}cout << endl;
}
int QueueLength(LinkQueue Q)
{int length = 0;LinkNode *p = Q.front->next;while (p != NULL){length++;p = p->next;}return length;
}
int main()
{LinkQueue Q;ElemType x;InitQueue(Q);EnQueue(Q, 1);EnQueue(Q, 2);EnQueue(Q, 3);EnQueue(Q, 4);DeQueue(Q, x);Traverse(Q);cout << QueueLength(Q) << endl;return 0;
}
