一个面向对象的双向链表

//An example of a simple double linked list using OOP techniques
#include <iostream>
using namespace std;

struct Node
{
  double value;
  Node *N,*P;
  Node(double y)
  {
      value = y;
      N = P = NULL;
  }
};

class doubleLinkedList
{
  Node *front;
  Node *back;
  public:
  doubleLinkedList()
  {  front = NULL; back = NULL; }
  ~doubleLinkedList(){ destroyList();}
  void appendNodeFront(double x);
  void appendNodeBack(double x);
  void dispNodesForward();
  void dispNodesReverse();
  void destroyList();
};

void doubleLinkedList::appendNodeFront(double x)
  {
        Node *n = new Node(x);
        if( front == NULL)
        {
            front = n;
            back = n;
        }
        else
        {
            front->P = n;
            n->N = front;
            front = n;
        }
  }
  void doubleLinkedList::appendNodeBack(double x)
  {
        Node *n = new Node(x);
        if( back == NULL)
        {
            front = n;
            back = n;
        }
        else
        {
            back->N = n;
            n->P = back;
            back = n;
        }

  }

  void doubleLinkedList::dispNodesForward()
  {
      Node *temp = front;
      cout << "\n\nNodes in forward order:" << endl;
      while(temp != NULL)
      {
         cout << temp->value << "   " ;
         temp = temp->N;
      }
  }
  void doubleLinkedList::dispNodesReverse()
  {
      Node *temp = back;
      cout << "\n\nNodes in reverse order :" << endl;
      while(temp != NULL)
      {
         cout << temp->value << "   " ;
         temp = temp->P;
      }
  }
void doubleLinkedList::destroyList()
{
    Node *T = back;
    while(T != NULL)
    {
        Node *T2 = T;
        T = T->P;
        delete T2;
    }
    front = NULL;
    back = NULL;
}
int main()
{
    doubleLinkedList *list = new doubleLinkedList();
    //append nodes to front of the list
    for( int i = 1 ; i < 4 ; i++)
    list->appendNodeFront(i*1.1);

    list->dispNodesForward();
    list->dispNodesReverse();

    //append nodes to back of the list
    for( int i = 1 ; i < 4 ; i++)
    list->appendNodeBack(11.0 - (1.1 * i));
    cout << endl << endl;
    list->dispNodesForward();
    list->dispNodesReverse();

    cout << endl << endl;
    delete list;
    return 0;
}

/* Program‘s output
Nodes in forward order:
3.3   2.2   1.1

Nodes in reverse order :
1.1   2.2   3.3

Nodes in forward order:
3.3   2.2   1.1   9.9   8.8   7.7

Nodes in reverse order :
7.7   8.8   9.9   1.1   2.2   3.3
*/
时间: 2024-12-12 13:48:24

一个面向对象的双向链表的相关文章

完成一个面向对象设计的方法

有可行性的OOP实施方式: 1.写下你关于程序功能的描述,标记出所有的名词.动词和形容词. 2.从被标记出来的名词中寻找潜在的类定义 3.从被标记出来的动词中确定潜在的方法定义 4.从被标记出来的形容词中寻找潜在的属性 5.把方法和属性分配给对应的类 改进设计: 1.列出一系列用例(程序可能被调用的场景),尽可能覆盖全面 2.设想每个用例的每一步会如何有你设计的程序实现,如果有错误或者遗漏,修正掉.然后继续,知道你满意为止. 以上只是宽泛的概要设计,软件工程中的最起始部分. ---Beginni

[LeetCode] Flatten a Multilevel Doubly Linked List 压平一个多层的双向链表

You are given a doubly linked list which in addition to the next and previous pointers, it could have a child pointer, which may or may not point to a separate doubly linked list. These child lists may have one or more children of their own, and so o

C语言一个双向链表的实现

-- DList.c #include"DList.h" #include<malloc.h> #include<stdlib.h> /*分配值为i的节点,并返回节点地址*/ Position MakeNode(Item i) { PNode p = NULL; p = (PNode)malloc(sizeof(Node)); if(p!=NULL) { p->data = i; p->previous = NULL; p->next = NU

用c语言完成一个双向链表的创建,插入,删除

/*dlist.h*/ #ifndef DList_H #define DList_H typedef  int Item; typedef struct Node * PNode;  //节点指针 typedef PNode Position;  //节点位置 /*定义节点类型*/ typedef struct Node { Item data;      /*数据域*/ PNode previous; /*指向前驱*/ PNode next;     /*指向后继*/ }Node; /*定义

js实现双向链表, 双向链表需要增加一个previous属性

双向链表, 双向链表需要增加一个previous属性 /*双向链表 * */ function Node(element) { this.element = element; this.next = null; this.previous = null;//双向链表在这里需要增加一个previous属性 } function LList() { this.head = new Node("head"); this.find = find; this.insert = insert; t

如何用面向对象的思维去封装一个小型轮播图插件

1.面向对象与面向过程 既然说到面向对象的思维,那就免不了要对面向过程的编程思维与面向对象的思维做一番比较. 笔者有 一段时间天真的认为有一个类,然后new一个对象就是面向对象编程了,现在想想还是太naive了呀. 其实面向对象的编程思维和面向过程的编程思维重要的不是对象和过程,而是思维. 比如说在生活中我们要做一道西红柿炒鸡蛋,很多人的第一反应就是西红柿炒鸡蛋第一步.第二步.第三步应该怎么做,每一步放什么调料.然后在做的过程中找每一步需要的调料.这就是很典型的面向过程的思维方式:怎么做,需要什

二叉查找树转换成排序的双向链表

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何 新的结点,只调整指针的指向. 比如将二元查找树 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 思路:对于树的很多题目,都可以使用递归的方法来处理.这道题目也不例外.我们从最基本的思路来考虑这个题目. 把一个二叉树编程双向链表,最终是一个有序的序列,也就是中序遍历之后的结果,那么当我们采用中序遍历的方式遍历二叉树时,遍历到某个节点,是的前序节点的右

nginx学习六 高级数据结构之双向链表ngx_queue_t

1 ngx_queue_t简介 ngx_queue_t是nginx提供的一个轻量级的双向链表容器,它不负责存储数据,既不提供数据的内存分配,它只有两个指针负责把数据链入链表,它跟stl提供的queue不同,stl提供的queue帮助用户存储数据,用户只需要相容器里添加数据即可,而ngx_queue_t,用户必须自己提供存储数据的内存,并且必须定义一种数据结构把ngx_queue_t包含在其中,然后利用ngx_queue_t提供的函数来进行相应的操作. 2 ngx_queue_t结构及其操作 2.

双向链表的实现

上一篇博文介绍了如何使用C语言实现单链表,这篇博文介绍下双向链表的实现.单链表中每个结点只有一个后驱,而双向链表中每个结点都有一个后驱和前驱(除了第一个结点只有一个后驱,最后一个结点只有一个前驱).双向链表中每个结点具有一个数据域和两个指向前一个结点和后一个结点的指针域.代码的实现: 首先得创建一个结点的结构体:Double_Node typedef struct Double_Node { int data; Double_Node *front; Double_Node *next; }Do