队列实现 (双向循环链表 C++)
队列是非常easy的。可是用数组实现可能更好点。
。
(事实上我认为数组在多个队列的时候更难)
然后我是第一次写双向循环链表。指向太乱了。
我这里是依照自己的想法。建立了一个头节点,一个尾节点,然后依照队列顺序正向插入到两个节点之间。输出和弹出队列的时候从后面操作。
以下上代码:
//
// main.cpp
// queue
//
// Created by Alps on 14-7-28.
// Copyright (c) 2014年 chen. All rights reserved.
// #include <iostream>
#define ElementType int using namespace std; struct Node;
typedef Node* PtrToNode;
typedef PtrToNode Queue; struct Node{
ElementType X;
PtrToNode Pre;
PtrToNode Next;
}; Queue createQueue(void){
Queue Q;
Queue Q2;
Q2 = (Queue)malloc(sizeof(Node));
Q = (Queue)malloc(sizeof(Node));
Q->X = 0;
Q->Next = Q2;
Q->Pre = Q2;
Q2->Next = Q;
Q2->Pre = Q;
return Q;
} int isEmpty(Queue Q){
return Q->Next->Next == Q;
} void intoQueue(Queue Q, ElementType element){
Queue tmp;
Queue tmp1;
tmp1 = (Queue)malloc(sizeof(Node));
// Queue switchTmp;
tmp = (Queue)malloc(sizeof(Node));
tmp->X = element;
tmp->Next = Q->Next;
Q->Next->Pre = tmp;
Q->Next = tmp;
tmp->Pre = Q;
} void outQueue(Queue Q){
Queue tmp;
tmp = Q->Pre->Pre;
Q->Pre->Pre = tmp->Pre;
tmp->Pre->Next = Q->Pre;
free(tmp);
} ElementType headQueue(Queue Q){
if (Q == NULL) {
printf("please create queue first!\n");
return 0;
}
if (!isEmpty(Q)) {
return Q->Pre->Pre->X;
}else{
printf("The queue is empty!\n");
return 0;
}
} int makeEmpty(Queue Q){
if (Q == NULL) {
printf("please create queue first!\n");
return -1;
}
while (!isEmpty(Q)) {
outQueue(Q);
}
return 0;
} void Print(Queue Q){
if (!isEmpty(Q)) {
Queue tmp = Q->Pre->Pre;
while (tmp != Q) {
printf("%d ",tmp->X);
tmp = tmp->Pre;
}
printf("\n");
}
} int main(int argc, const char * argv[])
{
Queue Q = createQueue();
if (isEmpty(Q)) {
printf("The queue is empty !\n");
}else{
printf("The queue is not empty!\n");
}
intoQueue(Q, 2);
intoQueue(Q, 4);
intoQueue(Q, 6);
Print(Q);
outQueue(Q);
Print(Q);
makeEmpty(Q);
Print(Q);
// printf("%d\n",headQueue(Q));
return 0;
}
这个代码比較乱 = = ,多包涵了,我以后想想简单点的方法实现。事实上单链表也能够。可是那样操作就不是O(1)了,所以才用双链表。
队列实现 (双向循环链表 C++)的更多相关文章
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和 ...
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
Linux内核源码分析-链表代码分析 分析人:余旭 分析时间:2005年11月17日星期四 11:40:10 AM 雨 温度:10-11度 编号:1-4 类别:准备工作 Email:yuxu97101 ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- 双向循环链表的Java版本实现
1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...
- c语言编程之双向循环链表
双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...
- Linux内核中的通用双向循环链表
开发中接触Linux越来越多,休息放松之余,免不了翻看翻看神秘的Linux的内核.看到双向链表时,觉得挺有意思的,此文记下. 作为众多基础数据结构中的一员,双向循环链表在各种“教科书”中的实现是相当的 ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- 基于visual Studio2013解决算法导论之025双向循环链表
题目 双向循环链表 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...
随机推荐
- 实现一个JDK代理demo
JDK代理,非常简单地实现了动态代理(首先是实现对应的InvocationHandler:然后,以接口来为被调用目标构建代理对象,代理对象简介运行调用目标,并提供额外逻辑插入) 缺点:它是只能以接口为 ...
- Spark(十) -- Spark Streaming API编程
本文测试的Spark版本是1.3.1 Spark Streaming编程模型: 第一步: 需要一个StreamingContext对象,该对象是Spark Streaming操作的入口 ,而构建一个S ...
- linux上MySQL改动password的各种方法,yc整理
MySQL改动password的各种方法 整理了下面四种在MySQL中改动rootpassword的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -uroot my ...
- Web应用——驾培管理系统之个人管理(作者:小圣)
Web应用--驾培管理系统之个人管理(作者:小圣) 本节博文旨在实现本次Web应用的个人管理功能.能够在登陆后 查看并改动个人信息或者进行password改动.同一时候,在输入的时候进行表单验证,验证 ...
- @Autowired与@Resource的使用方法和差别
一.@Autowired: 1.Spring 2.5 引入了 @Autowired 凝视,它能够对类成员变量.方法及构造函数进行标注,完毕自己主动装配的工作. 通过 @Autowired的使用来消除 ...
- J2SE语言--百度百科
Java2平台包括:标准版(J2SE).企业版(J2EE)和微缩版 (J2ME)三个版本.J2SE,J2ME和J2EE,这也就是SunONE(Open NetEnvironment)体系.J2SE就是 ...
- 【Java】Java_10 常量与变量
1.变量(variable) 1.1 我们通过变量来操纵存储空间中的数据,变量就是指代这个存储空间!空间位置是确定的,但是里面放置什么值不确定! 1.2 Java是一种强类型语言,每个变量都必须声明其 ...
- Nginx主动连接与被动连接的差别
1.主动连接是指Nginx主动发起的同上游server的连接:被动连接是指Nginx接收到的来自client主动发起的连接; 2.主动连接用ngx_peer_connection_t结构体表示:被动连 ...
- 更改字段、添加字段脚本以及sql回滚
--修改字段名称 EXEC sp_rename '[dbo].[SysMenu].[Type]', 'Position', 'COLUMN' --添加字段 alter table [dbo].[Age ...
- radiusd cisco限速问题
http://puck.nether.net/pipermail/cisco-bba/2011-February/001349.html