LinkQueue.h
#ifndef LINKQUEUE_H #define LINKQUEUE_H //节点的结构体 typedef struct _QueueNode { void* data; struct _QueueNode* next; }QueueNode; //队列结构体 typedef struct _LinkQueue { QueueNode* head;//队头 QueueNode* rear;//队尾 int length; }LinkQueue; //初始化:创建队 LinkQueue* Creat_LinkQueue(); //入队列 void Push_LinkQueue(LinkQueue* queue,void* data); //出队 void Pop_LinkQueue(LinkQueue* queue); //求队的大小 int Size_LinkQueue(LinkQueue* queue); //获得队的头部的元素 void* Front_LinkQueue(LinkQueue* queue); //获取队的尾部元素 void* Back_LinkQueue(LinkQueue* queue); //判读队是否为空 int IsEmpty_LinkQueue(LinkQueue* queue); //销毁 void Destroy_LinkQueue(LinkQueue* queue); #endif
LinkQueue.c
#include<stdlib.h> #include<stdio.h> #include"LinkQueue.h" //初始化:创建队 LinkQueue* Creat_LinkQueue() { LinkQueue* queue=(LinkQueue*)malloc(sizeof(LinkQueue)); if(queue==NULL) { return NULL; } queue->head=NULL; queue->rear=NULL; queue->length=0; return queue; } //入队列 void Push_LinkQueue(LinkQueue* queue,void* data) { QueueNode* newnode=NULL; if(queue==NULL||data==NULL) { return; } //创建新的结点 newnode=(QueueNode*)malloc(sizeof(QueueNode)); if(newnode == NULL) { return; } newnode->data=data; newnode->next=NULL; //如果是个空队列 if (queue->length==0) { queue->head=newnode; queue->rear=newnode; queue->length++; return; } //节点入队列 queue->rear->next=newnode; queue->rear=newnode; queue->length++; } //出队 void Pop_LinkQueue(LinkQueue* queue) { QueueNode* pNext=NULL; if(queue==NULL||queue->length==0) { return; } //只有一个结点的情况 if(queue->length==1) { free(queue->head); queue->head=NULL; queue->rear=NULL; queue->length--; return; } //其他情况 //缓存下一个结点 pNext=queue->head->next; free(queue->head); queue->head=pNext; queue->length--; } //长度 int Size_LinkQueue(LinkQueue* queue) { if(queue==NULL) { return -1; } return queue->length; } //获得队头的元素 void* Front_LinkQueue(LinkQueue* queue) { if (queue==NULL) { return NULL; } if(queue->length==0) { return NULL; } return queue->head->data; } //获取队的尾部元素 void* Back_LinkQueue(LinkQueue* queue) { int i=0; QueueNode* pCurrent=NULL;//辅助指针 if(queue==NULL) { return NULL; } if(queue->length==0) { return NULL; } pCurrent=queue->head; for(i=0;i<queue->length-1;i++) { pCurrent=pCurrent->next; } return pCurrent->data; } //判读队是否为空 int IsEmpty_LinkQueue(LinkQueue* queue) { if(queue==NULL) { return -1; } if(queue->length==0) { return 1; } return 0; } //销毁 void Destroy_LinkQueue(LinkQueue* queue) { if(queue==NULL) { return; } while(queue->length>0) { Pop_LinkQueue(queue); } //释放队列的内存 free(queue); }
testLinkQueue.c测试队的链式存储
#include <stdio.h> #include"LinkQueue.h" typedef struct _Player { int age; int num; }Player; int main() { //创建队列 LinkQueue* queue=Creat_LinkQueue(); //创建数据 Player p1={10,2}; Player p2={20,3}; Player p3={30,4}; Player* p=NULL; //入队列 Push_LinkQueue(queue,&p1); Push_LinkQueue(queue,&p2); Push_LinkQueue(queue,&p3); p=(Player*)Front_LinkQueue(queue); printf("队头:Age:%d Num:%d\n",p->age,p->num); p=(Player*)Back_LinkQueue(queue); printf("队尾:Age:%d Num:%d\n",p->age,p->num); //打印 while(Size_LinkQueue(queue)>0) { p=(Player*)Front_LinkQueue(queue); printf("Age:%d Num:%d\n",p->age,p->num); Pop_LinkQueue(queue); } //销毁队列 Destroy_LinkQueue(queue); return 0; }