基于双向链表的增删改查和排序(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=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++实现)相关推荐
- ORM框架之Mybatis(一)基于mapper配置增删改查
Mybatis是现在非常流行的SSM框架中的M部分,Mybatis也是一个主流的ORM框架,在项目中用来处理持久层数据. 一.Mybatis框架介绍及使用 1.1 mybatis框架概述: mybat ...
- Spring Boot 学习[四] web项目实战训练(增删改查,分页,排序)
Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等. 几点说明: Spring boot开发web项目,通常打成 ...
- Python项目:学生管理系统连接MySQL数据库(增删改查、排序、统计、显示所有信息)
文章目录 一程序功能(Function) 1. 功能概述 2. 思维导图 二.开始实践 战前准备 定义学生管理系统菜单 定义主函数 1.录入学生信息 2.查找学生信息 3.删除学生信息 4.修改学生信 ...
- 基于localstorage实现增删改查功能
本文以英雄联盟英雄列表中英雄的增删改查为例,介绍localstorage的增删改查功能 该图显示了增差功能,由于我将图片和英雄名字设置为相同的,所以这里输入英雄名字(我将其命名为1~100的数字)图片 ...
- MyBatis研习录(06)——基于注解的增删改查操作
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...
- C语言 双向链表的增删改查
主题:双向链表 功能:分别实链表的插入.删除.查找.打印(正序.逆序)操作 提示:如果需要进入下一步操作,输入3个ctrl z即可 //主题:双向链表 //功能:分别实链表的插入.删除.查找操作 // ...
- oracle删除排序数据库,数据库的数据操作:增删改查和排序
一.增 1.1[插入单行]insert [into] (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1 ...
- 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_其他方 ...
- Neo4j基础理论、Linux安装与Windows安装以及CQL语法(增删改查、排序、分页、去重)
一.什么是Neo4j? Neo4j是一个开源的 无Shcema的 基于java开发的 图形数据库,它将结构化数据存储在图中而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引 ...
最新文章
- laravel 5.1 Eloquent常见问题
- 用 easy-json-schema 代替 json-schema 吧
- iOS初级开发笔记:Block回调,实现简单的绑定支付宝逻辑
- boost::python::converter::as_to_python_function相关的测试程序
- 新CIO:Mark Schwartz认为的领先IT
- vb的一些搞怪的操作
- windows 平台下,运用 Python 进行简单的文件操作需要用到的函数
- 变量在函数内外的作用域 3
- Redis学习---(15)Redis 脚本
- 50-00-040-配置-Flink Configuration简介
- 【Python配置】Win10配置Python3、Numpy、PyCharm、Anaconda
- 计算机专业课系列之四:漫谈操作系统之虚拟内存
- java使用tar算法压缩解压缩文件、数据流、byte[]字节数组
- PyCharm主题更换
- VBScript入门篇
- python爬虫:获取12306网站火车站对应三字码
- word-wrap和word-break,white-space的区别
- MAC M1安装VMware 安装windows11
- python量化策略—— alpha 三因子策略(1)
- End-to-end/hand-crafted的含义(深度学习)