队列(二)——队列的链表实现方式

1.队列的单向链表的实现方法

return只可以返回一个值,单向循环链表来实现队列的时候可以只保留一个指针,因为保留rear指针能够很方便的表示出front指针,所以保留rear指针。

另外由于链表的第一个结点处理比较特殊,所以在初始化的时候需要单独处理。链表实现的队列思想也是第一个单元作为头结点,不存放数据,rear指针指向的总是尾结点(在循环链表中也就是头结点的上一个结点)。

2.实现方法

用带表头的单向循环链表来实现

#include <stdio.h>
#include <malloc.h>

#define NULL	0

typedef struct sq
{
	int data;
	struct sq *next;
}ElemSN;

ElemSN * in_quence(ElemSN *rear, int val) /*入队函数*/
{
	ElemSN *p;

	p = (ElemSN *)malloc(sizeof(ElemSN));
	p->data = val;
	p->next = rear->next;
	rear->next = p;
	rear = rear->next;
	return rear;
}

int out_quence(ElemSN *rear)
{
	ElemSN *p = rear->next; /*rear的下一个结点是头结点*/
	int dat;

	p = p->next; /*p此时才指向第一个有数据的结点(表头结点的下一个结点)*/
	dat = p->data;
	rear->next->next = p->next; /*等价于head->next = p->next,因为rear的下一个结点是头结点*/
	free(p);

	return dat;
}

void print_quence(ElemSN *rear)
{
	ElemSN *p = rear->next;

	p = p->next; /*指向第一个有数据的单元*/
	do
	{
		printf("%d ", p->data);
		p = p->next;
	}while(p != rear->next);
}

ElemSN * clear_quence(ElemSN *rear)
{
	ElemSN *p, *q;

	p = rear->next;
	while(p != p->next)
	{
		q = p->next;
		p->next = q->next;
		free(q);
	}
	return p;
}

int main()
{
	ElemSN *rear, *s;
	int dat[6] = {1, 2, 3, 4, 5, 6};
	int i;

	rear = (ElemSN *)malloc(sizeof(ElemSN)); /*表头的创建*/
	rear->data = NULL;
	rear->next = rear;
	for(i = 0; i < 6; i++)
	{
		rear = in_quence(rear, dat[i]);
		print_quence(rear);
		printf("\n");
	}
	printf("%d is out quence.\n", out_quence(rear)); /*出队一个元素*/
	print_quence(rear);
	printf("\n");
	rear = clear_quence(rear);

	return 0;
}

程序运行截图:

注意:使用不带表头的循环链表也是可以实现的,但是对于队列为空时rear指针的值为多少,第一个结点如何插入,以及队列中只有一个元素的时候出队的操作都是需要特殊处理的。这里就不再具体实现了,因为带表头的链表相对于不带表头的链表操作上有相当多的方便之处。

队列(二)——队列的链表实现方式,布布扣,bubuko.com

时间: 2024-10-18 05:40:01

队列(二)——队列的链表实现方式的相关文章

队列的数组和链表实现

队列的单链表实现 queue.h #ifndef QUEUE_H_ #define QUEUE_H_ typedef int ElementType; #ifndef _QUEUE_LIST_ #define _QUEUE_LIST_ struct QNode; typedef struct QNode * QNodePtr; struct QNode { ElementType Element; QNodePtr Next; }QNode; typedef struct Node { QNod

iOS-线程之GCD方式---之同步异步和串行队列并行队列之间的关系

GCD方式是Apple官方推荐实现多线程的方式 但在这之前必须理清楚同步,异步,串行队列,并行队列之间的概念. 同步:即当前的执行程序块不会创建一个新的线程,只能在当前线程中执行. 异步:会在当前的线程之外创建一个新的线程,并在新的线程中执行代码块. 首先声明一点,队列是用来存放即将执行的线程体的. 串行队列:串行队列中的线程满足FIFO(First In First Out),并且只有在先出的线程执行完,后续的线程才能出队列执行.(很可能造成APP的假死状态) 并行队列:并行队列也满足FIFO

数据存储的常用结构 堆栈、队列、数组、链表

数据存储的常用结构有:堆栈.队列.数组.链表.我们分别来了解一下: 堆栈,采用该结构的集合,对元素的存取有如下的特点: 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素).例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹. 栈的入口.出口的都是栈的顶端位置 压栈:就是存元素.即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置. 弹栈:就是取元素.即,把栈的顶端位置元素取出,栈中已有元素依次

java:堆栈,队列,枚举,链表

Stack类 栈:(水杯喝水,先进后出) 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表.他按照先进后出的原则存储数据 Enumeration(枚举) 1,hasMoreElements()    测试此枚举是否包含更多的元素 2,nextElements()    如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素 ----------------------------- 代码演示: package day07; import java.util.Date; impor

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

WFQ加权公平队列(每个队列的计算原则与权重比关系)加权效果后转发取证

WFQ加权公平队列(每个队列的计算原则与权重比关系)                                   及加权效果取证 加权公平队列(Weighted FairQueuing),它不允许用户使用MQC语句来手工完成对流量的分类,因为WFQ的分类是自动完成的,它基于每一种不同的流(flow)来分类,然后将不同的flow送入不同的队列.在实施WFQ的队列调度时主要是为了两个目标:一.为不同的数据流提供公平的服务:二.它可以为具备高优先级(较高IP优先级或者DSCP值)的数据提供更多

【队列】队列的分类和实现

队列简介 队列也是一种线性结构.但它只能在表的一端追加元素(这端叫做队尾),另一端删除元素(这端叫做队头) .因此队列是一种FIFO (先进先出)特性的线性数据结构. 从队头删除元素的操作叫做出队,从队尾追加元素的操作叫做入队. 如图是含有n个元素的队列的模型.根据队列的出入元素特点,可以确定,元素a1最先入队,紧接着a2,s3 ... 如果a2要出队,必须等a1出队.a1最先入队,也是最先出队,an最后入队,也是最后出队. 链式队列 链式队列是队列的实现方式之一.链式队列内部使用带头结点的单向

Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列

Atitit.提升软件稳定性---基于数据库实现的持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1. 用一个游标last 来指示 (指针表字段last ),麻烦的,不推荐 1 1.2. (简单,推荐)使用循环次数来指示,每循环加1   (字段cirTimes),order by cirtimes 1 4. 表格设计id, cirTimes,createtime,handlerID,recID,d