linkQueue.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//链表节点
struct QueueNode
{
struct QueueNode *next;//只维护指针域
};
//队列结构体
struct LQueue
{
//头节点
struct QueueNode pHeader;
//队列大小
int m_Szie;
//维护尾节点的指针
struct QueueNode *pTail;
};
typedef void* LinkQueue;
//初始化队列
LinkQueue init_LinkQueue();
//入队
void push_LinkQueue(LinkQueue queue, void *data);
//出队
void pop_LinkQueue(LinkQueue queue);
//返回队头
void *front_LinkQueue(LinkQueue queue);
//返回队尾
void *back_LinkQueue(LinkQueue queue);
//返回队伍大小
int size_LinkQueue(LinkQueue queue);
//销毁
void destory_LinkQueue(LinkQueue);
linkQueue.c
#include "linkQueue.h"
//初始化队列
LinkQueue init_LinkQueue()
{
struct LQueue * myQueue = malloc(sizeof(struct LQueue));
if (myQueue == NULL)
{
perror("malloc");
return NULL;
}
myQueue->pHeader.next = NULL;
myQueue->m_Szie = 0;
myQueue->pTail = &myQueue->pHeader;//尾节点初始化 就是在头节点
return myQueue;
}
//入队
void push_LinkQueue(LinkQueue queue, void *data)
{
if (queue == NULL || data == NULL)
{
return;
}
// 还原真实队列结构体
struct LQueue * myQueue = queue;
//取出用户数据前四个节点
struct QueueNode *myNode = data;
//插入新节点
myQueue->pTail->next = myNode;
myNode->next = NULL;
myQueue->pTail = myNode;
//更新长度
myQueue->m_Szie++;
return;
}
//出队
void pop_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return;
}
struct LQueue *myQueue = queue;
if (myQueue->m_Szie <= 0)
{
return;
}
//当数据节点只有一个的时候
if (myQueue->m_Szie == 1)
{
myQueue->pHeader.next = NULL;
myQueue->pTail = &myQueue->pHeader;
myQueue->m_Szie = 0;
return;
}
//第一个有数据的节点
struct QueueNode *pFirst = myQueue->pHeader.next;
//更新指针指向
myQueue->pHeader.next = pFirst->next;
//更新长度
myQueue->m_Szie--;
return;
}
//返回队头
void *front_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct LQueue *myQueue = queue;
return myQueue->pHeader.next;
}
//返回队尾
void *back_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct LQueue *myQueue = queue;
return myQueue->pTail;
}
//返回队伍大小
int size_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
struct LQueue *myQueue = queue;
return myQueue->m_Szie;
}
//销毁
void destory_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return;
}
free(queue);
queue = NULL;
return;
}
main.c
#include "linkQueue.h"
//测试数据
struct Person
{
void *data;
char name[64];
int age;
};
void test01()
{
//初始化队列
LinkQueue queue = init_LinkQueue();
//准备数据
struct Person p1 = { NULL,"aaa", 18 };
struct Person p2 = { NULL,"bbb", 19 };
struct Person p3 = { NULL,"ccc", 20 };
struct Person p4 = { NULL,"ddd", 21 };
struct Person p5 = { NULL,"eee", 22 };
//入队
push_LinkQueue(queue, &p1);
push_LinkQueue(queue, &p2);
push_LinkQueue(queue, &p3);
push_LinkQueue(queue, &p4);
push_LinkQueue(queue, &p5);
while (size_LinkQueue(queue) > 0)
{
struct Person *pFront = front_LinkQueue(queue);
printf("pFront:姓名:%s 年龄:%d\n", pFront->name, pFront->age);
struct Person *pBack = back_LinkQueue(queue);
printf("pBack:姓名:%s 年龄:%d\n", pBack->name, pBack->age);
pop_LinkQueue(queue);
}
printf("队列大小:%d\n", size_LinkQueue(queue));
destory_LinkQueue(queue);
return;
}
int main(int argc, char* argv[])
{
test01();
system("pause");
return EXIT_SUCCESS;
}