双链表

双向链表(Double Linked List)
     双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。

注意:
     ①双链表由头指针head惟一确定的。
     ②带头结点的双链表的某些运算变得方便。
     ③将头结点和尾结点链接起来,为双(向)循环链表。

头文件:
//双链表结点类
template <class T>
class dnode
{
public:
    T data;
    dnode* prior;
    dnode* next;
};

//双链表类
template <class T>
class dlinklist
{
    dnode<T>* head;
public:
    void Initdlinklist();
    void InsertNode(T X, int i = 0);
    dnode<T>* GetNode(int i);
    void DeleteNode(int i);
};

源文件:
//初始化双链表
template <class T>
void dlinklist<T>::Initdlinklist()
{
    head = (dnode<T>*)malloc(sizeof(dnode<T>));
    head->prior = head;
    head->next = head;
}

//返回指定位置的结点
template <class T>
dnode<T>* dlinklist<T>::GetNode(int i)
{
    int j = 0;
    dnode<T>* p = head;
    while(p->next != head && j<i)
    {
        p = p->next;
        j++;
    }
    if(i == j)
        return p;
    return NULL;
}
//插入结点
template <class T>
void dlinklist<T>::InsertNode(T x, int i)
{
    dnode<T>* p = NULL;
    if(i == 0)
    {
        p = head->prior;
    }
    else
    {
        p = GetNode(i-1);
    }
    if(p == NULL)
    {
        cout<<"error";
        exit(1);
    }
    dnode<T>* data = (dnode<T>*)malloc(sizeof(dnode<T>));
    data->data = x;
    data->prior = p;
    data->next = p->next;
    p->next->prior = data;
    p->next = data;
   
}
//删除结点
template <class T>
void dlinklist<T>::DeleteNode(int i)
{
    dnode<T>* p = GetNode(i);
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值