先上一张图:(我这里的队列为一般队列,双向队列、循环队列等下一章讨论)
下面是实现源码:
#include "stdafx.h" #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; //函数返回值 typedef int QElemType; //暂定元素类型为int,可以根据自己需要修改 typedef struct QNode //定义节点类型 { QElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front; //定义队头指针 QueuePtr rear; //定义队尾指针 }LinkQueue; /*---------------------------以下是队列的基本操作的函数声明以及实现--------------------------------*/ Status InitQueue(LinkQueue &Q); //构造一个空队列 Status DestroyQueue(LinkQueue &Q); //销毁队列 Status InsertQueue(LinkQueue &Q,QElemType e); //插入元素e为Q的队尾元素 Status DeQueue(LinkQueue &Q); //在队列不为空的情况下,删除队头元素 //入口测试函数 int _tmain(int argc, _TCHAR* argv[]) { LinkQueue Q; if(InitQueue(Q)) { //初始化分配空间成功 for(int i = 0;i<10; i++) //0~9自然数入队 { InsertQueue(Q,i); } printf("\n元素入队完毕...测试..."); for(int i = 0;i<10;i++) // { printf("\n出队元素为:%d",DeQueue(Q)); } } return 0; } Status InitQueue(LinkQueue &Q) { Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW); Q.front->next = NULL; return OK; } Status DestroyQueue(LinkQueue &Q) //销毁队列 { while(Q.front) { Q.rear = Q.front->next; free(Q.front); Q.front = Q.rear; } return OK; } Status InsertQueue(LinkQueue &Q,QElemType e) //插入元素e为Q的队尾元素 { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW); p->data = e; //赋值 p->next = NULL; Q.rear->next = p; //连接 Q.rear = p; //新的队尾 return OK; } QElemType DeQueue(LinkQueue &Q ) //在队列不为空的情况下,删除队头元素 { QElemType e; if(Q.front == Q.rear) return ERROR; //空队列,返回 QueuePtr p = Q.front->next; e = p->data; Q.front->next = p->next; if(Q.rear == p) Q.rear = Q.front; //删得都只剩一个了,队首队尾是同一个节点 free(p); return e; }
原文:http://blog.csdn.net/zjc_game_coder/article/details/20160883