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 ;
}
转自:https://www.cnblogs.com/flypie/p/5015711.html
c++链表-双向链表+增删查改的更多相关文章
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
- Java实现单链表的增删查改及逆置打印
//所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...
- DataGridView绑定泛型List时,利用BindingList来实现增删查改
DataGridView绑定泛型List时,利用BindingList来实现增删查改 一. DataGridView绑定泛型List的种种 1.DataGridView数据绑定对比(DataTa ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 3.EF 6.0 Code-First实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- jdbc的实例应用:增删查改实现
//在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...
- 用javascript实现html元素的增删查改[xyytit]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- zoj2901【DP·二进制优化】
题意: 要排一个L长度的序列,当 j 放在 i 后面的时候会增加v[ i ][ j ]的值,求构成L长度序列的最大值. 思路: 可以想到预处理任意两点<i,j>的最大值是多少,然后题目还有 ...
- git配置命令
一.Git安装及密钥的生成 1.下载Git软件:http://msysgit.github.io/ 2.桌面右键 Git Bash Here 打开git命令行: 3.ssh-keygen -t rsa ...
- Java基础--面向对象以及相关知识
一. 面向对象特征与原则 1.三大特征:封装.继承.多态. (1)封装:将客观的事物封装成抽象的类,封装代码逻辑,并通过访问控制符来控制访问的方式,从而保护程序(使用反射时,可以获取对象的私有方法和成 ...
- C 语言实例 - 循环输出26个字母
C 语言实例 - 循环输出26个字母 循环输出 个字母. 实例 #include <stdio.h> int main() { char c; for(c = 'A'; c <= ' ...
- CF438D The Child and Sequence 线段树
给定数列,区间查询和,区间取模,单点修改. n,m小于10^5 ...当区间最值小于模数时,就直接返回就好啦~ #include<cstdio> #include<iostream& ...
- POJ-3177-RedundantPaths(边联通分量,缩点)
链接:https://vjudge.net/problem/POJ-3177#author=Dillydally 题意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可 ...
- 牛客网36-A,B题解
A.Rabbit的字符串 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 Rabbit得到了一 ...
- 遇到的一些vue的问题
一.事件绑定中的事件处理方法后加不加括号问题 1.例如: click事件后加不加括号 a.@click = "getContent" b.@click = "getCon ...
- TDH-search汇报理解
题目:海量数据查询开头:1.自我介绍:2.题目切入: 什么是海量数据查询?(海量数据,快速,符合要求) 几个常用场景(搜索引擎,百度:话单查询:影像平台,高铁)3.展示目录:架构,案例,平台规划 4. ...
- P3818 小A和uim之大逃离 II
题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然一阵南风吹来,一片乌云从南部天边急涌过来 ...