数据结构双向链表C++实现

#include <iostream>
#include <stdexcept>
using namespace std;
template<class ElemType>
class dblist
{
public:
    dblist();               //构造函数
    ~dblist();              //析构函数
    bool insert(int pos, ElemType e); //在pos位置插入e,插入成功返回true。否则返回false
    bool del(int pos, ElemType &e);   //在pos位置删除元素,用e返回
    bool del(int pos);   //在pos位置删除元素,用e返回
    bool empty() const;               //判断链表是否为空
    int  length() const;              //返回链表的长度
    ElemType& operator[] (int index) throw(out_of_range);//返回index位置的值
private:
    class dbnode           //结点类型
    {
    public:
        dbnode() {}
        dbnode(ElemType elem, dbnode *pre, dbnode *nex) : data(elem), prev(pre), next(nex){}    //构造函数
        ElemType data;          //结点数据
        dbnode *prev;           //前驱结点
        dbnode *next;           //后继结点
    };
    dbnode *head;           //定义一个头结点
    int len;             //链表的长度
};
template<class ElemType>
dblist<ElemType>::dblist() : len(0)
{
    head = new dbnode();
    head -> prev = head;
    head -> next = head;
}
template<class ElemType>
dblist<ElemType>::~dblist()
{
    head -> prev -> next = NULL; //断开循环链表的链接。
    dbnode *p;
 while(head -> next)
    {
        p = head -> next;
        head -> next = head -> next -> next;
        delete p;
    }
    delete head;
}
template<class ElemType>
bool dblist<ElemType>::insert(int pos, ElemType e)
{
    if(pos < 0 || pos > len)
        return false;
    dbnode *temp = head;
    for(int i = 0; i < pos; ++i)
        temp = temp -> next;
    dbnode *new_node = new dbnode(e, temp, temp -> next);
    new_node -> prev -> next = new_node;
    new_node -> next -> prev = new_node;
    ++len;
    return true;
}
template<class ElemType>
bool dblist<ElemType>::del(int pos, ElemType &e)
{
    if(pos < 0 || pos >= len)
        return false;
    dbnode *temp = head;
    for(int i = 0; i <= pos; ++i)
        temp = temp -> next;
    temp -> prev -> next = temp -> next;
    temp -> next -> prev = temp -> prev;
    e = temp -> data;
    delete temp;
    --len;
    return true;
}
template<class ElemType>
bool dblist<ElemType>::del(int pos)
{
    ElemType e;
    del(pos, e);
}
template<class ElemType>
bool dblist<ElemType>::empty() const
{
    return len == 0;
}
template<class ElemType>
int  dblist<ElemType>::length() const
{
    return len;
}
template<class ElemType>
ElemType& dblist<ElemType>::operator[] (int index) throw(out_of_range)
{
    if(index < 0 || index >= len)
        throw out_of_range("out of range");
    dbnode *temp = head;
    for(int i = 0; i <= index; ++i)
        temp = temp -> next;
    return temp -> data;
}
int main()
{
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
双向链表是一种常见的数据结构,与单向链表相比,它每个节点都有两个指针,分别指向前驱节点和后继节点。这样,双向链表可以实现双向遍历,插入和删除操作也更加方便。 以下是用C语言实现双向链表的代码: ```c #include <stdio.h> #include <stdlib.h> // 双向链表节点结构体 typedef struct ListNode { int val; struct ListNode *prev; struct ListNode *next; } ListNode; // 创建双向链表节点 ListNode *createNode(int val) { ListNode *node = (ListNode *)malloc(sizeof(ListNode)); node->val = val; node->prev = NULL; node->next = NULL; return node; } // 插入节点到双向链表头部 ListNode *insertAtHead(ListNode *head, int val) { ListNode *node = createNode(val); if (head == NULL) { head = node; } else { node->next = head; head->prev = node; head = node; } return head; } // 插入节点到双向链表尾部 ListNode *insertAtTail(ListNode *head, int val) { ListNode *node = createNode(val); if (head == NULL) { head = node; } else { ListNode *cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = node; node->prev = cur; } return head; } // 删除双向链表中的节点 ListNode *deleteNode(ListNode *head, int val) { if (head == NULL) { return NULL; } ListNode *cur = head; while (cur != NULL && cur->val != val) { cur = cur->next; } if (cur == NULL) { return head; } if (cur == head) { head = head->next; if (head != NULL) { head->prev = NULL; } } else { cur->prev->next = cur->next; if (cur->next != NULL) { cur->next->prev = cur->prev; } } free(cur); return head; } // 打印双向链表 void printList(ListNode *head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } // 主函数 int main() { ListNode *head = NULL; head = insertAtHead(head, 1); head = insertAtHead(head, 2); head = insertAtTail(head, 3); printList(head); // 2 1 3 head = deleteNode(head, 2); printList(head); // 1 3 head = deleteNode(head, 3); printList(head); // 1 head = deleteNode(head, 1); printList(head); // return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值