队列的链式实现源码如下:这是之后的链队列操作的基础。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define QOVERFLOW -1
typedef int QElem,Status;
typedef struct QNode{
QElem data;
QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}Queue;
Status InitQueue(Queue &q){
q.rear = q.front = (QueuePtr)malloc(sizeof(QNode));
if(!q.front){
exit(QOVERFLOW);
}
q.front->next = NULL;
return OK;
}
Status EnQueue(Queue &q,QElem e){
QueuePtr node = (QueuePtr)malloc(sizeof(QNode));
if(!node){
exit(QOVERFLOW);
}
node->data = e;
node->next = NULL;
q.rear->next = node;
q.rear = node;
return OK;
}
Status QueueEmpty(Queue q){
return (q.front == q.rear);
}
Status DeQueue(Queue &q,QElem &e){
if(QueueEmpty(q)){
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 OK;
}
Status DestroyQueue(Queue &q){
while(q.front){
q.rear = q.front->next;
free(q.front);
q.front = q.rear;
}
return OK;
}
void visit(QueuePtr node){
printf("visit % d \n",node->data);
}
Status QueueTraverse(Queue q){
QueuePtr node = q.front->next;
while(node){
visit(node);
node = node->next;
}
}
Status GetHead(Queue q,QElem &e){
if(QueueEmpty(q)){
return ERROR;
}
QueuePtr p = q.front->next;
e = p->data;
}
main(){
Queue queue;
InitQueue(queue);
int rands,res;
for(int i = 0;i<100;i++){
rands = rand()%1000;
EnQueue(queue,rands);
GetHead(queue,res);
printf("入队:%d 队头:%d\n",rands,res);
}
while(!QueueEmpty(queue)){
GetHead(queue,res);
DeQueue(queue,rands);
printf("队头:%d 出队: %d\n",res,rands);
}
system("pause");
return 0;
}