#include #include /************************************************************************/ /* 队列 结构要素:队列容量 内存指针 元素个数 队列头 对列尾 */ /************************************************************************/ #define QUEUE_CAPACITY 3 //队列容量 typedef struct tag_queue { int *pQueue; //队列内存指针 int head; //队列头 int tail; //队列尾 int length; //元素个数 }LineQueue; int InitQueue(LineQueue **myQueue); //InitQueue(&Q) 创建队列 void DestroyQueue(LineQueue *myQueue); //DestroyQueue(&Q) 销毁队列 void ClearQueue(LineQueue *myQueue); //已有的元素清空掉 //ClearQueue(&Q) 清空队列 int QueueEmpty(LineQueue *myQueue); //QueueEmpty(&Q) 判空队列 int QueueFull(LineQueue *myQueue); //QueueFull(&Q) 判满队列 int QueueLength(LineQueue *myQueue); //QueueLength(&Q) 队列长度 int EnQueue(LineQueue *myQueue, int element); //EnQueue(&Q, element) 新元素入队 int DeQueue(LineQueue *myQueue, int *element); //DeQueue(&Q, &element) 首元素出队 void QueueTraverse(LineQueue *myQueue); //QueueTraverse(Q, visit()) 遍历队列 int InitQueue(LineQueue **myQueue) { (*myQueue) = (LineQueue *)malloc(sizeof(LineQueue));//申请内存.强制转换,不然会为void无类型。分配结构体内存 //printf("queue1 = %p\n", (*myQueue)); if(myQueue == NULL) { return 0; } (*myQueue)->pQueue = (int *)malloc(sizeof(int) * QUEUE_CAPACITY);//分配队列内存 if((*myQueue)->pQueue == NULL) { return 0; } (*myQueue)->head = 0; (*myQueue)->tail = 0; (*myQueue)->length = 0; return 1; } void DestroyQueue(LineQueue *myQueue) { free(myQueue->pQueue); myQueue->pQueue = NULL; free(myQueue); myQueue = NULL; } void ClearQueue(LineQueue *myQueue)//把队列里面所有的元素删除掉 { myQueue->length = 0; myQueue->tail = 0; } int QueueEmpty(LineQueue *myQueue) { if(myQueue->length == 0) { return 1; } return 0; } int QueueFull(LineQueue *myQueue) { if(myQueue->length >= QUEUE_CAPACITY)//#define QUEUE_CAPACITY 3 //队列容量 { return 1; } return 0; } int QueueLength(LineQueue *myQueue) { return myQueue->length; } int EnQueue(LineQueue *myQueue, int element) { if(QueueFull(myQueue))//判断他是否为满的操作,满了就不能进队列了 { return 0; } myQueue->pQueue[myQueue->tail] = element;//把元素放入队尾 myQueue->tail++;//因为进队列,所以++1 myQueue->length++;//大小++1 return 1; } int DeQueue(LineQueue *myQueue, int *element)//取出来,是从head开始取出的啦 { int i = 0; if(QueueEmpty(myQueue)) { return 0; } *element = myQueue->pQueue[myQueue->head]; for(i = 1; i < myQueue->length; i++) { myQueue->pQueue[i-1] = myQueue->pQueue[i];//所有元素往前靠一步 } myQueue->length--;//因为少了一个,所以-- myQueue->tail--;//因为所有元素往前移动一位了,所以--1 return 1; } void QueueTraverse(LineQueue *myQueue, int flag) { int i = 0; if(flag == 0) //从头到尾 { for(i = 0; i < myQueue->length; i++) { printf("%d ", myQueue->pQueue[i]); } } if(flag == 1) //从尾到头 { for(i = myQueue->length - 1; i >= 0; i--) { printf("%d ", myQueue->pQueue[i]); } } } int main(void) { int elem = 0; LineQueue *queue = NULL; InitQueue(&queue); if(QueueEmpty(queue)) { printf("当前队列为空\n"); } EnQueue(queue, 2); EnQueue(queue, 4); EnQueue(queue, 5); if(QueueFull(queue)) { printf("当前队列为满\n"); } QueueTraverse(queue, 0); printf("\n-----------------------\n"); /*DeQueue(queue, &elem); printf("elem = %d\n", elem); DeQueue(queue, &elem); printf("elem = %d\n", elem); DeQueue(queue, &elem); printf("elem = %d\n", elem);*/ printf("queueLength = %d\n", QueueLength(queue)); ClearQueue(queue); if(QueueEmpty(queue)) { printf("当前队列为空\n"); } //QueueTraverse(queue, 1); //printf("queue2 = %p\n", queue); DestroyQueue(queue); system("pause"); return 0; }
C语言队列(排队)先进先出.实现全部函数
关注
打赏