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

代码实现:

#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. Thinkphp通过phpqrcode实现网址验证码

    第一步: phpqrcode下载第三方扩展包,http://phpqrcode.sourceforge.net/ 第二步: 将扩展包放到/ThinkPHP/Library/Vendor/下的Phpqr ...

  2. C++基础之类和对象一

    (1)类是一种复杂的数据类型,它是抽象数据类型的实现,是数据和相关操作的封装体.类用来确定一类对象的形为,而这些行为是通过类的内部数据和操作来确定的.这些行为是通过一种操作接口来描述的.(2)类的定义 ...

  3. .frm和.ibd恢复数据

    昨日晚上开发告诉我不小心truncate两个表的数据,要求还原.结果在阿里云上找到了备份内容,结果是物理备份文件.frm..ibd.心中一万个草泥马啊..没办法,开始还原吧. 1.查看测试机Mysql ...

  4. 一个APK反编译利器Apktool

    一个APK反编译利器Apktool   APK 本地化 [http://www.andmoto.com/viewthread.php?tid=3873]   说起APK的汉化,目前大部分教程都是让用H ...

  5. centos 7.X关闭防火墙和selinux

    一.关闭防火墙 centos从7开始默认用的是firewalld,这个是基于iptables的,虽然有iptables的核心,但是iptables的服务是没安装的. 所以你只要停止firewalld服 ...

  6. 40.QT-QPropertyAnimationdong和QParallelAnimationGroup动画实现

    简述:QPropertyAnimation (动画类,用来向QObject对象添加动画) 该类的继承框图如下所示: 1.QAbstractAnimation(所有动画的抽象基类) 该抽象类为QProp ...

  7. 谈缓存数据库在web开发中的重要性

    1.开局先抛出如下问题: ①当关系型数据库存放的数据量很大时,每次查询耗时明显变长,那么如何解决该问题? ②当业务要求单用户登录(即同一个账户有一个用户登录后,第二个用户再登录该账户要么挤出之前的登录 ...

  8. webpack安装及使用

    npm run dev 第一次使用的时候用u盘将某些软件带过去. 所以要找到U盘 2.9.x的版本[推荐] 安装:npm install -g vue-cli 检测版本 vue -V/--versio ...

  9. 使用工具自动生成Linq类文件

    第一部:运行cmd. 执行命令 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 第二步:执行 ...

  10. vbox和宿主机共享文件夹

    首先,查看vbox安装的ubuntu是否支持vboxsf模块 sudo modprobe vboxsf dmesg | grep vboxsf 如果没有安装,需要安装vboxsf模块:(如果安装了请跳 ...