头文件
queueLink.h
#ifndef _QUEUELINK_H
#define _QUEUELINK_H
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct node
{
union
{
int len; //头结点的数据域
DataType data; //普通结点的数据域
};
struct node *next;
}Node;
//定义一个链式队列的结构体类型
typedef struct queLink
{
Node *head; //记录对头
Node *tail; //记录队尾
}queueLink,*queueLinkPtr;
//创建
queueLinkPtr create_queueLink();
//判空
int empty_queueLink(queueLinkPtr Q);
//入队(单链尾插)
int push(queueLinkPtr Q,DataType e);
//遍历
void show(queueLinkPtr Q);
//出队(单链头删)
int pop(queueLinkPtr Q);
//队列长度
int size_queueLink(queueLinkPtr Q);
//销毁
void free_queueLink(queueLinkPtr Q);
#endif
源文件
queueLink.c
#include "queueLink.h"
//创建
queueLinkPtr create_queueLink()
{
//申请链式队列结构体堆区空间
queueLinkPtr Q=(queueLinkPtr)malloc(sizeof(queueLink));
if(NULL==Q)
{
printf("失败:create_queueLink申请链式队列结构体堆区空间失败\n");
return NULL;
}
//申请链式队列结点堆区空间
Q->head=(Node*)malloc(sizeof(Node));
if(NULL==Q->head)
{
printf("失败:create_queueLink申请链式队列结点堆区空间失败\n");
free(Q);
Q=NULL;
return NULL;
}
//给链表头结点赋初始值
Q->head->len=0;
Q->head->next=NULL;
Q->tail=Q->head; //空链式队列的队尾是链式队列的头结点
printf("成功:create_queueLink创建链式队列成功\n");
return Q;
}
//判空
int empty_queueLink(queueLinkPtr Q)
{
if(NULL==Q)
{
printf("失败:empty_queueLink判空失败\n");
return -1;
}
return Q->head==Q->tail;
}
//入队(单链尾插)
int push(queueLinkPtr Q,DataType e)
{
if(NULL==Q)
{
printf("失败:push入队失败\n");
return 0;
}
//申请结点 封装数据
Node *p=(Node*)malloc(sizeof(Node));
if(NULL==p)
{
printf("失败:push入队失败\n");
return 0;
}
p->data=e; //空间申请成功,封装数据
p->next=NULL; //入队元素没有后继结点
Q->tail->next=p; //队尾元素的后继指针指向入队元素
Q->tail=p; //链式队列的队尾指向入队元素
Q->head->len++; //队列长度自增
printf("成功:push入队成功\n");
return 1;
}
//遍历
void show(queueLinkPtr Q)
{
if(NULL==Q||empty_queueLink(Q))
{
printf("失败:show遍历失败\n");
return;
}
//定义遍历指针
Node *p=Q->head;
while(p->next!=NULL)
{
p=p->next; //向后遍历一个元素
//输出链式队列每个元素的数据
printf("%d ",p->data);
}
putchar(10); //回车
}
//出队(单链头删)
int pop(queueLinkPtr Q)
{
if(NULL==Q||empty_queueLink(Q))
{
printf("失败:pop出队失败\n");
return 0;
}
//提取第一个结点
Node *p=Q->head->next;
Q->head->next=p->next;
printf("%d出队\n",p->data);
//判断是否出队的是最后一个元素
if(Q->tail==p)
{
Q->tail=Q->head; //队尾元素被删了要重新指向初始值
}
free(p); //释放出队元素
p=NULL; //防止野指针
Q->head->len--; //队列长度自减
return 1;
}
//队列长度
int size_queueLink(queueLinkPtr Q)
{
//判断传入队列是否合法
if(NULL==Q)
{
printf("失败:size_queueLink获取队列长度失败\n");
return -1;
}
return Q->head->len;
}
//销毁
void free_queueLink(queueLinkPtr Q)
{
if(NULL==Q)
{
printf("失败:free_queueLink销毁失败\n");
return;
}
//队列里面有元素时不能直接销毁队列指针,要先把所有元素销毁
while(!empty_queueLink(Q))
{
printf("--销毁出队:");
pop(Q);
}
//销毁头结点
free(Q->head);
Q->head=NULL;
Q->tail=NULL;
//销毁队列指针
free(Q);
Q=NULL; //防止野指针
printf("成功:free_queueLink销毁成功\n");
}
主函数文件(测试函数功能)
main.c
#include "queueLink.h"
int main(int argc, const char *argv[])
{
queueLinkPtr QL=create_queueLink();
printf("判空:%d\n",empty_queueLink(QL));
push(QL,1);
push(QL,2);
push(QL,3);
push(QL,4);
push(QL,5);
show(QL);
pop(QL);
show(QL);
pop(QL);
show(QL);
pop(QL);
show(QL);
pop(QL);
show(QL);
pop(QL);
show(QL); //此时队列为空,会遍历失败
//获取队列长度
printf("队列长度:%d\n",size_queueLink(QL));
push(QL,1);
push(QL,2);
push(QL,3);
push(QL,4);
push(QL,5);
//销毁链式队列
free_queueLink(QL);
return 0;
}
编译测试结果
编译指令:
gcc *.c
运行指令:./a.out
运行结果: