基于双向链表的增删改查和排序(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实现数据的增删改查 分页器组件 分页器组件的介绍以及源码解读 补充:源码下载,
随机推荐
- 【转】MySQL数据库MyISAM和InnoDB存储引擎的比较
MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...
- 前向后瞻正则表达式及其JS例子
定义 x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找. 比如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'./Jack(?=Sprat|F ...
- Echarts3 使用教程
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- [Android Tips] 6. Parallax ViewPager
文章 http://ryanhoo.github.io/blog/2014/07/16/step-by-step-implement-parallax-animation-for-splash-scr ...
- string.Format出现异常"输入的字符串格式有误"的解决方法
string.Format出现异常"输入的字符串格式有误"的解决方法 今天在做项目时,碰到一个很奇怪的问题,我使用string.Format居然报“输入的字符串格式有误”的错误,我 ...
- java 读取excel poi 和cell 方法
http://poi.apache.org/spreadsheet/quick-guide.html http://www.aspose.com/docs/display/cellsjava/Eval ...
- js 获取 根目录
//js获取项目根路径,如: http://localhost:8083/uimcardprjfunction getRootPath(){ //获取当前网址,如: http://localhost: ...
- PHP 匹配一个汉字
使用preg_match 必须使用u flag 这个修饰符添加的额外的功能,与Perl的PCRE不兼容. Pattern和字符串均为UTF-8编码. 从PHP 4.1.0 or greater on ...
- 四、Salesforce Styles_1
1.静态变量的使用:<apex:stylesheet value="{!$Resource.TestStyles}"/>2.<apex:page><s ...
- 【译】微型ORM:PetaPoco【不完整的翻译】
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...