LinkQueue.h
#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//链表节点
struct QueueNode{
struct QueueNode *next;//只维护指针域
};
//队列结构体
struct Queue{
//头结点
struct QueueNode pHeader;
//队列大小
int m_size;
//维护尾节点指针
struct QueueNode *pTail;
};
typedef void* LinkQueue;
//初始化队列
LinkQueue Init_LinkQueue();
//入队
void push_LinkQueue(LinkQueue queue, void * data);
//出队
void pop_LinkQueue(LinkQueue queue);
//返回队头
LinkQueue front_LinkQueue(LinkQueue queue);
//返回队尾
LinkQueue back_LinkQueue(LinkQueue queue);
//返回队列大小
int size_LinkQueue(LinkQueue queue);
//销毁队列
void destroy_LinkQueue(LinkQueue queue);
LinkQueue.c
#include "LinkQueue.h"
//初始化队列
LinkQueue Init_LinkQueue()
{
struct Queue * myQueue = (struct Queue *)malloc(sizeof(struct Queue));
if (myQueue == NULL)
{
return NULL;
}
myQueue->pHeader.next = NULL;
myQueue->m_size = 0;
myQueue->pTail = &myQueue->pHeader;//一开始尾节点就是指向头结点
return myQueue;
}
//入队
void push_LinkQueue(LinkQueue queue, void * data)
{
if (queue == NULL)
{
return;
}
if (data == NULL)
{
return;
}
//还原真实的队列结构体
struct Queue * myqueue = (struct Queue *)queue;
struct QueueNode * mydata = (struct QueueNode *) data;
//插入新的节点
myqueue->pTail->next = mydata;
mydata->next = NULL;
myqueue->pTail = mydata;
myqueue->m_size++;
}
//出队
void pop_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return;
}
struct Queue * myqueue = (struct Queue *)queue;
if (myqueue->m_size <= 0)
{
return;
}
//第一个有数据的节点
struct QueueNode * pFirst = myqueue->pHeader.next;
//更新指向
myqueue->pHeader.next = pFirst->next;
myqueue->m_size--;
}
//返回队头
LinkQueue front_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct Queue * myqueue = (struct Queue *)queue;
return myqueue->pHeader.next;
}
//返回队尾
LinkQueue back_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct Queue * myqueue = (struct Queue *)queue;
return myqueue->pTail;
}
//返回队列大小
int size_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
struct Queue * myqueue = (struct Queue *)queue;
return myqueue->m_size;
}
//销毁队列
void destroy_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return;
}
free(queue);
queue = NULL;
}
测试
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include "LinkQueue.h"
//测试队列
typedef struct Person{
void * node;
char name[64];
int age;
}Person;
void test01()
{
//初始化队列
LinkQueue queue = Init_LinkQueue();
//准备数据
Person p1 = { NULL,"aaa", 15 };
Person p2 = { NULL, "bbb", 16 };
Person p3 = { NULL, "ccc", 17 };
Person p4 = { NULL, "ddd", 18 };
Person p5 = { NULL, "eee", 19 };
//入队
push_LinkQueue(queue, &p1);
push_LinkQueue(queue, &p2);
push_LinkQueue(queue, &p3);
push_LinkQueue(queue, &p4);
push_LinkQueue(queue, &p5);
Person* p = (Person*)front_LinkQueue(queue);
printf("%s %d\n", p->name, p->age);
Person* pp = (Person*)front_LinkQueue(queue);
printf("%s %d\n", pp->name, pp->age);
int size = size_LinkQueue(queue);
printf("%d\n", size);
}
int main()
{
test01();
return 0;
}