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

代码实现:

#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. 安装json format插件

    更多工具->扩展->搜索:son format插件 这样得到的json数据以一种美观的样式显示.

  2. C#中的单体设计模式Singleton

    经典的单体设计模式的实现就是 有一个Public的类,在这个类中,有一个私有的private的构造函数. 然后有一个静态方法,这个静态方法返回这个类的实例 举个例子如下 Public class My ...

  3. SDUT2140图结构练习——判断给定图是否存在合法拓扑序列

    拓扑序列的判断方法为不存在有向环,代码实现的话有两种,一种是直接去判断是否存在环,较为难理解一些,另一种的话去判断结点入度,如果存在的入度为0的点大于一个,则该有向图肯定不存在一个确定的拓扑序列 #i ...

  4. 以后尽量不用cin、cout啦

    cout输出有问题(对于double,不同OJ处理的结果不一样),cin读入机制较scanf繁琐.慢!!!!!!!!

  5. C#z中的虚方法,抽象类

    1.虚方法 我在这动物类中定义了一个虚方法 Dosth class Animal { public int Aid; public string Name; public void SetAid(in ...

  6. Note: ENDBOX: Scalable Middlebox Functions Using Client-Side Trusted Execution

    ENDBOX enable secure networking by client-Side trusted execution. What ENDBOX is a scalable middlebo ...

  7. 第三方登录---微信(使用laravel插件)

    转发: https://www.jianshu.com/p/7be757655814 TP框架: http://www.php.cn/php-weizijiaocheng-363509.html

  8. PHP5 $this self parent static的区别

    PHP5 是一具备了大部分面向对象语言的特性的语言,比PHP4 有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说 的不好,请高手见谅. (阅读本文,需要了解PHP5 的面向对 ...

  9. MATLAB求解非线性方程组

    matlab中有专门的solve函数来解决方程组的(a-x)^2+(b-y)^2=e^2(C-x)^2+(D-y)^2=v^2已知a,b,c,d,e,v 值求解 X,Y 请问用 matlab 如何写, ...

  10. Oracle表连接(转)

    表之间的连接 Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联.在后面的叙述中,我们将会使用”row source”来代替”表”,因为使用row source更 ...