数据结构与算法(C语言版)__双向链表

链表有单向链表也有双向链表,双向链表既可以下一个,也可以上一个。
双向链表在一个节点里至少有三个域,左链域(llink),右链域(rlink),数据域(data)

双向链表也可以做成循环链表,可以有表头结构。
这里写图片描述

这里写图片描述
今天我们做一个双向链表,但是不是循环链表:

#include<iostream>

using namespace std;

class DblList;//

class DblListNode{
    friend class DblList;
public:
    int data;
    DblListNode *llink, *rlink;

};

class DblList{
public:
    DblList(){
        first = new DblListNode();
        first->llink = first->rlink = first;
    }
    void Insert(DblListNode*, DblListNode*);
    void Delete(DblListNode*);
    DblListNode *first;
};

//p是新的节点,插入到x的右边
void DblList::Insert(DblListNode *p, DblListNode*x){
    p->llink = x;
    p->rlink = x->rlink;
    x->rlink->llink = p;
    x->rlink = p;
}

void DblList::Delete(DblListNode *x){
    if (x == first)
        cout << "Deletion of head node not permitted." << endl;
    else{
        x->llink->rlink = x->rlink;
        x->rlink->llink = x->llink;
        delete x;
    }
}
int main(){
    cout << "Hello,双向链表!" << endl;
    DblList intList;
    DblListNode *node1, *node2, *node3, *node4, *node5;
    node1 = new DblListNode();
    node2 = new DblListNode();
    node3 = new DblListNode();
    node4 = new DblListNode();
    node5 = new DblListNode();
    node1->data = 10;
    node2->data = 20;
    node3->data = 30;
    node4->data = 40;
    node5->data = 50;
    intList.Insert(node1, intList.first);
    intList.Insert(node2, intList.first);
    intList.Insert(node3, intList.first);
    intList.Insert(node4, intList.first);
    intList.Insert(node5, intList.first);
    intList.Delete(node2);

    cout << intList.first->rlink->data << endl;
    cout << intList.first->rlink->rlink -> data << endl;
    cout << intList.first->rlink->rlink->rlink->data << endl;
    cout << intList.first->rlink->rlink->rlink->rlink->data << endl;
    cout << intList.first->rlink->rlink->rlink->rlink->llink->data << endl;
    cout << intList.first->rlink->rlink->rlink->rlink->llink->llink->data << endl;
    system("pause");
    return 0;
}

总结:双向链表比较灵活,所以用起来比较方便,这个例子比较简单,在插入节点是要调整指针,在删除节点时也要调整指针,主要delete和new对应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值