/* * 2015年4月17日14:04:56 * 目的:用链式存储来实现队列 * 这里我最开始想使用单链表来实现 * 大家来想一下啊,其实单链表实现不是特别好 * 因为虽然出队列的时间复杂度就是O(1),但是 * 入队列的时间复杂度却是O(n),因为每次都是从末尾进行插入 * 从末尾插入你首先就要找到当前指向尾指针的结点,由于链表是单向的 * 所以必须从front开始进行遍历才能找到rear前一个结点。 * 为了解决入队列这个时间复杂度的问题,我觉得可以使用双向链表来解决 * 虽然这样会浪费一些内存空间,但是可以解决时间复杂度的问题。 */ # include <stdio.h> struct LinkNode{ int data; LinkNode *next; LinkNode *prior; }; struct LinkQueue{ LinkNode *front;//队头指针 LinkNode *rear; //队尾指针 }; //定义一个int变量,表示队列的长度 int length = 0; void initQueue(LinkQueue *queue) { queue->front = new LinkNode; //这个相当于链表的头指针。 queue->rear = new LinkNode; //相当于链表的尾指针。 queue->front->next = queue->rear; queue->front->prior = NULL; queue->rear->next = NULL; queue->rear->prior = queue->front; } //判断队列是否为空 bool isEmpty(LinkQueue *queue) { /* * 其实判断为空还可以用queue->front == queue->rear == NULL * 来判断,但是既然我这里设置了length全局变量,就想要好好利用 */ if(length == 0) return true; else return false; } //进队列 void enterQueue(LinkQueue *queue,int value) { LinkNode *temp = new LinkNode; temp->data = value; //把想要插入的值赋给一个新的结点 /*将结点插入到尾结点和尾结点前面的元素之间,时间复杂度是O(1)*/ temp->next = queue->rear; temp->prior = queue->rear->prior; queue->rear->prior->next = temp; queue->rear->prior = temp; length++; } //出队列 void deleteQueue(LinkQueue *queue,int *value) { *value = queue->front->next->data; //出队列是从头部开始出 queue->front->next = queue->front->next->next; queue->front->next->prior = queue->front; length--; } //打印出队列中所有的元素 void printQueue(LinkQueue *queue) { if(isEmpty(queue)) { printf("队列中无元素。\n"); } else { printf("队列中元素为:\n"); LinkNode *temp = queue->front->next; for(int i = 1;i <= length;i++) { printf("%4d ",temp->data); if(i % 10 == 0) { printf("\n"); } temp = temp->next; } printf("\n"); } } int main(void) { LinkQueue queue; initQueue(&queue); for(int i = 1;i <= 20;i++) enterQueue(&queue,i); printQueue(&queue); int value = 0; deleteQueue(&queue,&value); deleteQueue(&queue,&value); printQueue(&queue); return 0; }
时间: 2024-10-11 03:13:34