队列的链式存储
2015-03-26 15:06
162 查看
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 typedef int ElemType; typedef struct LinkQueueNode { ElemType data; struct LinkQueueNode *next; }LinkQueueNode; typedef struct LinkQueue { LinkQueueNode *front; LinkQueueNode *rear; }LinkQueue; LinkQueue* Create_Queue() { LinkQueue *queue = (LinkQueue *)malloc(sizeof(LinkQueue)); if(queue == NULL) { return NULL; } queue->front = NULL; queue->rear = NULL; return queue; } int EnQueue(LinkQueue *queue,ElemType data) { LinkQueueNode * node = NULL; if(queue == NULL) { return -1; } node = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if(node == NULL) { return -2; } node->next = NULL; node->data = data; //也可以在刚开始就创一个头节点 if(queue->front == NULL || queue->rear == NULL) { //头 queue->front = node; queue->rear = node; return 0; } //插入 queue->rear->next = node; queue->rear = node; return 0; } int DeQueue(LinkQueue *queue,ElemType *value) { LinkQueueNode *tmp = NULL; if(queue == NULL || value == NULL) { return -1; } if(queue->front == NULL || queue->rear == NULL) { //没有数据 return -2; } tmp = queue->front; *value = queue->front->data; if(queue->front == queue->rear) { //此时front==rear,则队尾也要下移 queue->rear = tmp->next; } queue->front = tmp->next; free(tmp); return 0; } void Destroy_Queue(LinkQueue *queue) { LinkQueueNode *tmp = NULL; if(queue == NULL) { return; } while(queue->front) { tmp = queue->front->next; free(queue->front); queue->front = tmp; } free(queue); } int main() { LinkQueue *queue = NULL; int i,value; queue = Create_Queue(); if(queue == NULL) { return -1; } for(i=0;i<=20;i++) { if(EnQueue(queue,i) != 0) { printf("enqueue %d error\n",i); } else { printf("enqueue %d ",i); } } DeQueue(queue,&value); printf("Dequeue %d\n",value); Destroy_Queue(queue); return 0; }
结果:
enqueue 0 enqueue 1 enqueue 2 enqueue 3 enqueue 4 enqueue 5 enqueue 6 enqueue 7
enqueue 8 enqueue 9 enqueue 10 enqueue 11 enqueue 12 enqueue 13 enqueue 14 enque
ue 15 enqueue 16 enqueue 17 enqueue 18 enqueue 19 enqueue 20 Dequeue 0
从结果来看,因为是链式结构,所以数量没有了限制,21个数全入队列。
这里的数据结构与前面的主要不同点就是多了两个指针,一个指向头,一个指向尾。另外,值得注意的是,在每次入队,或出队时,一定要注意只有一个或者没有结点时的特殊情况,很多人会不小心忽略了这一点。比如,在插入时,如果是第一次的话,不做特殊判断,一旦执行插入的这句话:
queue->rear->next = node;
程序就崩了。理由很简单,queue->rear 此时等于NULL,没有内存,却去取内存的next值,无处可取,直接死掉。
总的来说,程序结果都在我们意料之中,这篇的代码风格与前面都差不多,也不是很难,相信大家都看得懂。