目录
一、链式队列
1> 链式存储的队列叫做链式队列
2> 实现方式 单链表头插法完成入队、尾删法完成出队:此时链表的头部称为队列的尾部,链表的尾部称为队列的头部 单链表尾插法完成入队、头删法完成出队:此时链表的头部称为队列的头部,链表的尾部称为队列的尾部
3> 以上两种实现方式,都要涉及到对尾部的操作,每次对尾部进行处理时,都要遍历整条链表,不方便
4> 此时,可以单独再定义一个指针,指向尾节点进行操作;这时,头结点指向链表的头部,尾指针指向链表的尾部,操作起来比较方便,没必要每次都要遍历了
二、代码实现
功能实现↓
功能
//创建
linkqueue *create();
//判空
int empty(linkqueue *L);
//入队
int push(linkqueue *L,datatype e);
//遍历队
void show(linkqueue *L);
//出队
int pop(linkqueue *L);
//销毁队
void destory(linkqueue *L);
结构体
typedef int datatype;
typedef struct Node
{
union
{
datatype data; //数据域
int len;//头节点数据域
};
struct Node *next;
}Node;
//定义队列结构体类型
typedef struct
{
Node *head;//表示整条链表
Node *tail;//指向队尾元素
}linkqueue;
linkqueue.h
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
typedef int datatype;
typedef struct Node
{
union
{
datatype data; //数据域
int len;//头节点数据域
};
struct Node *next;
}Node;
//定义队列结构体类型
typedef struct
{
Node *head;//表示整条链表
Node *tail;//指向队尾元素
}linkqueue;
//创建
linkqueue *create();
//判空
int empty(linkqueue *L);
//入队
int push(linkqueue *L,datatype e);
//遍历队
void show(linkqueue *L);
//出队
int pop(linkqueue *L);
//销毁队
void destory(linkqueue *L);
#endif
linkqueue.c
#include<stdlib.h>
#include"linkqueue.h"
#include<stdio.h>
//创建
linkqueue *create()
{
//创建队列
linkqueue *L=(linkqueue *)malloc(sizeof(linkqueue));
if (NULL==L)
{
printf("创建失败\n");
return NULL;
}
L->head=(Node*)malloc(sizeof(Node));
if (NULL==L->head)
{
printf("创建失败\n");
return NULL;
}
//对头指针初始化
L->head->len=0;
L->head->next=NULL;
//将队尾指针指向队头
L->tail=L->head;
printf("创建成功\n");
return L;
}
//判空
int empty(linkqueue *L)
{
return L->head==L->tail?1:0; //1表示空 0表示非空
}
//入队
int push(linkqueue *L,datatype e)
{
//判断逻辑
if (NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
//申请节点保存数据
Node *p=(Node*)malloc(sizeof(Node));
if (NULL==p)
{
printf("节点申请失败\n");
return -2;
}
p->data=e;
p->next=NULL;
//尾插
L->tail->next=p;
//尾指针后移
L->tail=p;
//表的变化
L->head->len++;
printf("入队成功\n");
return 0;
}
//遍历队
void show(linkqueue *L)
{
//逻辑判断
if (NULL==L || empty(L))
{
printf("遍历失败\n");
return ;
}
//遍历队列
printf("队头到队尾元素分别是:");
Node *q=L->head->next;
while(q!=NULL)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
//出队
int pop(linkqueue *L)
{
//判断逻辑
if (NULL==L||empty(L))
{
printf("出队失败\n");
return -1;
}
//出队逻辑
Node *p=L->head->next;//标记第一个节点
L->head->next=p->next;//孤立第一个节点
free(p);
p=NULL;
//判断是否全部出队
if (L->head->next==NULL)
{
L->tail=L->head;
}
//表的变化
L->head->len--;
printf("出队成功\n");
return 0;
}
//销毁队
void destory(linkqueue *L);
main.c
#include<stdlib.h>
#include"linkqueue.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
linkqueue *L=create();
if(NULL==L)
{
return -1;
}
push(L,5);
push(L,2);
push(L,3);
push(L,6);
//遍历队
show(L);
//调用出队函数
pop(L);
return 0;
}