队列是一种特殊的受限制的线性表。
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。
LinkQueue.h:
#ifndef LINKQUEUE_H
#define LINKQUEUE_H
#define QUEUE_FALSE 0
#define QUEUE_TRUE 1
#include<stdlib.h>
#include<stdio.h>
//链表队列结点
typedef struct _LINKNODE{
void* data;
struct _LINKNODE* next;
}LinkNode;
//链式队列头结点
typedef struct _LINKQUEUE{
LinkNode* head;
int length;
}LinkQueue;
//初始化链式队列
LinkQueue* InitLinkQueue();
//销毁链式队列
void DestroyLinkQueue(LinkQueue* lqueue);
//向队尾插入结点
int PushLinkQueue(LinkQueue* lqueue,void* data);
//返回对头数据
void* FrontLinkQueue(LinkQueue* lqueue);
//弹出对头结点
void PopLinkQueue(LinkQueue* lqueue);
//返回队列长度
int GetLengthLinkQueue(LinkQueue* lqueue);
//判断队列是否为空
int IsEmptyLinkQueue(LinkQueue* lqueue);
#endif
LinkQueue.c:
#include"LinkQueue.h"
//初始化链式队列
LinkQueue* InitLinkQueue(){
LinkQueue* lqueue = (LinkQueue*)malloc(sizeof(LinkQueue));
if (lqueue == NULL){
return NULL;
}
lqueue->head = NULL;
lqueue->length = 0;
return lqueue;
}
//销毁链式队列
void DestroyLinkQueue(LinkQueue* lqueue){
while (!IsEmptyLinkQueue(lqueue)){
PopLinkQueue(lqueue);
}
free(lqueue);
}
//向队尾插入结点
int PushLinkQueue(LinkQueue* lqueue, void* data){
//创建新结点
LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));
newnode->data = data;
newnode->next = NULL;
//第一次插入
if (lqueue->head == NULL){
lqueue->head = newnode;
lqueue->length++;
return 0;
}
//其他插入
newnode->next = lqueue->head;
lqueue->head = newnode;
lqueue->length++;
return 0;
}
//返回对头数据
void* FrontLinkQueue(LinkQueue* lqueue){
LinkNode* pCurrent = lqueue->head;
while (pCurrent->next != NULL){
pCurrent = pCurrent->next;
}
return pCurrent->data;
}
//弹出对头结点
void PopLinkQueue(LinkQueue* lqueue){
//如果只有一个结点
if (lqueue->length == 1){
free(lqueue->head);
lqueue->head = NULL;
lqueue->length--;
return;
}
//多于一个结点
LinkNode* pPrev = lqueue->head;
LinkNode* pCurrent = pPrev->next;
while (pCurrent->next != NULL){
pPrev = pCurrent;
pCurrent = pPrev->next;
}
free(pCurrent);
pPrev->next = NULL;
lqueue->length--;
}
//返回队列长度
int GetLengthLinkQueue(LinkQueue* lqueue){
return lqueue->length;
}
//判断队列是否为空
int IsEmptyLinkQueue(LinkQueue* lqueue){
if (lqueue->length == 0){
return QUEUE_TRUE;
}
return QUEUE_FALSE;
}
main.c
#include"LinkQueue.h"
typedef struct _TEAHCER{
char name[64];
int age;
}Teacher;
void test01(){
//创建链式队列
LinkQueue* queue = InitLinkQueue();
//创建数据
Teacher t1, t2, t3;
t1.age = 10;
t2.age = 20;
t3.age = 30;
strcpy(t1.name, "aaa");
strcpy(t2.name, "bbb");
strcpy(t3.name, "ccc");
//链式队列插入数据
PushLinkQueue(queue, &t1);
PushLinkQueue(queue, &t3);
PushLinkQueue(queue, &t2);
//打印链式队列
printf("链式队列长度:%d\n",GetLengthLinkQueue(queue));
while (!IsEmptyLinkQueue(queue)){
Teacher* teacher = (Teacher*)FrontLinkQueue(queue);
printf("Name:%s Age:%d\n",teacher->name,teacher->age);
PopLinkQueue(queue);
}
printf("链式队列长度:%d\n", GetLengthLinkQueue(queue));
//销毁链式队列
DestroyLinkQueue(queue);
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}

冀公网安备13050302001966号