1. 程式人生 > >c++雙鏈表類模板

c++雙鏈表類模板

#pragma once

#include <iostream>
#include <string>

using namespace std;

template<typename T> class DblList;
template<typename T> class DblNode {
    T info;
    DblNode<T> *llink, *rlink;
public:
    DblNode(T data);
    DblNode();
    T Getinfo() { return info; }

    friend class DblList<T>;
};

template<typename T> DblNode<T>::DblNode() {
    llink = rlink = NULL;
}

template<typename T> DblNode<T>::DblNode(T data) {
    info = data;
    llink = rlink = NULL;
}

template<typename T> class DblList {
    DblNode<T> *head, *current;
public:
    DblList();
    ~DblList();
    void Insert(const T &data);
    DblNode<T> *Remove(DblNode<T> *p);
    void Print();
    int Length();
    DblNode<T> *Find(T data);
    void MakeEmpty();
};

template<typename T> DblList<T>::DblList() {
    head = new DblNode<T>();
    head->rlink = head->llink = head;
    current = NULL;
}

template<typename T> DblList<T>::~DblList() {
    MakeEmpty();
    delete head;
}

template<typename T> void DblList<T>::MakeEmpty() {
    DblNode<T> *tempP;
    while (head->rlink != head) {
        tempP = head->rlink;
        head->rlink = tempP->rlink;
        tempP->rlink->llink = head;
        delete tempP;
    }
    current = NULL;
}

template<typename T> void DblList<T>::Insert(const T &data) {
    current = new DblNode<T>(data);
    current->rlink = head;
    current->llink = head->llink;
    head->llink->rlink = current;
    head->llink = current;
}

template<typename T> DblNode<T> *DblList<T>::Remove(DblNode<T> *p) {
    current = head->rlink;
    while (current != head && current != p)
        current = current->rlink;
    if (current == head)
        current = NULL;
    else {
        p->rlink->llink = p->llink;
        p->llink->rlink = p->rlink;
        p->llink = p->rlink = NULL;
    }

    return current;
}

template<typename T> DblNode<T> *DblList<T>::Find(T data) {
    current = head->rlink;
    while (current != head && current->info != data)
        current = current->rlink;
    if (current == head)
        current = NULL;
    return current;
}

template<typename T> void DblList<T>::Print() {
    current = head->rlink;
    while (current != head) {
        cout << current->info << '\t';
        current = current->rlink;
    }
    cout << endl;
}

template<typename T> int DblList<T>::Length() {
    int count = 0;
    current = head->rlink;
    while (current != head) {
        count++;
        current = current->rlink;
    }
    return count;
}

相關推薦

c++模板

#pragma once #include <iostream> #include <string> using namespace std; template<typename T> class DblList; template&

C++

一、什麼是雙鏈表 雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈連結串列。 二、雙鏈表的基本操作

列表的c++實現(模板,包含順序實現和單鏈)

#ifndef LIST_H_INCLUDED #define LIST_H_INCLUDED #include <iostream> using namespace std; template <class elemType> class List{ public:

資料結構圖文解析之:陣列、單鏈介紹及C++模板實現

0. 資料結構圖文解析系列 1. 線性表簡介 線性表是一種線性結構,它是由零個或多個數據元素構成的有限序列。線性表的特徵是在一個序列中,除了頭尾元素,每個元素都有且只有一個直接前驅,有且只有一個直接後繼,而序列頭元素沒有直接前驅,序列尾元素沒有直接後繼。 資料結構中常見的線性結構有陣列、單鏈表、雙鏈表、迴圈

30.管理的內存釋放

hello 表數據 back 共享 erase 釋放 post 顯示 聲明 1 #include <iostream> 2 #include <list> 3 #include <Windows.h> 4 using n

朱有鵬C語言高階---4.9.12----刪除節點(的完整程式)(12)

朱有鵬C語言高階---4.9.12--雙鏈表--刪除節點(12)   刪除的過程就是一個遍歷的過程。   刪除尾節點   刪除普通節點   程式碼如下: #include <stdio.h> #inc

朱有鵬C語言高階---4.9.11----遍歷節點(11)

朱有鵬C語言高階---4.9.11--雙鏈表--遍歷節點(11)   遍歷節點 (1)雙鏈表是單鏈表的一個父集。雙鏈表中如何完全無視pPrev指標,則雙鏈表就變成了單鏈表。這就決定了雙鏈表的正向遍歷(後向遍歷)和單鏈表是完全相同的。 (2)雙鏈表中因為多了pPrev指標,因

朱有鵬C語言高階---4.9.10----頭插入和尾插入(10)

朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)   尾插入:   頭插入:   注意下面的程式碼中,insert_head()函式裡面語句的順序,第一語句和第二語句的順序可以互相調換,但是第一語句和第二語句要在

朱有鵬C語言高階---4.9.9----引入和實現(9)

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)   單鏈表的侷限性 (1)單鏈表是對陣列的一個擴充套件,解決了陣列的大小比較死板不容易擴充套件的問題。使用堆記憶體來儲存資料,將資料分散到各個節點之間,其各個節點在記憶體中可以不相連,節點之間通過指標進行單向連線。

C++資料結構

《資料結構》實驗二:                 線性表綜合實驗 一.實驗目的  &nbs

C 實現

DoublyLinkedList.h #pragma once // 新建雙向連結串列。成功,返回0;否則,返回-1。 extern int DLink_Create(); // 連結串列大小 extern int DLink_Size(); //

資料結構之----增刪改查(C語言)

原始碼在部落格裡可下載,1C幣。或者找Q:128550014要程式碼 一、匯入標頭檔案 #include<stdlib.h> #include<stdio.h> 二、結構體的定義 //定義一個結構體,用於表示雙鏈表的一個節點 typed

C 語言例項11——刪除

/*雙鏈表的刪除 ** 把一個值插入到雙鏈表,rootp是一個指向根節點的指標 ** del 是指向欲移除節點的指標 ** 返回值: ** 如果連結串列不包含移除的節點,函式就返回假,否則返回真。 */ int dll_remove(Node *rootp, Node *de

C 語言例項10——插入

/*雙鏈表的插入 ** 把一個值插入到雙鏈表,rootp是一個指向根節點的指標 ** value 是欲插入的新值 ** 返回值:如果欲插入的值已存在連結串列中,函式返回0; ** 如果記憶體不足導致無法插入,函式返回-1;,如果插入成功,函式返回1; */ int dll_

資料結構——線性:順序、單鏈C++)

內容概要:​​​​​​​ 1.程式碼部分: 線性表抽象類 順序表類 單鏈表類 雙鏈表類 主函式 2.基本概念及注意事項 程式碼(測試環境VS2017): //線性表ADT類的定義:ADT_List.h template <typena

陣列、單鏈介紹 以及 雙向連結串列的C/C++/Java實現

1 #include <stdio.h> 2 #include <malloc.h> 3 4 /** 5 * C 語言實現的雙向連結串列,能儲存任意資料。 6 * 7 * @author skywang 8 * @date 2

c/c++ 迴圈單鏈變迴圈

最近遇到了一個作業題目是:建立一個迴圈連結串列,其節點有前置,資料和下一個三個域,其中資料為資料域,存放元素的有效資訊,下一個域為指標域,指向後繼節點,之前為指標域,它的值為NULL。編寫一個演算法將此表格改為迴圈雙鏈表。建立連結串列節點結構 連結串列節點在Ç語言建立的方法是

Java集合 List實現 LinkedList () 原始碼淺析

Java集合 List實現類 LinkedList 原始碼淺析 文章目錄 Java集合 List實現類 LinkedList 原始碼淺析 一 、簡述(來自JAVA api 註釋) 二、構造方法 三、List方法

C++ 雙向迴圈連結串列(簡稱:

一、概念     1.在雙鏈表中的每個結點應有兩個連結指標:               lLink -> 指向前驅結點&nb

C語言 有序實現插入、刪除、列印(正反)等簡單操作

1.雙鏈表與單鏈表的區別主要是在於雙鏈表中,每個節點都包含兩個指標——指向前一個節點的指標,和指向後一個節點的指標。這就便於我們從任何方向遍歷整個連結串列。 下面是節點型別的說明: typedef