思维导图
![](https://i-blog.csdnimg.cn/direct/186537ca677b4b30a4503fa8347cf0d1.png)
实现链式队列的 创建、判空、入队、遍历、出队、计算队列长度、销毁
queueLink.c
#include"queueLink.h"
//创建
queueLinkPtr create()
{
//在堆区申请连队大小的空间
queueLinkPtr QL = (queueLinkPtr)malloc(sizeof(queueLink));
if(NULL == QL)
{
printf("申请链队失败\n");
return NULL;
}
//在堆区申请节点大小的空间
QL->head = (Node *)malloc(sizeof(Node));
if(NULL == QL->head)
{
printf("申请节点失败\n");
free(QL);
return NULL;
}
QL->head->len =0;//头节点数据域为0
QL->head->next=NULL;
QL->tail = QL->head;
printf("创建成功\n");
return QL;
}
//判空
int empty(queueLinkPtr QL)
{
if(NULL == QL)
{
printf("判空失败\n");
return -1;
}
return QL->head == QL->tail;
}
//入队
int push(queueLinkPtr QL,DataType e)
{
if(NULL == QL)
{
printf("入队失败\n");
return 0;
}
//申请节点
Node *p = (Node * )malloc(sizeof(Node));
if(NULL == QL)
{
printf("申请节点失败\n");
return 0;
}
p->data = e;
p->next = NULL;
//入队
QL->tail->next = p;
QL->tail = p;
//链表自增
QL->head->len++;
return 1;
}
//遍历
void show(queueLinkPtr QL)
{
if(NULL == QL || empty(QL))
{
printf("遍历失败\n");
return ;
}
//定义一个遍历的指针
Node *q = QL->head;
while(q->next !=NULL)
{
q=q->next;
printf("%d ",q->data);
}
printf("\n");
}
//出队
int out(queueLinkPtr QL)
{
if(NULL == QL || empty(QL))
{
printf("出队失败\n");
return 0 ;
}
printf("%d出队\n",QL->head->next->data);
QL->head->next = QL->head->next->next;
QL->head->len--;
return 1;
}
//队列长度
int size_queue(queueLinkPtr QL)
{
if(NULL == QL || empty(QL))
{
printf("失败\n");
return -1;
}
return QL->head->len;
}
//销毁
void free_queue(queueLinkPtr QL)
{
if(NULL == QL)
{
printf("销毁失败\n");
return ;
}
free(QL->head);
QL->head = NULL;
free(QL);
QL = NULL;
printf("销毁成功\n");
}
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 queue
{
Node *head;//记录队头
Node *tail;//记录队尾
}queueLink,*queueLinkPtr;
//创建
queueLinkPtr create();
//判空
int empty(queueLinkPtr QL);
//入队
int push(queueLinkPtr QL,DataType e);
//遍历
void show(queueLinkPtr QL);
//出队
int out(queueLinkPtr QL);
//队列长度
int size_queue(queueLinkPtr QL);
//销毁
void free_queue(queueLinkPtr QL);
#endif
main.c
#include"queueLink.h"
int main()
{
//创建
queueLinkPtr QL = create();
//入队
push(QL,10);
push(QL,20);
push(QL,30);
push(QL,40);
push(QL,50);
show(QL);
out(QL);
show(QL);
out(QL);
show(QL);
int a = size_queue(QL);
printf("长度%d\n",a);
free_queue(QL);
}