双向链表——c++实现

总是用c来写总感觉怪无聊的,索性就换个语言来试一试,这次用c++

//是的你没有看错,我要用c++来写了,只用c多无聊啊
typedef class DoubleLinkedListNode *DLNode;
class DoubleLinkedListNode
{
public:
    ElementType info;
    DLNode next,pre;
public:
    DoubleLinkedListNode()//构造函数
    {
        next = NULL;//指针初始化
        pre = NULL;
    }
    DoubleLinkedListNode(ElementType x;DLNode n = NULL,DLNode p = NULL)
    {
        info = x;//构造时赋值
        next = n;
        pre = p;
    }
}
class DoubleLinkedList
{
private:
    PtrToNode head;//头指针
    PtrToNode tail;//尾指针
public:
    //构造函数
    DoubleLinkedList()
    {
        head = NULL;
        tail = NULL;
    }
    //析构函数
    ~DoubleLinkedList();
    //插入节点(以个数索引插入)
    bool insert(int index,ElementType data);
    //插入节点(以地址为索引)
    bool insert(PtrToNode p,ElementType data);
    //尾部追加节点
    bool appendTail(ElementType x);
    //头部追加节点
    bool appendHead(ElementType x);
    //从头部删除节点
    ElementType deleteHead();
    //从尾部删除节点
    ElementType deleteTail();
    //以存储值为标记删除节点
    bool deleteNode(ElementType x);
    //判断链表是否为空
    bool isEmpty();
    //打印链表
    void printList();
}
DoubleLinkedList::~DoubleLinkedList()
{
    PtrToNode p;
    while(!isEmpty())
    {
        p = head->next;//头节点也会被释放
        delete head;
        head = p;
    }
}
bool DoubleLinkedList::insert(int index,ElementType data)
{
    count = 0;//记录遍历索引
    PtrToNode temp = head;
    while(temp && count != index - 1)//遍历到指定位置前一个节点
    {
        count++;
        temp = temp->next;
    }
    if(temp)//未找到
    {
        reutrn false;
    }
    else//插入节点
    {
        temp->next = temp->next->pre = new DoubleLinkedListNode(data,temp->next,temp);
    }
}
bool DoubleLinkedList::insert(PtrToNode p,ElementType data)
{
    PtrToNode temp = head;
    while(temp && temp->next != p)//遍历到指定节点之前
    {
        temp = temp->next;
    }
    if(temp)
    {
        return false;
    }
    else//插入节点
    {
        temp->next = temp->next->pre = new DoubleLinkedListNode(data,temp->next,temp);
    }
}
bool DoubleLinkedList::appendTail(ElementType x)
{
    if(tail != NULL)//如果链表不为空
    {
        tail->next = new DoubleLinkedListNode(x,tail);//在尾部插入新节点
        tail = tail->next;//尾指针后移
    }
    else//如果链表为空
    {
        head = tail = new DoubleLinkedListNode(x);//建立新节点
    }
}
bool DoubleLinkedList::appendHead(ElementType x)
{
    head = head->pre= new DoubleLinkedListNode(x,NULL,head);//头部插入新节点,头指针指向新节点
    if(tail == 0)//如果是空链表,则头尾指针指向唯一节点
    {
        tail = head = new DoubleLinkedList(x);
    }
}
ElementType DoubleLinkedList::deleteHead()
{
    if(isEmpty())//如果链表为空
    {
        return ERROR;
    }
    ElementType el = head->info;//保存节点值
    PrtToNode temp = head;//临时指向首元节点
    if(head == tail)//只有一个节点
    {
        head = tail = NULL;
    }
    else
    {
        head = head->next;
        head->pre = NULL;
    }
    delete temp;
    return el;
}
ElementType DoubleLinkedList::deleteTail()
{
    if(isEmpty())
    {
        return ERROR;
    }
    int el = tail->info;//保存节点值
    PtrToNode temp = tail;
    if(head == tail)//只有一个节点
    {
        head = tail = NULL;
    }
    else
    {
        tail = tail->pre;
        tail->next = NULL;
    }
    delete temp;
    return el;
}
bool DoubleLinkedList::deleteNode(ElementType x)
{
    if(isEmpty())
    {
        return false;
    }
    PtrToNode temp = head;
    while(temp && temp->info != x)//遍历直到找到该节点
    {
        temp = temp->next;
    }
    if(head = tail)//若只有一个节点
    {
        head = tail = NULL;
        delete temp;
        return true;
    }
    if(temp == head)
    {
        deleteHead();
    }
    if(temp == tail)
    {
        deleteTail();
    }
    if(temp)//若未找到
    {
        return false;
    }
    else
    {
        temp->next->pre = temp->pre;
        temp->pre->next = temp->next;
        delete temp;
        return true;
    }
}
bool DoubleLinkedList::isEmpty()
{
    if(tail == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}
void DoubleLinkedList::printList()
{
    if(isEmpty())
    {
        cout << "List is empty!" << endl;
    }
    else
    {
        PtrToNode temp;
        temp = head;
        while(temp)
        {
            cout << temp->info << endl;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值