关于双向链表的增删改查和排序的C++实现_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++实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索双向链表排序
c语言双向链表排序、c语言链表增删改查、c语言链表的增删改查、双向链表排序、双向链表冒泡排序,以便于您获取更多的相关知识。

时间: 2024-09-11 09:49:17

关于双向链表的增删改查和排序的C++实现_C 语言的相关文章

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库.   创建表: create table person( _id integer primary key, name varchar(20), age integer );   添加: insert into person(name, age) values('lisi', 19);   删除: delete from person where _id = 1;   修改: update person se

Mysql学习笔记(六)增删改查

原文:Mysql学习笔记(六)增删改查 PS:数据库最基本的操作就是增删改查了... 学习内容: 数据库的增删改查 1.增...其实就是向数据库中插入数据.. 插入语句 insert into table_name values("要插入的数据"); 比如说,我们先创建一个宠物表,用来记录宠物的基本信息以及所有者... create table pet ( name varchar(20), owner varchar(20), species varchar(20), sex cha

javaweb-Javaweb 增删改查处理

问题描述 Javaweb 增删改查处理 数据库大约有5000条左右的文本数据,页面每页展示大约100条左右数据(只展示标题时间类型 产品信息,具体介绍点击后在一个页面展示.)每页展示信息上方都有查询条件,求如何处理数据库信息,如果所有条数信息全部提取,怎么存放,查询是在数据库查询还是在内存中查询.本人小白没有真正做过Javaweb实际项目 解决方案 google数据库存储过程分页+你用的数据库 解决方案二: 分页技术吧,跟你你用的数据库进行分页查询在显示 解决方案三: 你们数据库查询用的是hib

Mybatis实现增删改查及分页查询的方法_java

MyBatis的前身就是iBatis.是一个数据持久层(ORM)框架. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架.MyBatis消除了几乎所有的JDBC 代码和参数的手工 设置以及结果集的检索.MyBatis使用简单的XML或注解用于 配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录.每个 MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个 SqlS

extjs 做数据库增删改查时,原先是全部查上来显示的,现在用条件查询,怎么在原先的位置上显示条件查询的结果

问题描述 extjs 做数据库增删改查时,原先是全部查上来显示的,现在用条件查询,怎么在原先的位置上显示条件查询的结果 问题补充:myali88 写道 解决方案 重写store的onbeforeload方法,构造查询参数,执行查询时这些参数可以直接在后台获取到.这种方式比较好理解.每次刷新(refreshGrid)都会执行这个方法.var grid;/** * grid的参数 */var params = {start : 0,limit : 1000};var rIndex;/** 操作行的i

Contoso 大学 - 2 – 实现基本的增删改查

原文 Contoso 大学 - 2 – 实现基本的增删改查     目录 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 原文地址:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application   在上一个课程中,

PHP简单数据库操作类实例【支持增删改查及链式操作】_php技巧

本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类(模型Model),供大家使用.支持增.删.改.查,支持链式操作,代码不到100行,非常小巧方便,很适合小项目的快速部署使用. /** * * @Authot: summer * * @E-mail: wenghang1228@me.com * * @Data: 2015-02-06 * * @Pr

浅谈JavaScript中数组的增删改查_javascript技巧

数组的增加 •ary.push()   向数组末尾添加元素,返回的是添加后新数组的长度,原有数组改变 •ary.unshift()  向数组开头添加元素,返回的是添加后新数组的长度,原有数组改变 • var ary=[1,2,3,4];   var res=ary.unshift(6);   console.log(res); ---->5   返回的是新数组的长度•ary.splice(n,m,x)从索引n开始删除m个元素,把新增的元素X放在索引n的前面,把删除的元素当成一个新数组返回,原有数

iOS CoreData 增删改查详解_IOS

最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然Swift3 已经有了,目前整理的这个版本是Swift2 的.Swift 3 的话有些新特性. 需要另外调整,后续有时间再整理.  继承CoreData有两种方式:  创建项目时集成   这种方式是自动继承在AppDelegate里面,调用的使用需要通过UIApplication的方式来获取AppDe