c++ list双向链表管理对象
#cat list.cc
#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;
#include "osstat.h"
class Node {
public:
int data;
Node *pPre, *pNext;
};
class DoubleLinkList {
public:
DoubleLinkList() {
head = new Node;
head->data = 0;
head->pNext = NULL;
head->pPre = NULL;
}
~DoubleLinkList() {delete head;}
void CreateLinkList(int n); //Create linklist
void InsertNode(int position, int d); //Insert into linklist
void TraverseLinkList(); //Traversal linklist
bool IsEmpty(); //If linklist is empty
int GetLength(); //Get linklist's length
void DeleteNode(int position); //Delete linklist's element
void DeleteLinkList(); //Delete linklist
private:
Node *head;
};
void DoubleLinkList::CreateLinkList(int n) {
if (n < 0) {
cout << "Your intput of this linklist's node count not correct!" << endl;
exit(EXIT_FAILURE);
}
else {
int i = 0;
Node *pnew, *ptemp;
ptemp = head;
i = n;
while (n-- > 0) {
cout << "Please input the number" << i - n << "node value:";
pnew = new Node;
cin >> pnew->data;
pnew->pNext = NULL;
pnew->pPre = ptemp;
ptemp->pNext = pnew;
ptemp = pnew;
}
}
}
void DoubleLinkList::InsertNode(int position, int d) {
if (position < 0 || position > GetLength() + 1){
cout << "输入位置错误!" << endl;
exit(EXIT_FAILURE);
}
else {
Node *pnew, *ptemp;
pnew = new Node;
pnew->data = d;
ptemp = head;
while (position-- > 1)
ptemp = ptemp->pNext;
if (ptemp->pNext != NULL)
ptemp->pNext->pPre = pnew;
pnew->pNext = ptemp->pNext;
pnew->pPre = ptemp;
ptemp->pNext = pnew;
ptemp = pnew;
}
}
void DoubleLinkList::TraverseLinkList() {
Node *ptemp = head->pNext;
while (ptemp != NULL) {
cout << ptemp->data << " ";
ptemp = ptemp->pNext;
}
cout << endl;
}
bool DoubleLinkList::IsEmpty() {
if (head->pNext == NULL)
return true;
else
return false;
}
int DoubleLinkList::GetLength() {
int n = 0;
Node *ptemp = head->pNext;
while (ptemp != NULL) {
n++;
ptemp = ptemp->pNext;
}
return n;
}
void DoubleLinkList::DeleteNode(int position) {
if (position < 0 || position > GetLength()) {
cout << "输入数据错误!" << endl;
exit(EXIT_FAILURE);
}
else {
Node *pdelete, *ptemp;
ptemp = head;
while (position-- > 1)
ptemp = ptemp->pNext;
pdelete = ptemp->pNext;
if (pdelete->pNext != NULL)
pdelete->pNext->pPre = ptemp;
ptemp->pNext = pdelete->pNext;
delete pdelete;
pdelete = NULL;
}
}
void DoubleLinkList::DeleteLinkList() {
Node *pdelete, *ptemp;
pdelete = head->pNext;
while (pdelete != NULL) {
ptemp = pdelete->pNext;
head->pNext = ptemp;
if (ptemp != NULL)
ptemp->pPre = head;
delete pdelete;
pdelete = ptemp;
}
}
int main() {
DoubleLinkList dl;
int position = 0, value = 0, n = 0;
bool flag = false;
cout << "请输入需要创建双向链表的结点个数:";
cin >> n;
dl.CreateLinkList(n);
cout << "打印链表值如下:";
dl.TraverseLinkList();
cout << "请输入插入结点的位置和值:";
cin >> position >> value;
dl.InsertNode(position, value);
cout << "打印链表值如下:";
dl.TraverseLinkList();
cout << "请输入要删除结点的位置:";
cin >> position;
dl.DeleteNode(position);
cout << "打印链表值如下:";
dl.TraverseLinkList();
dl.DeleteLinkList();
flag = dl.IsEmpty();
if (flag)
cout << "删除链表成功!" << endl;
else
cout << "删除链表失败!" << endl;
return 0;
}
c++ list双向链表管理对象的更多相关文章
- 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- Linux 内核数据结构:Linux 双向链表
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...
- Linux 内核数据结构:双向链表
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...
- 线性表-双向链表(LinkedList)
双向链表:如图1-3 所示,会把当前header拆分开,重新插入一个Entry<E>. LinkedList源码 0.首先这个类中的两个变量 private transient Entry ...
- Shuffling Machine和双向链表
1. 双向链表 https://github.com/BodhiXing/Data_Structure 2. Shuffling Machine https://pta.patest.cn/pta/t ...
- MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10 ...
- javascript中的链表结构—双向链表
1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...
随机推荐
- JDK部分源码阅读与理解
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK ...
- oc82--成员变量使用copy修饰
// // Person.h #import <Foundation/Foundation.h> typedef void (^myBlock)(); @interface Person ...
- XAML实例教程系列 - 命名空间(NameSpace) 三
XAML实例教程系列 - 命名空间(NameSpace) 2012-05-28 14:14 by jv9, 2205 阅读, 10 评论, 收藏, 编辑 上一篇曾提及XAML中,每个对象元素的声明是对 ...
- codevs1312连续自然数和
1312 连续自然数和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 对于一个自然数M,求出所有的连续的自然数段 ...
- Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆
题面 题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1 题解:首先可以想到对于限制 ...
- 我们的微信小程序开发
基于微信小程序的系统开发准备工作 腾讯推出微信小程序也有一段时间了,在各种行业里面也都掀起一阵阵的热潮,很多APP应用被简化为小程序的功能迅速推出,同时也根据小程序的特性推出各种独具匠心的应用,相对传 ...
- MySQL 批量插入值
MySQL 批量插入值 今天遇到个问题,需要从类似以下语句中的各个小括号[其实也有中括号等]抽取相关字段进行组合[相关规则,此处略去不提],并保存到数据库中,此时如果每次插入一条,会连续进行多次插入, ...
- Xampp mysql无法启动的解决方案
如果出现mysql 无法启动表明在安装xampp 前已经安装了mysql,造成mysql服务无法启动. 19:06:33 [mysql] MySQL Service detected with wr ...
- 355 Design Twitter 设计推特
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文.你的设计需要支持以下的几个功能: postTweet(userI ...
- 349 Intersection of Two Arrays 两个数组的交集
给定两个数组,写一个函数来计算它们的交集.例子: 给定 num1= [1, 2, 2, 1], nums2 = [2, 2], 返回 [2].提示: 每个在结果中的元素必定是唯一的. 我们 ...