#include <stdio.h> #include <stdlib.h> typedef int QElemType; typedef struct QNode{ QElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }LinkQueue; int visit(QElemType e) { printf("%d/t", e); return 0; } int InitQueue(LinkQueue *Q) { if (Q == NULL) { return -1; } Q->front = (QNode *)malloc(sizeof(QNode)); if (Q->front == NULL) { return -1; } Q->front->next =NULL; Q->rear = Q->front; return 0; } int DestroyQueue(LinkQueue *Q) { if (Q == NULL) { return -1; } while (Q->front != NULL) { Q->rear = Q->front->next; free(Q->front); Q->front = Q->rear; } return 0; } int ClearQueue(LinkQueue *Q) { if (Q == NULL) { return -1; } Q->rear = Q->front; return 0; } int QueueEmpty(LinkQueue Q) { if (Q.front == Q.rear) { return 1; } else { return 0; } } int QueueLength(LinkQueue Q) { int length = 0; QueuePtr p = NULL; if (QueueEmpty(Q)) { return 0; } else { p = (Q.front)->next; } while (p != NULL) { length++; p = p->next; } return length; } int GetHead(LinkQueue Q, QElemType *e) { QueuePtr p = NULL; if (e == NULL) { return -1; } if (QueueEmpty(Q)) { return -1; } else { p = Q.front->next; *e = p->data; } return 0; } int EnQueue(LinkQueue *Q, QElemType e) { QueuePtr p = NULL; if ((Q == NULL)) { return -1; } p = (QueuePtr)malloc(sizeof(QNode)); if (p == NULL) { return -1; } p->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; return 0; } int DeQueue(LinkQueue *Q, QElemType *e) { QueuePtr p = NULL; if ((Q == NULL) || (e == NULL)) { return -1; } if (Q->front == Q->rear) { return -1; } p = Q->front->next; *e = p->data; Q->front->next = p->next; if (Q->rear == p) { Q->rear = Q->front; } free(p); return 0; } int QueueTraverse(LinkQueue Q, int (*visit)(QElemType e)) { QueuePtr p = NULL; p = Q.front->next; while (p) { visit(p->data); p = p->next; } return 0; } int main(void) { LinkQueue Q; QElemType e; int length = 0; InitQueue(&Q); EnQueue(&Q, 1); EnQueue(&Q, 2); QueueTraverse(Q, visit); DeQueue(&Q, &e); QueueTraverse(Q, visit); DeQueue(&Q, &e); return 0; }