基于双向链表的增删改查和排序(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实现数据的增删改查 分页器组件 分页器组件的介绍以及源码解读 补充:源码下载,
随机推荐
- 数据库的Instance/Crash Recovery
crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...
- First insmod a module
不得不说网上坑爹的文章比虱子还多,参考这位仁兄调试成功 喜欢C的人却靠着Java产业吃饭,人艰不拆... 对于未知的东西,有个习惯,run success first,then research en ...
- SignalR实时推送
SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现.在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 ...
- Ant执行Jmeter工程模版
<?xml version="1.0" encoding="GB2312"?><project name="ant-jmeter-t ...
- android webview 底层实现的逻辑
其实在不同版本上,webview底层是有所不同的. 先提供个地址给大家查:http://grepcode.com/file/repository.grepcode.com/java/ext/com.g ...
- [Ubuntu] Profile error when launching google-chrome
Whenever I launch google-chrome, a window is displayed which contains this message: Your profile cou ...
- 数据库的Index Scan V.S. Rscan
一直在做performance,但直到今天才完成了这个第一天应该完成的图,到底Index scan和Rscan的分界点在哪里? 如下图所示,很简单的一个查询,只是查询int,分别强制走索引和表扫描 ...
- POJ - 2183 Bovine Math Geniuses
“模拟“题,运用哈希,不断地按照一定运算规律对一个结果进行计算,如果重复出现就停止并且输出该数.注意到仔细看题,这种题一定要细心! POJ - 2183 Bovine Math Geniuses Ti ...
- Fragment的隐藏与显示
package com.bwie.helpdemo; import com.bwie.fragment.BillFrag; import com.bwie.fragment.IndexFrag; im ...
- LA 3211 飞机调度
题目链接:http://vjudge.net/contest/142615#problem/A 题意:n架飞机,每架可选择两个着落时间.安排一个着陆时间表,使得着陆间隔的最小值最大. 分析: 最小值最 ...