C++编写双向链表
创建双向链表类,该类有默认构造函数、类的拷贝函数、类的、实现链表添加数据、升序排序、查找链表中某个节点及删除链表中某个节点的操作
代码实现:
#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++编写双向链表的更多相关文章
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- 二元查找树转变成排序的双向链表之C#算法实现
此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...
- Java编写高质量代码改善程序的151个建议
第一章 Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...
- C语言一个双向链表的实现
首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下: #ifndef DList_H #define DList_H typedef int Item; typedef struct ...
- 玩转C线性表和单向链表之Linux双向链表优化
前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...
- c/c++ 线性表之双向链表
c/c++ 线性表之双向链表 线性表之双向链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,每个节点的before都指向前一个节点,最后一个节点的下一个节点是NULL. 真实 ...
- Linux 内核里的数据结构:双向链表
原文:https://blog.csdn.net/qq_33487044/article/details/78827260 双向链表 Linux 内核自己实现了双向链表,可以在 include/lin ...
- 编写高质量java代码151个建议
http://blog.csdn.net/aishangyutian12/article/details/52699938 第一章 Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混 ...
- 【Java】 大话数据结构(5) 线性表之双向链表
本文根据<大话数据结构>一书,实现了Java版的双向链表. 在每个数据结点中都有两个指针,分别指向直接后继和直接前驱,这样的链表称为双向链表. 双向链表的结构如图所示: 查找元素可以根据元 ...
随机推荐
- Razor中的 内容标记块语法
在C#中,有两种方法来进行内容块标记 第一种方式 用@: 来标识 @if (true) { @: 测试内容标记块 @DateTime.Now.ToString() } <hr /> 第2种 ...
- 1.3 DVWA亲测sql注入漏洞
LOW等级 我们先输入1 我们加上一个单引号,页面报错 我们看一下源代码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input ...
- Ping++中的AlipaySDK和AlicloudUTDID冲突解决方案
今天维护一个老项目发现阿里框架冲突 问题截图: 解决方案: 去阿里文档中心 https://docs.open.alipay.com/54/104509 重新下载没有UTDID冲突的库 下载SDK解压 ...
- FormsAuthentication.RedirectFromLoginPage 登录
首先讲的这个东西是针对后台数据访问的比如我的后台是admin文件夹.那么我除非登陆成功才可以访问里面的东西.那么除了Session对象判断.和Cookies来判断还能用到FormsAuthentica ...
- java websocket中的ping-pong 机制
参考源码: https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/java/org/java_websocket/cli ...
- Python:列表也能拆包?
前几天,微信学习群里有个小伙伴在看书时遇到了这样一个问题,在群里提问,看下图: 这是常用的 matplotlib 库,只是一般我们调用 plot 方法绘图时,不会去关心它的返回值.然而 plt1, = ...
- -bash: ./bak_1.py: /usr/bin/python^M: bad interpreter: 没有那个文件或目录
在Windows的PyCharm中编写了一个Python文件,然后上传至CentOS中,已经添加执行权限,但是仍然会报如下的错误: 代码如下: #!/usr/bin/python # -*- codi ...
- Eclipse中Android公共库的正确建立及调用方法(转)
转自http://www.cnblogs.com/SkyD/archive/2011/09/01/2161502.html 引言 之前一直头痛于没有办法在多个程序中共享资源,用作公共类库的方法也是使用 ...
- Spring MVC 简述:从MVC框架普遍关注的问题说起
任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想 ...
- Gradle用户使用指南
转载请事先沟通,未经允许,谢绝转载. 1. 新工具介绍(Introduction) 能够复用代码和资源能够构建几种不同版本参数的应用能够配置.扩展.自定义构建过程1.1 为什么选择Gradle(Why ...