diff --git a/queue.cpp b/queue.cpp new file mode 100644 index 0000000..d3bc8a4 --- /dev/null +++ b/queue.cpp @@ -0,0 +1,162 @@ +#include"stdio.h" +#include"stdlib.h" +typedef int QueueElem; + +// 队列结点类型 +typedef struct linkQueueNode +{ + QueueElem data; + struct linkQueueNode *next; +}LinkQueueNode; + +// 队列 +typedef struct linkQueue +{ + LinkQueueNode *front; // 队头指针 + LinkQueueNode *rear; // 队尾指针 + int QueueLen; // 队列长度 +}LinkQueue; + +// 1. 初始化一个队列 +LinkQueue *initQueue() +{ + LinkQueue *queue = (LinkQueue* )malloc(sizeof(LinkQueue)); + queue->front = queue->rear = NULL; + queue->QueueLen = 0; + + return queue; +} + +// 2. 入队 +int enterQueue(LinkQueue *Queue, QueueElem data) +{ + // 申请一个队列元素空间z + LinkQueueNode *QNode = (LinkQueueNode* )malloc(sizeof(LinkQueueNode)); + if ( QNode == NULL ) + return -1; //入队失败 + QNode->data = data; + QNode->next = NULL; + + // 入队 -- 尾插 + // 队列为空 + if ( Queue->rear == NULL ) + Queue->front = Queue->rear = QNode; + else + { + Queue->rear->next = QNode; + Queue->rear = QNode; + } + + Queue->QueueLen++; + + return 0; +} + +// 5. 判断队列是否为空 +int QueueIsEmpty(LinkQueue *Queue) +{ + return Queue->QueueLen; +} +//#define QueueLen(Queue) QueueIsEmpty(Queue) + +// 3. 出队 +QueueElem delQueue(LinkQueue *Queue) +{ + // 如果队列不为空 + if ( QueueIsEmpty(Queue) ) + { + // 摘除头部结点 + LinkQueueNode *p = Queue->front; + Queue->front = Queue->front->next; + p->next = NULL; + + // 如果只有一个结点 + Queue->rear = Queue->front ? Queue->rear : NULL; + + // 保留结点的数据域 释放掉结点 + QueueElem data = p->data; + // Queue->front->next->data = p->front->data; + free(p); + + Queue->QueueLen--; + //free(p); + return data; + } + + return -1; // 出队失败 +} + +// 4. 获取队头元素 +QueueElem getFront(LinkQueue *Queue) +{ + + // 如果队列不为空 + if ( QueueIsEmpty(Queue) ) + return Queue->front->data; + + return -1; +} + +//#define QueueLen(Queue) QueueIsEmpty(Queue) +// 6. 获取队列长度 +int QueueLen(LinkQueue *Queue) +{ + return Queue->QueueLen; +} + +// 7. 清空一个队列 --- 不断地出队 +void clearQueue(LinkQueue *Queue) +{ + while ( QueueIsEmpty(Queue) ) + delQueue(Queue); +} + +// 8. 销毁一个队列 +void destoryQueue(LinkQueue **Queue) +{ + clearQueue(*Queue); + free(*Queue); + *Queue = NULL; +} + +int main() +{ + QueueElem x; + + LinkQueue *Queue = initQueue(); + + // 不断入队 + while(1) + { + scanf("%d", &x); + if ( x == 0 ) + { + printf("input finsh\n"); + break; + } + + // 如果入队列失败 直接退出程序 + if ( enterQueue(Queue, x) == -1 ) + exit(-1); + } + + // 输出队列元素 + printf ("Front Elem: %d QueueLen: %d\n", getFront(Queue), QueueLen(Queue)); + + // 如果队列不为空 就不断出队 + while ( QueueIsEmpty(Queue) ) + printf("%d ", delQueue(Queue)); + printf("\n"); + + enterQueue(Queue, 1); + enterQueue(Queue, 2); + + printf ("Front Elem: %d\n", getFront(Queue)); + + // 销毁队列 并且将实参指向NULL + destoryQueue(&Queue); + if ( Queue == NULL ) + printf("Destory Finsh\n"); + + return 0; +}