队列的链式存储实现

对外接口

一.初始化队列

二.入队

三.出队

四.返回对头元素

五.返回队尾元素

六.返回队列大小

七.判断队列是否为空

八.销毁队列

linkQueue.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//链表节点
struct QueueNode
{
struct QueueNode*next;//只维护指针域
};
struct LQueue
{
struct QueueNode pHeader//头节点
int m_Size;//队列大小
struct QueueNode*pTail;//维护尾节点的指针
};
typedef void *LiinkQueue;
//初始化队列
LiinkQueue init_LinkQueue();
//入队
push_LiinkQueue(LiinkQueue queue,void data);
//出队
void pop_LiinkQueue(LiinkQueue queue);
//返回队列头元素
void* front_LiinkQueue(LiinkQueue queue);
//返回队列尾元素
void * back_LiinkQueue(LiinkQueue queue);
//返回队列大小
void size_LiinkQueue(LiinkQueue queue);
//判端队伍是否为空
void IsEmpty_LiinkQueue(LiinkQueue queue);
//销毁队列
void destroy_LiinkQueue(LiinkQueue queue);

tset.c

#include"linkQueue.h"
//测试队列
struct Person
{
void*node;
char name[64];
int age;
};
void tset()
{
//初始化队列
LinkQueue queue=init_LinkQueue();
//准备数据
struct Person p1 ={NULL,"aaa",10};
struct Person p1 ={NULL,"bbb",20};
struct Person p1 ={NULL,"ccc",30};
struct Person p1 ={NULL,"ddd",40};
struct Person p1 ={NULL,"eee",50};
//入队
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("对头元素---姓名:%s 年龄:%d\n",pFront->name,pFront->age);
//获取队尾元素
struct Person*pBack=back_LinkQueue(queue);
printf("对尾元素---姓名:%s 年龄:%d\n",pBack->name,pBack->age);
 
//出队
pop_LinkQueue(queue);
}
printf("队列的大小为:%d\n",size_LinkQueue(queue));
}
//判断队列是否为空
//IsEmpty_LinkQueue(queue);
//销毁
destroy_LinkQueue(queue);


}

int main()
{
tset()
system("puase");
return EXIT_SUCCESS;
}

linkQueue.c

#include"linkQueue.h"

//初始化队列
LiinkQueue init_LinkQueue()
{
struct LQueue myQueue=malloc(sizeof(struct LQueue));
if(NULL == myQuieue)
{
return;
}
myQueue->pHeader.next=NULL;
myQueue->m_Size=0;
myQueue->pTail=&myQueue->pheader;//尾节点的初始化就在头节点
return myQueue
}
//入队
push_LiinkQueue(LiinkQueue queue,void data)
{
if(NULL==queue)
{
return;
}
if(NULL==data)
{
return;
}
//还原真实队列结构体
struct LQueue myQueue=queue;
//取出用户数据的前四个字节
struct LQueue myNode=data
//插入新的节点(更改指针指向)
myQueue->Tail->next=myNode;
myNode->next=NULL;

myQueue->pTail=myNode;
//更新队列大小
myQueue->m_Size++;
}
//出队
void pop_LiinkQueue(LiinkQueue queue)
{
if(NULL==queue)
{
return;
}
struct LQueue myQueue=queue;
if(myQueue->m_Size<=0)
{
return;
}
if(myQueue->m_Size == 1)
{
myQueue->pHeader=NULL;
myQueue->pTail=&myQueue->pHeader;
myQueue->m_Size=0;
return;
}
//建立关系 保存第一个有值元素的节点
struct LQueue pFirst= myQueue->pHeader.next;
//出队 更改指针指向
myQueue->pHeader->next=pFirst->next;
//更新队列大小
myQueue->m_Size--;
}
//返回队列头元素
void* front_LiinkQueue(LiinkQueue queue)
{
if(NULL==queue)
{
return NULL;
}
struct LQueue myQueue=queue;
if(myQueue->m_Size<=0)
{
return NULL;
}
return myQueue->pHeader.next;
}
//返回队列尾元素
void * back_LiinkQueue(LiinkQueue queue)
{
if(NULL==queue)
{
return NULL;
}
struct LQueue myQueue=queue;
if(myQueue->m_Size<=0)
{
return NULL;
}
return myQueue->pTail;
}
//返回队列大小
int size_LiinkQueue(LiinkQueue queue)
{
if(NULL==queue)
{
return NULL;
}
struct LQueue myQueue=queue;
return myQueue->m_Size;

}
//判端队伍是否为空
void IsEmpty_LiinkQueue(LiinkQueue queue)
{
if(NULL==queue)
{
return 1;
}
if(myQueue->m_Size,=0)
{
return 1;
}
return 0;
}
//销毁队列
void destroy_LiinkQueue(LiinkQueue queue)
{
if(NULL==queue)
{
return ;
}
struct LQueue myQueue=queue;
if(myQueue->m_Size<=0)
{
return ;
}
free(queue);
queue=NULL;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值