Status InitQueue(LinkQueue **Q) {//构造一个空队列 if(!((*Q)->front = (*Q)->rear =(struct QNode *)malloc(sizeof(struct QNode)))) exit(OVERFLOW); (*Q)->front->next = NULL; return OK; } Status DestroyQueue(LinkQueue *Q) {//销毁队列Q while(Q->front) { Q->rear = Q->front->next; free(Q->front); Q->front = Q->rear; } return OK; } Status ClearQueue(LinkQueue *Q) {//将Q清为空 QueuePtr p,q; Q->rear = Q->front; p = Q->front->next; Q->front->next = NULL; while(p) { q = p; p=p->next; free(q); } return OK; } Status QueueEmpty(LinkQueue *Q) {//若Q为空队列,则返回TRUE,否则返回FALSE if(Q->front == Q->rear) { return TRUE; } else { return FALSE; } } int QueueLength(LinkQueue *Q) {//求队列的长度 int i=0; QueuePtr p; p = Q->front; while(Q->rear !=p) { i++; p=p->next; } return i; } Status GetHead(LinkQueue *Q,QElemType *e) {//若队列不空,用e返回Q的队头元素,并返回OK ,否则返回ERROR; QueuePtr p; if(Q->front == Q->rear) return ERROR; p=Q->front->next; *e = p->data; return OK; } Status EnQueue(LinkQueue *Q,QElemType e) {//插入元素e为Q的新的队尾元素 QueuePtr p; if(!(p = (QueuePtr)malloc(sizeof(struct QNode)))) exit(OVERFLOW); p->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; return OK; } Status DeQueue(LinkQueue *Q,QElemType *e) {//若队列不空,删除Q的对头元素,用e返回其值,并返回OK,否则返回ERROR QueuePtr p; if(Q->front == Q->rear) return ERROR; p = Q->front->next; *e = p->data; Q->front->next = p->next; if(Q->rear == p) Q->rear = Q->front; free(p); return OK; } Status QueueTraverse(LinkQueue *Q,void(*vi)(QElemType)) {// 从队头到队尾依次对队列Q中每个元素调用函数vi(). QueuePtr p; p = Q->front->next; while(p) { vi(p->data); p=p->next; } printf("\n"); return OK; }
队列也是常用的数据结构之一,下面给出一个链式队列的实现~~ 头文件Queue.h
- #ifndef Queue_H
- #define Queue_H
-
- typedef int Item;
- typedef struct node * PNode;
- typedef struct node
- {
- Item data;
- PNode next;
- }Node;
-
- typedef struct
- {
- PNode front;
- PNode rear;
- int size;
- }Queue;
-
-
- Queue *InitQueue();
-
-
- void DestroyQueue(Queue *pqueue);
-
-
- void ClearQueue(Queue *pqueue);
-
-
- int IsEmpty(Queue *pqueue);
-
-
- int GetSize(Queue *pqueue);
-
-
- PNode GetFront(Queue *pqueue,Item *pitem);
-
-
- PNode GetRear(Queue *pqueue,Item *pitem);
-
-
- PNode EnQueue(Queue *pqueue,Item item);
-
-
- PNode DeQueue(Queue *pqueue,Item *pitem);
-
-
- void QueueTraverse(Queue *pqueue,void (*visit)());
-
- #endif
实现代码Queue.c如下:
简单测试程序Test.c
- #include"Queue.h"
- #include<stdio.h>
- void print(Item i)
- {
- printf("该节点元素为%d\n",i);
- }
- main()
- {
- Queue *pq = InitQueue();
- int i,item;
- printf("0-9依次入队并输出如下:\n");
- for(i=0;i<10;i++)
- {
- EnQueue(pq,i);
- GetRear(pq,&item);
- printf("%d ",item);
- }
-
- printf("\n从队头到队尾遍历并对每个元素执行print函数:\n");
- QueueTraverse(pq,print);
-
- printf("队列中元素依次出队列并输出如下:\n");
- for(i=0;i<10;i++)
- {
- DeQueue(pq,&item);
- printf("%d ",item);
- }
- ClearQueue(pq);
- if(IsEmpty(pq))
- printf("\n将队列置空成功\n");
- DestroyQueue(pq);
- printf("队列已被销毁\n");
- }
|