队列实现 (双向循环链表 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 ...
随机推荐
- N的阶层(王道)
题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 样例输入: 4 5 15 样例输出: ...
- 搭建svnserve并创建提交钩子
之前做过很多这个过程了,但每次总有些地方不记得要查资料,现在顺手记录一下,以后好查. 安装svn apt-get install subversion 创建代码仓库 svnadmin create & ...
- java.io.IOException: Attempted read from closed stream. 异常,解决
在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决 原因是EntityUti ...
- jquery 中attr和prop的区别
在jQuery API中也有专门解释: Attributes VS. Properties 在一些特殊的情况下,attributes和properties的区别非常大.在jQuery1.6之前,.at ...
- Python学习笔记(七)函数的使用
python中的函数使用较简单,这里列出值得注意的几点: 内嵌函数 例如: # coding: utf-8 def foo(): def bar(): print 'bar() called. ...
- 实现微信浏览器内打开App Store链接
http://www.ildsea.com/1781.html 微信浏览器是不支持打开App Store 页面的,不知道微信为什么这么做.比如你页面写 <a href=”http://itune ...
- iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐
代码地址如下:http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APNS ...
- IOS下拉放大图片
代码地址如下:http://www.demodashi.com/demo/11623.html 一.实现效果图 现在越来越多的APP中存在下拉放大图片的效果,今天贡献一下我的实现这种方法的原理,和我遇 ...
- 初学spring(二)
1.spring推荐使用接口编程,配合di可以达到层与层之间解耦
- 20181011_matplotlib
import numpy as np import pandas as pd import matplotlib.pyplot as plt df=pd.DataFrame(np.random.ran ...