队列——链表实现

引言:

队列与栈的区别是队列是先进先出的数据结构。为了使得出入队列容易,可以引入队列头指针和队列尾指针。

分析描述:

队列的结点结构。

typedef int QElemType;
typedef struct QNode{
	QElemType	data;
	struct QNode *next;
}QNode, *QueuePtr;

typedef struct{
	QueuePtr	front;//队列的头指针
	QueuePtr	rear;//队列的尾指针
}LinkQueue;
LinkQueue Q;

队列的初始化。

LinkQueue  InitQueue(LinkQueue *Q)
{
	QueuePtr  tmp;
	tmp = (QueuePtr)malloc(sizeof(QNode));
	if(tmp == NULL){
		printf("create queue error.\n");
		return ;
	}
	Q->front = tmp;
	Q->rear = Q->front;
	Q->front->next = NULL;

	return *Q;
}

入队列操作。

void EnQueue(LinkQueue *Q, QElemType e)
{
	QueuePtr	tmp;
	tmp = (QueuePtr)malloc(sizeof(QNode));
	if(tmp == NULL){
		printf("create queue error.\n");
		return ;
	}
	tmp->data = e;
	tmp->next = NULL;
	Q->rear->next = tmp;
	Q->rear = tmp;

	return;
}

出队列操作。

void DeQueue(LinkQueue *Q, QElemType *e)
{
	QueuePtr tmp;
	if(Q->front == Q->rear){
		printf("the queue is empty.\n");
		return ;
	}
	tmp = Q->front->next;
	*e = tmp->data;
	Q->front->next = tmp->next;
	if(Q->rear == tmp)
		Q->rear = Q->front;
	free(tmp);
	return;
}

取队列的头元素。

void GetHead(LinkQueue *Q, QElemType *e)
{
	if(Q->front == Q->rear)
		return;
	*e = Q->front->next->data;
	return ;
}

判断队列是否为空。

int QueueEmpty(LinkQueue *Q)
{
	if(Q->front == Q->rear)
		return TRUE;
	return FALSE;
}

清空队列。

void ClearQueue(LinkQueue *Q)
{
	if(Q->front == Q->rear){
		printf("the queue is empty.\n");
		return;
	}

	while(Q->front->next){
		Q->rear = Q->front->next->next;
		free(Q->front->next);
		Q->front = Q->front->next;
	}
	Q->front->next = NULL;
	Q->rear = Q->front;
	return;
}

求队列的长度。

int QueueLength(LinkQueue Q)
{
	int length = 0;
	LinkQueue Tmp= Q;

	while(Tmp.front != Tmp.rear){
		length++;
		Tmp.front = Tmp.front->next;
	}

	return length - 1;
}

队列——链表实现,布布扣,bubuko.com

时间: 2024-10-17 04:01:49

队列——链表实现的相关文章

算法(第四版)学习笔记之java实现栈和队列(链表实现)

下压堆栈(链表实现): import java.util.Iterator; public class LinkedStack<Item> implements Iterable<Item> { public class Node { Item item; Node next; } private Node frist; private int N = 0; public boolean isEmpty() { return N == 0; } public int size()

php+redis队列链表操作类

php redis队列处理 /** * 队列链表操作类 * */ class QueueModel extends BaseModel { public $redisHandler; //redis 句柄 const QUEUE_LIST_KEY='article_list_queue'; //队列保存键名 const QUEUE_LIST_LEN='article_list_length';//队列长度保存键名 const QUEUE_LIST_LEN_CACHE_TIME=3600; //队

队列链表实现以及有序表的合并

#include<iostream> #include<algorithm> using namespace std; typedef struct Node{ int data; Node *next; }LNode, *LinkList; void Creat(LinkList &L){ L = new Node; L->next = NULL; cout << "你已经成功创建了一个队列" << endl; } voi

redis队列链表使用操作

lpush/rpush:lpush从链表左边插入,rpush从链表右边插入 127.0.0.1:6379> lpush character a (integer) 1 127.0.0.1:6379> rpush character b (integer) 2 127.0.0.1:6379> rpush character c (integer) 3 那么这个链表是a-->b-->c 取出链表中元素 127.0.0.1:6379> lrange character 1 2

数据结构——队列链表实现

队列抽象数据结构之一,遵循FIFO原则,通过在初始化时构造队首和队尾两个引用(指针)指向一个空节点,作为空队列的标志 package com.shine.test.datastruct; import java.util.EmptyStackException; public class LinkQueue<E> { private Node front,tail; class Node { E data; Node next; } public LinkQueue() { LinkQueue

hdu 6375 度度熊学队列 (链表模拟)

度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作. ①1 u w val 在编号为 u 的队列里加入一个权值为 val 的元素.(w=0 表示加在最前面,w=1 表示加在最后面). ②2 u w 询问编号为 u 的队列里的某个元素并删除它.( w=0 表示询问并操作最前面的元素,w=1 表示最后面) ③3 u v w 把编号为 v 的队列“接在”编号为 u 的队列的最后面.w=0 表示顺序接(队列 v 

c语言基础----堆栈队列链表

堆 堆则是一种经过排序的树形数据结构,常用来实现优先队列,他的特点在于形成某种优先的结构.在计算机经常用到,比如优先队列,或者是优先进程管理. 堆(也叫二叉堆)的性质: 1.任何一个节点,都不大于他的父亲节点. 2.必须是一颗完全二叉树 栈 在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构.假设给定栈 S=(a0,a1,…,an-1),则称 a0 为栈底,an-1 为栈顶.进栈则按照 a0,a1,…,an-1 的顺序进行进栈:而出栈的顺序则需要反过来,按照“后存放的先

链式队列模板

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int status; typedef int elemtype; typedef struct qnode{ elemtype dat

进程-IPC 共享内存和消息队列 (三)

详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%89).md 五 共享内存 5.1. 共享内存简介 共享内存指多个进程共享同一块物理内存,它只能用于同一台机器上的两个进程之间的通信.在进程的逻辑地址空间中有一段地址范围是用来进行内存映射使用的,该段逻辑地址空间可以映射到共享的物理内存地址上(进程空间介绍:http://blog.csdn.net/zhangzhebjut/article/details/3906025