《数据结构——链式队列》

本文详细介绍了链式队列的概念,包括两种不同的实现方式,并指出它们的不足。作者提出使用单独的尾指针来优化链式队列的操作,提高了效率。接着,展示了链式队列的C语言实现,包括创建、判空、入队、遍历、出队和销毁等关键函数。此外,还提供了示例代码来演示如何使用这些功能。
摘要由CSDN通过智能技术生成

目录

一、链式队列

二、代码实现

功能实现↓

功能

结构体

linkqueue.h

linkqueue.c

main.c


一、链式队列

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值