数据结构(三):线性表的链式存储结构

来源:互联网 发布:中国突破第一岛链 知乎 编辑:程序博客网 时间:2024/06/07 03:11

双链表的特点

双链表中的每个节点有两个指针域, 一个指向其后继节点,另一个指向其前驱节点。
所以相对单链表来说,在双链表中访问一个节点的前后的节点更为方便

双链表的节点类型

对于双链表,采用类似于单链表的节点类型定义

//模板节点类型template <typename T>struct DLinkList{    T data;    DLinkList<T> *prior;    //前驱指针     DLinkList<T> *next; }; 

双链表的基本运算方法

在双链表中,有些运算(如求长度、去元素、查找元素等算法)与单链表的相应算法是相同的。
不同的是, 在单链表中进行插入删除时涉及前后节点的一个指针域的变化。
而在双链表中,结点的插入和删除操作涉及前后结点的两个指针域的变化。

 //双链表类模板  template <typename T> class DLinkListClass {    DLinkList<T>* dhead;        //双链表表头指针public:    DLinkListClass<T>();    //构造函数, 创建一个空栓链表    ~DLinkListClass<T>();  //析构函数,销毁双链表    void CreateListF(T a[], int n); //头插法建表    void CreateListR(T a[], int n); //尾插法建表     bool ListInsert(int i , T e);   //插入数据元素    bool ListDelete(int i);         //删除数据元素     void DispList();                //遍历显示链表 public: //友元函数     template<typename A>    friend bool Delnode(DLinkListClass<A> &L);  //删除第一个值为x的节点     template<typename A>    friend bool Delmaxnode(DLinkListClass<A> &L);   //删除第一个值最大的节点   }; 

实现代码

template<typename A>bool Delnode(DLinkListClass<A> &L)  //删除第一个值为x的节点 {    DLinkList<A> *p= L.dhead->next, *pre;    while(p != NULL)        p= p->next;    if(p == NULL) return false;    else    {        pre = p->prior;        if(p->next != NULL)            p->next->prior = pre;        pre->next = p->next;        delete p;        return true;    }}template<typename A>bool Delmaxnode(DLinkListClass<A> &L)   //删除第一个值最大的节点 {    DLinkList<A> *p = L.dhead->next, *maxp = p, *pre;    while(p != NULL)    {        if(p->data > maxp->data)            maxp = p;        p = p->next;     }      pre = maxp->prior;     if(maxp->next != NULL)        maxp->next->prior = pre;    pre->next = maxp->next;    delete maxp;}//构造函数 template<typename T>DLinkListClass<T>::DLinkListClass(){    dhead = new DLinkList<T>();    dhead->next = NULL;    dhead->prior = NULL;}//析构函数 template<typename T>DLinkListClass<T>::~DLinkListClass<T>(){    DLinkList<T> *p, *q;    p = dhead;    q = p->next;    while(q != NULL)    {        delete p;        p = q;        q = q->next;    }    delete p;}//头插法template<typename T>void DLinkListClass<T>:: CreateListF(T a[], int n){    DLinkList<T> *s;    int i;    for(i = 0; i < n; i++)    {        s = new DLinkList<T>();        s->data = a[i];        s->next = dhead->next;        if(dhead->next != NULL)            dhead->next->prior = s;        dhead->next = s;        s->prior = dhead;    }}//尾插法template<typename T>void DLinkListClass<T>:: CreateListR(T a[], int n){    DLinkList<T> *s, *r;    int i;    r = dhead;    for(i = 0; i < n; i++)    {        s = new DLinkList<T>();        s->data = a[i];        r->next = s;        s->prior = r;        r = s;    }    r->next = NULL;}//插入数据元素template<typename T>bool DLinkListClass<T>::ListInsert(int i, T e){    int j =0;    DLinkList<T> *s, *p = dhead;    while(j < i-1 && p != NULL)    {        j++;        p = p->next;    }    if(p == NULL) return false;    else    {        s = new DLinkList<T>();        s->data = e;        s->next = p->next;        if(p->next != NULL)            p->next->prior =s;        s->prior = p;        p->next = s;        return true;    }}//删除数据元素template<typename T>bool DLinkListClass<T>::ListDelete(int i){    int j =0;    DLinkList<T> *q, *p = dhead;    while(j < i-1 && p != NULL)    {        j++;        p = p->next;    }    if(p == NULL) return false;    else    {        q = p->next;        if(q == NULL) return false;        p->next = q->next;        if(p->next != NULL)            p->next->prior = p;        delete q;        return true;    }}//遍历显示链表template <typename T>void DLinkListClass<T>::DispList(){    DLinkList<T> *p = dhead->next;    while(p!= NULL)    {        cout << p->data << " ";        p = p->next;    }}int main(){    int a[5] = {1,2,3,4,5};    char b[5] = {'a', 'b', 'c','d','e'};    DLinkListClass<int> Link1;    DLinkListClass<char> Link2;    Link1.CreateListF(a, 5);    Link2.CreateListR(b, 5);    Link1.ListInsert(3, 55);    Link2.ListDelete(3);    cout << "头插法\n";    Link1.DispList();    Delmaxnode(Link1);    cout << "\nDelmaxnode\n";    Link1.DispList();    cout << "\n尾插法\n";    Link2.DispList();    return 0;}

本人github链接: https://github.com/ITMasterC 欢迎来共同探讨,C++,cocos2dx游戏,数据结构,C语言实现小游戏代码…………

0 0
原创粉丝点击