双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

由于双向链表可以方便地实现正序和逆序两个方向的插入、查找等功能,在很多算法中经常被使用,

这里用C++构造了一个双向链表,提供了对双向链表的插入、查找、删除节点、排序等功能,其中排序提供了插入排序和冒泡排序两种方式

#include<iostream>
using namespace std;class Node          //组成双向链表的节点
{
public:int data;Node * pNext;Node * pLast;
};class List      //构造一个双向链表
{
private:Node * pHead;Node * pTail;int length;
public:List(int length)    //创建双向链表{this->length=length;pHead=new Node();pHead->pLast=NULL;pTail=pHead;for(int i=0;i<length;i++){Node * temp=new Node();cout<<"please enter the no"<<i+1<<" Node's data:";cin>>temp->data;temp->pNext=NULL;temp->pLast=pTail;pTail->pNext=temp;pTail=temp;}}void traverseList()    //正向遍历{Node * p=pHead->pNext;while(p!=NULL){cout<<p->data<<endl;p=p->pNext;}}void traverseListReturn()    //逆向遍历{Node * p=pTail;while(p->pLast!=NULL){cout<<p->data<<endl;p=p->pLast;}}void sortList()     //冒泡排序{Node * p=new Node();Node * q=new Node();int temp;for(p=pHead->pNext;p->pNext!=NULL;p=p->pNext){for(q=p->pNext;q!=NULL;q=q->pNext){if(q->data<p->data){temp=q->data;q->data=p->data;p->data=temp;}}}}void sortListByInsertWay()        //插入排序{if(pHead->pNext==NULL||pHead->pNext->pNext==NULL){return;}Node * p2=pHead->pNext->pNext;Node * p1=pHead;pHead->pNext->pNext=NULL;while(p2){Node * pN=p2->pNext;while(p1->pNext){if(p2->data<p1->pNext->data){p2->pNext=p1->pNext;p2->pLast=p1;p1->pNext->pLast=p2;p1->pNext=p2;break;}p1=p1->pNext;}if(p1->pNext==NULL){p2->pNext=NULL;p2->pLast=p1;p1->pNext=p2;}p2=pN;}//重新查找pTail的位置Node * pt=pHead;while(pt->pNext){pt=pt->pNext;}pTail=pt;}void changeList(int num,int position)    //修改链表中指定位置的节点{Node * p=pHead->pNext;if(position>length||position<=0){cout<<"over stack !"<<endl;return;}for(int i=0;i<position-1;i++){p=p->pNext;}p->data=num;}void insertList(int num,int position)    //插入数据{Node * p=pHead->pNext;if(position>length||position<=0){cout<<"over stack !"<<endl;return;}for(int i=0;i<position-1;i++){p=p->pNext;}Node * temp=new Node();temp->data=num;temp->pNext=p;temp->pLast=p->pLast;p->pLast->pNext=temp;p->pLast=temp;length++;}void clearList()      //清空{Node * q;Node * p=pHead->pNext;while(p!=NULL){q=p;p=p->pNext;delete q;}p=NULL;q=NULL;}void deleteList(int position)   //删除指定位置的节点{Node * p=pHead->pNext;if(position>length||position<=0){cout<<"over stack !"<<endl;return;}for(int i=0;i<position-1;i++){p=p->pNext;}p->pLast->pNext=p->pNext;p->pNext->pLast=p->pLast;delete p;length--;}int getItemInList(int position)      //查找指定位置的节点{Node * p=pHead->pNext;if(position>length||position<=0){cout<<"over stack !"<<endl;return 0;}for(int i=0;i<position-1;i++){p=p->pNext;}return p->data;}~List(){Node * q;Node * p=pHead->pNext;while(p!=NULL){q=p;p=p->pNext;delete q;}p=NULL;q=NULL;}};int main()
{List l(3);l.traverseList();cout<<"AFTER SORT------------------------------------------------------"<<endl;
//    l.sortList();             //冒泡排序l.sortListByInsertWay();    //插入排序l.traverseList();cout<<"AFTER INSERT-----------------------------------------------------"<<endl;l.insertList(55,1);l.traverseList();cout<<"AFTER DELETE-----------------------------------------------------"<<endl;l.deleteList(1);l.traverseList();cout<<"Return Traverse---------------------------------------------"<<endl;l.traverseListReturn();cout<<"Find the Second Node's data:"<<l.getItemInList(2)<<endl;return 0;
}

基于双向链表的增删改查和排序(C++实现)相关推荐

  1. ORM框架之Mybatis(一)基于mapper配置增删改查

    Mybatis是现在非常流行的SSM框架中的M部分,Mybatis也是一个主流的ORM框架,在项目中用来处理持久层数据. 一.Mybatis框架介绍及使用 1.1 mybatis框架概述: mybat ...

  2. Spring Boot 学习[四] web项目实战训练(增删改查,分页,排序)

    Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等. 几点说明: Spring boot开发web项目,通常打成 ...

  3. Python项目:学生管理系统连接MySQL数据库(增删改查、排序、统计、显示所有信息)

    文章目录 一程序功能(Function) 1. 功能概述 2. 思维导图 二.开始实践 战前准备 定义学生管理系统菜单 定义主函数 1.录入学生信息 2.查找学生信息 3.删除学生信息 4.修改学生信 ...

  4. 基于localstorage实现增删改查功能

    本文以英雄联盟英雄列表中英雄的增删改查为例,介绍localstorage的增删改查功能 该图显示了增差功能,由于我将图片和英雄名字设置为相同的,所以这里输入英雄名字(我将其命名为1~100的数字)图片 ...

  5. MyBatis研习录(06)——基于注解的增删改查操作

    C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...

  6. C语言 双向链表的增删改查

    主题:双向链表 功能:分别实链表的插入.删除.查找.打印(正序.逆序)操作 提示:如果需要进入下一步操作,输入3个ctrl z即可 //主题:双向链表 //功能:分别实链表的插入.删除.查找操作 // ...

  7. oracle删除排序数据库,数据库的数据操作:增删改查和排序

    一.增 1.1[插入单行]insert [into] (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1 ...

  8. JS-9 JS常见内置类;包装类型;Number类方法与实例方法;Math方法;String类常见方法;数组方法(增删改查+遍历+排序);时间Date 构造函数+获取信息+设置信息+获取Unix时间戳

    目录 1_包装类型 2_Number类补充 3_Math对象 4_String类的补充 4.1_基本使用 4.2_修改字符串 4.3_查找.替换字符串 开头与结尾 4.4_获取子字符串 4.5_其他方 ...

  9. Neo4j基础理论、Linux安装与Windows安装以及CQL语法(增删改查、排序、分页、去重)

    一.什么是Neo4j? Neo4j是一个开源的 无Shcema的 基于java开发的 图形数据库,它将结构化数据存储在图中而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引 ...

最新文章

  1. laravel 5.1 Eloquent常见问题
  2. 用 easy-json-schema 代替 json-schema 吧
  3. iOS初级开发笔记:Block回调,实现简单的绑定支付宝逻辑
  4. boost::python::converter::as_to_python_function相关的测试程序
  5. 新CIO:Mark Schwartz认为的领先IT
  6. vb的一些搞怪的操作
  7. windows 平台下,运用 Python 进行简单的文件操作需要用到的函数
  8. 变量在函数内外的作用域 3
  9. Redis学习---(15)Redis 脚本
  10. 50-00-040-配置-Flink Configuration简介
  11. 【Python配置】Win10配置Python3、Numpy、PyCharm、Anaconda
  12. 计算机专业课系列之四:漫谈操作系统之虚拟内存
  13. java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
  14. PyCharm主题更换
  15. VBScript入门篇
  16. python爬虫:获取12306网站火车站对应三字码
  17. word-wrap和word-break,white-space的区别
  18. MAC M1安装VMware 安装windows11
  19. python量化策略—— alpha 三因子策略(1)
  20. End-to-end/hand-crafted的含义(深度学习)

热门文章

  1. sqlserver 删除字段_SQL Server 执行计划缓存
  2. CSS学习03之基本选择器
  3. suse系统_你知道吗,Artifactory还可以管理SUSELinux系统的依赖
  4. python输出二进制数_二进制中1的个数(python)
  5. 前后端分离的跨域解决方案
  6. 人工智能与模式识别 --中国计算机学会推荐国际学术刊物
  7. 金城教授:基于手绘草图的图像检索技术研究
  8. Java 7 源码学习系列(一)——String
  9. 用python写一个简单的推荐系统 1
  10. 卷积Groups Group Convolutions