基于双向链表的增删改查和排序(C++实现)
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
由于双向链表可以方便地实现正序和逆序两个方向的插入、查找等功能,在很多算法中经常被使用,
这里用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=;i<length;i++)
- {
- Node * temp=new Node();
- cout<<"please enter the no"<<i+<<" 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<=)
- {
- cout<<"over stack !"<<endl;
- return;
- }
- for(int i=;i<position-;i++)
- {
- p=p->pNext;
- }
- p->data=num;
- }
- void insertList(int num,int position) //插入数据
- {
- Node * p=pHead->pNext;
- if(position>length||position<=)
- {
- cout<<"over stack !"<<endl;
- return;
- }
- for(int i=;i<position-;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<=)
- {
- cout<<"over stack !"<<endl;
- return;
- }
- for(int i=;i<position-;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<=)
- {
- cout<<"over stack !"<<endl;
- return ;
- }
- for(int i=;i<position-;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();
- l.traverseList();
- cout<<"AFTER SORT------------------------------------------------------"<<endl;
- // l.sortList(); //冒泡排序
- l.sortListByInsertWay(); //插入排序
- l.traverseList();
- cout<<"AFTER INSERT-----------------------------------------------------"<<endl;
- l.insertList(,);
- l.traverseList();
- cout<<"AFTER DELETE-----------------------------------------------------"<<endl;
- l.deleteList();
- l.traverseList();
- cout<<"Return Traverse---------------------------------------------"<<endl;
- l.traverseListReturn();
- cout<<"Find the Second Node's data:"<<l.getItemInList()<<endl;
- return ;
- }
基于双向链表的增删改查和排序(C++实现)的更多相关文章
- Mybatis_3.基于注解的增删改查
1.实体类User.java public class User { private int id; private String name; private int age; //getter.se ...
- ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...
- [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...
- node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...
- java实现双向链表的增删改查
双向链表的增删改查 和单链表的操作很像:https://blog.csdn.net/weixin_43304253/article/details/119758276 基本结构 1.增加操作 1.链接 ...
- Node.js、express、mongodb 入门(基于easyui datagrid增删改查)
前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...
- Mybatis实现部门表增删改查以及排序
废话不说,直接开门见山! 需要在WebContent下的lib下导入两个包 mybatis-3.2.5.jar ojdbc6.jar package com.xdl.entity; import ja ...
- Mybatis_2.基于XML的增删改查
1.实体类User.java public class User { private int id; private String name; private int age; //getter.se ...
- 基于django做增删改查组件,分页器组件
增删改查组件 一.Djangoadmin的启发 二.基于Djangoadmin实现数据的增删改查 分页器组件 分页器组件的介绍以及源码解读 补充:源码下载,
随机推荐
- lua MVC框架 Orbit初探
介绍 http://keplerproject.github.io/orbit/ Orbit是lua语言版本的MVC框架. 此框架完全抛弃CGILUA的脚本模型, 支持的应用, 每个应用可以卸载一个单 ...
- file_get_contents抓取远程URL内容
/** * POST URL * @param $url * @param null $post * @return false / string */ public static function ...
- innerHTML
对于innerHTML 属性,几乎所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML.(获取HTML当前标签的起始和结束里面的内容) 下面的例子返回 ...
- ubuntu登陆出现问题
手贱改了用户root权限结果登陆时提示system administrator is not allowed to login from this screen(郁闷勒) 这时可以按ctrl+F2进入 ...
- SVN服务端启动解决方案(2013-12-10 记)
解决每一次开机都得用DOS启动SVN服务,而DOS窗口又无法关闭的情况 1.安装Setup-Subversion-1.8.5.msi搭建好SVN服务端(下载地址:http://subversion. ...
- python入门练习题1
常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...
- CentOS 7下Wireshark捕获USB数据包
1. 软件准备 安装Wireshark # yum install wireshark wireshark-gnome .csharpcode, .csharpcode pre { font-size ...
- 指定页面配置https(apache/tomcat)
apache/tomcat服务器下配置https apache下配置https: 首先在网站根目录下,找到.htaccess文件(如果没有则新建),apache ...
- Android跨进程通信的四种方式
由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...
- Normalize.css 初识
一. 用来干嘛的 一个现代的.准备好了支持 HTML5 技术,并且要替代 CSS Reset 处理样式的理念. Normalize.css 使浏览器渲染所有元素更加一致,并且符合现代标准.它只是针对那 ...