C++数据结构之双向链表

#ifndef DLIST_H_INCLUDED
#define DLIST_H_INCLUDED
#include<iostream>
using namespace std;
template <class T>
struct dListNode
{
     T data;
     dListNode<T> *prior;
     dListNode<T> *next;
};

template <class T>
class dLinkList
{
private:
    dListNode<T> *dhead;
public:
    friend struct dListNode<T>;
    dLinkList();
    ~dLinkList();
    void CreatdListF(T a[],int n);
    void CreatdListR(T a[],int n);
    int ListLength();//求双链表中节点个数
    bool GetElem(int i,T &e);//求双链表中某个数据元素值
    int LocateElem(T e);//按元素值查找
    bool ListInsert(int i,T e);//插入数据元素
    bool ListDelete(int i);
    //删除数据元素
    void DispList();
};

template <class T>
dLinkList<T>::dLinkList()
{
    dhead = new dListNode<T>();
    dhead->prior = dhead->next = dhead;
}

//不晓得对不对
template <class T>
dLinkList<T>::~dLinkList()
{
    dListNode<T> *pre,*p;
    pre = dhead;
    p = pre->next;
    while(p!=NULL)
    {
        delete p;
        pre=p;
        p=p->next;
    }
    delete pre;
}
/*有问题
template<class T>
void dLinkList<T>::CreatdListF(T a[],int n)
{
    dListNode<T> *s;
    int i;
    for(i = 0;i < n;i++)
    {
        s = new dListNode<T>();
        s->data = a[i];

        s->next = dhead->next;
        if(dhead->next!=NULL)
        {
            dhead->next->prior = s;
        }
        dhead->next = s;
        s->prior = dhead;
    }

}
*/

template <class T>
void dLinkList<T>::CreatdListR(T a[],int n)
{
    dListNode<T> *s,*r;
    r = dhead;
    int i;
    for(i = 0;i< n;i++)
    {
        s = new dListNode<T>();
        s->data = a[i];
        r->next = s;
        s->prior = r;
        r = s;
    }
    r->next = NULL;
}

template<class T>
void dLinkList<T>::DispList()
{
    dListNode<T> *p;
    p = dhead->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
template <class T>
int dLinkList<T>::ListLength()
{
    int i;
    dListNode<T> *p;
    p = dhead->next;
    while(p!=NULL)
    {
        i++;
        p = p->next;
    }
    cout << "链表长度:"<<i<<endl;
    return i;
}

template <class T>
bool dLinkList<T>::GetElem(int i,T &e)
{
    int j = 1;
    dListNode<T> *p;
    p = dhead->next;
    while(p!=NULL&&j<i)//找到e的逻辑序号j,节点p
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
        return false;
    else
    {
        e = p->data;
        cout << "第"<<i<<"个节点的数据元素值为:"<<e<<endl;
        return e;
    }

}

template<class T>
int dLinkList<T>::LocateElem(T e)//按元素值查找
{
    int i=1;
    dListNode<T> *p;
    p = dhead->next;
    while(p!=NULL&&p->data!=e)//找到元素值e的节点p和逻辑序号i
    {
        i++;
        p = p->next;
    }
    if(p == NULL)
        return false;
    else
    {
        cout << "元素值"<<e<<"的逻辑序号为:"<<i<<endl;
        return i;
    }

}
template<class T>
bool dLinkList<T>::ListInsert(int i,T e)
{
    int j = 0;
    dListNode<T> *s,*p;
    p = dhead;
    while(p!=NULL&&j<i-1)//找到元素值为e的前一个节点p的逻辑序号j
    {
        j++;
        p = p->next;

    }
    if(p == NULL)
        return false;
    else
    {
        s = new dListNode<T>();
        s->data = e;
        s->next = p->next;
        s->prior = p;
        p->next->prior = s;
        p->next = s;
        return true;
    }

}
template <class T>
bool dLinkList<T>::ListDelete(int i)
{
    dListNode<T> *p,*q;
    p = dhead;
    int j = 0;
    while(p!=NULL&&j<i-1)
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
        return false;
    else
    {
        q = p->next;
        if(q == NULL)
            return false;
        else
            p->next = q->next;
        if(q->next!=NULL)
            q->next->prior = p;
        delete q;
        return true;

    }

}

#endif // LIST_H_INCLUDED

#include <iostream>
#include"dlist.h"
using namespace std;

int main()
{
    int e;
    dLinkList<int> L;
    int a[5] = {1,2,3,4,5};
    L.CreatdListR(a,5);
    L.DispList();
    L.ListLength();
    L.GetElem(1,e);
    L.LocateElem(1);
    L.ListInsert(1,8);
    L.DispList();
    L.ListDelete(2);
    L.DispList();
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值