基于双向链表的增删改查和排序(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实现数据的增删改查 分页器组件 分页器组件的介绍以及源码解读 补充:源码下载,
随机推荐
- Force StyleCop to Ignore a File
You can quickly force StyleCop to ignore files in a project by manually modifying the project file, ...
- Java -- 在Eclipse上使用Hibernate
最近一个项目要用Java做,一点都不熟啊.没办法,只好硬着头皮啃了,花了大半天的时间,终于在Eclipse上完成了第一个Hibernate例子.下面记录关键的步骤,权作笔记,以备日后查看. (1)下载 ...
- java项目常用 BaseDao BaseService
java项目常用 BaseDao BaseService IBaseDao 1 package com.glht.sim.dao; 2 3 import java.util.List; 4 5 6 ...
- easyui datagrid将表头的checkbox不显示(隐藏)
<script type="text/javascript"> $(function(){ $("#dg").datagrid({ url:&quo ...
- SQLDMO知识总结
SQLDMO(SQL Distributed Management Objects) 参考手册:http://technet.microsoft.com/en-us/library/aa312550( ...
- 虚拟主机无法使用fsockopen操作处理方法
一.如何禁用fsockopen()下面是两种常用的禁用fsockopen的方法.1.修改php.ini,将 disable_functions = 后加入 fsockopen2.修改php.ini,将 ...
- 初识Python第二天(1)
在Python中,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等. 一.传递参数 1.1新建python文件,名为twoday_args.py,输出以下代码 import sys p ...
- jQuery 选择器 (基础恶补)
jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...
- maven 编译插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compi ...
- mac攻略(五) -- 使用brew配置php7开发环境(mac+php+apache+mysql+redis)
前面介绍过基本的配置,后来我又从网上查找了很多资料,经过不断的摸索,下面做了一个总结,希望能对大家提供些许帮助(Mac版本是sierra) 一.mac系统会自带git,而我们要做的是自己安装git ...