创建双向链表类,该类有默认构造函数、类的拷贝函数、类的、实现链表添加数据、升序排序、查找链表中某个节点及删除链表中某个节点的操作

代码实现:

#include<iostream>
#include<string.h>
using namespace std; typedef int ElemData; struct node{ //节点类
ElemData data;
node *next;
node *prev;
}; class LinkList //双向链表类
{
public:
node *head;//指向头结点
node *tail;//指向尾节点
int len;//链表长度
public:
LinkList();//构造函数
LinkList(const LinkList &l);//拷贝函数
~LinkList();//析构函数
void addNode(ElemData data);//往尾部添加元素
void upSort();//升序排序
void findNode(int n);//查找某个节点
void delNode(int n);//删除某个节点
void showNode();//输出所有节点数据
}; LinkList::LinkList()
{
head = NULL;
tail = NULL;
len = ;
} LinkList::LinkList(const LinkList &l)
{
if(l.head!=NULL)
{
node *pHc = l.head;
head = new node();//为节点申请空间
head->data = pHc->data;
len++;
pHc = pHc->next;
node *pH = head;
while(pHc!=l.tail)
{
pH->next = new node();
len++;
pH->data = pHc->data;
pHc = pHc->next;
}
}
else
{
head=tail=NULL;
len = ;
}
}
LinkList::~LinkList()
{
node *bgn = head;
while(head!=tail)
{
head = head->next;
delete bgn;//释放内存
bgn = head;
}
len = ;
} void LinkList::addNode(ElemData data)
{
if(head==NULL)
{
head = new node();
head->data = data;
len++;
tail = head;
}
else
{
tail->next = new node();
tail->next->data = data;
len++;
tail->next->prev = tail;
tail = tail -> next;
}
} void LinkList::showNode()
{
node *p;
p=head;
if(p==NULL)
cout<<"List id empty"<<endl;
else
{
while(p!=tail->next)
{
cout<<p->data<<" ";
p = p ->next;
}
cout<<endl;
}
} void LinkList::upSort()
{
node *p,*q;
ElemData temp;
for(p=head;p!=tail->next;p=p->next)
{
for(q=p->next;q!=tail->next;q=q->next)
{
if(p->data>q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
}
void LinkList::findNode(int n)
{
node *p;
p = head;
if(n>len)
cout<<"超出链表长度";
else
{
for(int i=;i<n;i++)
{
p = p->next;
}
cout<<"该节点是:"<<p->data<<endl;
}
}
void LinkList::delNode(int n)
{
node *p,*q;
p = head;
q = head->next;
if(n>len)
cout<<"超出链表长度";
else
{
for(int i=;i<n;i++)
{
p = p->next;
q = q->next;
}
p->next = q->next;
q->next->prev = p;
delete q;
}
} int main()
{
int n;
LinkList lin;
cout<<"插入节点:"<<endl;
lin.addNode();
lin.addNode();
lin.addNode();
lin.addNode();
lin.addNode();
lin.addNode();
lin.addNode();
lin.addNode();
lin.showNode();
lin.upSort();
cout<<"输出所有节点:"<<endl;
lin.showNode();
cout<<"输入要查找第几个节点:"<<endl;
cin>>n;
lin.findNode(n);
cout<<"输入要删除第几个节点:"<<endl;
cin>>n;
lin.delNode(n);
lin.showNode();
return ;
}

实现效果图:

C++编写双向链表的更多相关文章

  1. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  2. 二元查找树转变成排序的双向链表之C#算法实现

    此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...

  3. Java编写高质量代码改善程序的151个建议

    第一章  Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...

  4. C语言一个双向链表的实现

    首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下: #ifndef DList_H #define DList_H typedef int Item; typedef struct ...

  5. 玩转C线性表和单向链表之Linux双向链表优化

    前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...

  6. c/c++ 线性表之双向链表

    c/c++ 线性表之双向链表 线性表之双向链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,每个节点的before都指向前一个节点,最后一个节点的下一个节点是NULL. 真实 ...

  7. Linux 内核里的数据结构:双向链表

    原文:https://blog.csdn.net/qq_33487044/article/details/78827260 双向链表 Linux 内核自己实现了双向链表,可以在 include/lin ...

  8. 编写高质量java代码151个建议

    http://blog.csdn.net/aishangyutian12/article/details/52699938 第一章  Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混 ...

  9. 【Java】 大话数据结构(5) 线性表之双向链表

    本文根据<大话数据结构>一书,实现了Java版的双向链表. 在每个数据结点中都有两个指针,分别指向直接后继和直接前驱,这样的链表称为双向链表. 双向链表的结构如图所示: 查找元素可以根据元 ...

随机推荐

  1. 7.31实习培训日志-docker sql

    docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...

  2. 如何保持blog的高质量(相对于自己的进步而言的)

    多写! 多改!! 多删!!!

  3. Fetch超时设置和终止请求

    1.基本使用 Fetch 是一个新的端获取资源的接口,用于替换笨重繁琐XMLHttpRequest.它有了Request 和 Response 以及Headers对象的概念,与后端语言请求资源更接近. ...

  4. linux网络基础-网卡bonding技术

    1.bondingbonding(绑定)是一种linux系统下的网卡绑定技术,可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是 ...

  5. Hadoop WordCount单词计数原理

    计算文件中出现每个单词的频数 输入结果按照字母顺序进行排序 编写WordCount.java 包含Mapper类和Reducer类 编译WordCount.java javac -classpath ...

  6. [Django笔记] Apache + mod-wsgi 环境部署所遇到的各种问题总结

    在一台CentOS7机器上配置Django+apache运行环境 Django安装 python2 or python3 ? 一般情况下Linux系统都有自带python2,本机CentOS7上的是p ...

  7. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  8. 前端实现Tab切换栏

    tab切换,所需的 UI 只有两组元素 - Header 和 Tab,下面介绍几种不同的实现方法和他们的优缺点 本文主要说一些 CSS 的实现方法.最好的方法是 第四种 => label + i ...

  9. 3、kvm配置vnc

    配置kvm通过vnc访问 virsh edit privi-server 添加如下配置: <graphics type='vnc' port='5901' autoport='no' liste ...

  10. Java面向对象_对象数组

    今天学习了对象数组,写点东西总结一下.废话不多说,啥是对象数组呢? 对象数组的概念是这么讲的,对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组. 举个例子,使用对象数 ...