C++学习笔记48:链表的基本操作
//链表的基本操作
//生成链表,插入结点,查找结点,删除结点,遍历链表,清空链表
//链表类模板 //LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include "Node.h" template <class T> class LinkedList
{
private:
Node<T> *front, *rear;//表头和表尾指针
Node<T> *prevPtr, *currPtr;//记录表当前遍历位置的指针,由插入和删除操作更新
int size;//表中的元素个数
int position;//当前元素在表中的位置序号,由函数reset使用;
//函数成员,生成新的结点,数据域为item,指针域为ptrNext
Node<T> *newNode(const T &item, Node<T> *ptrNext = NULL);
//释放结点
void freeNode(Node<T> *p);
//将链表L拷贝到当前表(假设当前表为空)
void copy(const LinkedList<T> &L);
public:
LinkedList();
LinkedList(const LinkedList<T> &L);
~LinkedList();
LinkedList<T> &operator = (const LinkedList<T> &L); int getSize() const;
bool isEmpty() const; void reset(int pos = );
void next();
bool endOfList() const;
int currentPosition() const; void insertFront(const T &item);
void insertRear(const T &item);
void insertAt(const T &item);
void insertAfter(const T &item); T deleteFront();
void deleteCurrent(); T& data();
const T& data() const;
void clear();
}; template <class T> Node<T> *LinkedList<T>::newNode(const T &item, Node<T> *ptrNext)
{
Node<T> *p;
p = new Node<T>(item, ptrNext);
if (p == NULL)
{
cout << "Memory alloction failure!\n";
exit();
}
return p;
} template <class T> void LinkedList<T>::freeNode(Node<T> *p)
{
delete p;
} template <class T> void LinkedList<T>::copy(const LinkedList<T> &L)
{
Node<T> *p = L.front;
int pos;
while (p != NULL)
{
insertRear(p->data);
p = p->nextNode();
}
if (position == -)
return;
prevPtr = NULL;
currPtr = front;
for (pos = ; pos != position; pos++)
{
prevPtr = currPtr;
currPtr = currPtr->nextNode();
}
} template <class T> LinkedList<T>::LinkedList() :front(NULL), rear(NULL),
prevPtr(NULL), currPtr(NULL), size(), position(-)
{ } template <class T> LinkedList<T>::LinkedList(const LinkList<T> &L)
{
front = rear = NULL;
prevPtr = currPtr = NULL;
size = ;
position = -;
copy(L);
} template <class T> LinkedList<T>::~LinkedList()
{
clear();
} template <class T> LinkedList<T>& LinkedList<T>::operator=(const LinkedList<T> &L)
{
if (this == &L)
return *this;
clear();
copy(L);
return *this;
} template <class T> int LinkedList<T>::getSize() const
{
return size;
} template <class T> bool LinkedList<T>::isEmpty() const
{
return size == ;
} template <class T> void LinkedList<T>::reset(int pos)
{
int startPos;
if (front == NULL)
return;
if (pos < || pos > size - )
{
std::cerr << "Reset: Invalid list position:" << pos << endl;
return;
}
if (pos == )
{
prevPtr = NULL;
currPtr = front;
position = ;
}
else
{
currPtr = front->nextNode();
prevPtr = front;
startPos = ;
for (postion = startPos; position != pos; position)
{
prevPtr = currPtr;
currPtr = currPtr->nextNode();
}
}
} template <class T> void LinkedList<T>::next()
{
if (currPtr != NULL)
{
prevPtr = currPtr;
currPtr = currPtr->nextNode();
position++;
}
} template <class T> bool LinkedList<T>::endOfList() const
{
return currPtr == NULL;
} template <class T> int LinkedList<T>::insertFront(const T& item)
{
if (front != NULL)
reset();
insertAt(item);
} template <class T> void LinkedList<T>::insertRear(const T& item)
{
Node<T> *node;
prevPtr = rear;
nNode = newNode(item);
if (rear == NULL)
front = rear = nNode;
else
{
rear->insertAfter(nNode);
rear = nNode;
}
currPtr = rear;
position = size;
size++;
} template <class T> void LinkedList<T>::insertAt(const T& item)
{
Node<T> *nNode;
if (prevPtr == NULL)
{
nNode = newNode(item, front);
front = nNode;
}
else
{
nNode = newNode(item);
prevPtr->insertAfter(nNode);
}
if (prevPtr == rear)
{
rear = nNode;
position = size;
}
currPtr = nNode;
size++;
} template <class T> void LinkedList<T>::insertAfter(const T& item)
{
Node<T> *p;
p = newNode(item);
if (front == NULL)
{
front = currPtr = rear = ;
position = ;
}
else
{
if (currPtr == NULL)
{
currPtr = prevPtr;
}
currPtr->insertAfter(p);
if (currPtr == rear)
{
rear = p;
position = size;
}
else
{
position++;
}
prevPtr = currPtr;
currPtr = p;
}
size++;
} template <class T> T LinkedList<T>::deleteFront()
{
T item;
reset();
if (front == NULL)
{
cerr << "Invalid deletion!" << endl;
exit();
}
item = currPtr->data;
deleteCurrent();
return item;
} template <class T> void LinkedList<T>::deleteCurrent()
{
Node<T> *p;
if (currPtr == NULL)
{
cerr << "Invalid deletion !" << endl;
exit();
}
if (prevPtr == NULL)
{
p = front;
front = front->nextNode();
}
else
p = prevPtr->deleteAfter();
if (p == rear)
{
rear = prePtr;
position--;
}
currPtr = p->nextNode();
freeNode(p);
size--;
} template <class T> T & LinkedList<T>::data()
{
if (size == || currPtr == NULL)
{
cerr << "Data:invalid reference!" << endl;
exit();
}
return currPtr->data;
} template <class T> void LinkedList<T>::clear()
{
Node<T> *currPosition, *nextPosition;
currentPosition = front;
while (currentPosition != NULL)
{
nextPosition = currentPosition->nextNode();
freeNode(currentPosition);
currentPosition = nextPosition;
}
front = rear = NULL;
prevPtr = currPtr = NULL;
size = ;
position = -;
} #endif // !LINKEDLIST_H
C++学习笔记48:链表的基本操作的更多相关文章
- html5标签video(播放器)学习笔记(二)-基本操作
html5标签video(播放器)学习笔记(二)-基本操作 subying 发布时间: 2014/12/01 23:59 阅读: 13008 收藏: 21 点赞: 3 评论: 0 摘要 本文介绍了ht ...
- Kettle学习笔记(二)— 基本操作
目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...
- [Golang学习笔记] 08 链表
链表(Linked list)是一种常见数据结构,但并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针. 由于不必须按顺序存储,链表在插入的时候可以达到O(1),比顺序表快得多,但是查 ...
- CUBRID学习笔记 48查询优化
cubrid的中sql查询语法 查询优化 c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- c++学习笔记—单链表基本操作的实现
用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include ...
- linux C学习笔记03--单链表
单链表一直是程序员的基础,我也来复习下,下面是link.c中的代码,供main.c 调用,代码很简单,单链表的插入,删除,查找和遍历输出, #include <stdio.h> #incl ...
- 学习笔记 C++ 链表
今天查了不少关于链表的资料大概理解了链表,为记录只用留笔于此. 链表概述:动态的数据存储单元,可以比数组更加灵活. 链表的组成:存储的数据,下一个节点. 首先让我们用代码完成一个节点. class N ...
- 3ds max学习笔记(六)-- 基本操作(建模前奏)
1.界面设置 在3ds Max的版本的界面中,默认是较深.若需要切换至较亮的界面,步骤: 执行“自定义”菜单,选择“加载自定义用户界面方案”从弹出的界面中选择样式文件,单击“打开”即可: 注:“amg ...
随机推荐
- The.Glory.of.Innovation 创新之路2科学基石
犹太民族很早就确立了他们的生存法则:资源.土地,以及一切有形的东西都会消失,一个人最重要的财富是自己的头脑.是知识.是创造. 有些选择是被动的,有些选择是主动的,一旦决心要把技术变成自己的,独立的 ...
- ThreadLocal详解,ThreadLocal源码分析,ThreadLocal图解
本文脉路: 概念阐释 ----> 原理图解 ------> 源码分析 ------> 思路整理 ----> 其他补充. 一.概念阐述. ThreadLocal 是一个为 ...
- Vs2015 本地git获取的代码目录文件修改后,启动提示error:Unable to start program “C:\Program Files\dotnet\dotnet.exe” 已解决.
http://stackoverflow.com/questions/39938453/unable-to-start-program-c-program-files-dotnet-dotnet-ex ...
- 【BZOJ3252】攻略
题解: 首先贪心的会发现我们每次一定会选当前权值和最大的那个 然后在于怎么维护这个最大值 我们发现每个修改实际上是对沿途所有点的子树的修改 所以用线段树维护就可以了.. 另外注意有重复部分,但一定是包 ...
- MySQl 查询性能优化相关
0. 1.参考 提升网站访问速度的 SQL 查询优化技巧 缓存一切数据,读取内存而不是硬盘IO 如果你的服务器默认情况下没有使用MySQL查询缓存,那么你应该开启缓存.开启缓存意味着MySQL 会把所 ...
- Comparison of several types of convergence
In functional analysis, several types of convergence are defined, namely, strong convergence for ele ...
- 【AtCoder】ARC071
ARC071 C - 怪文書 / Dubious Document 题目大意:给n个字符串,每个字符串可以通过扔掉一些字母将剩下的字母重排得到新的字符串,求n个字符串都能拼出的字符串且长度最大,若有多 ...
- WinRAR 0day漏洞
WinRAR 0day漏洞(附利用过程) 英国安全机构Mohammad Reza Espargham的漏洞实验室发现,流行压缩工具WinRAR 5.21最新版里存在一个安全漏洞,目前该漏洞还属于零日漏 ...
- Spring AOP中args()、arg-names、argNames
先小结一下: args()是用来匹配并且接收目标方法的参数的. argNames(用在注解中)与arg-names(用在XML中),他们是同一个东西. argNames用来接收AspectJ表达式中的 ...
- Codeforces 1045B Space Isaac
Space Isaac 我们定义第一个集合为a, 第二个集合为b 先把a数组排序, 然后我们会以线段的形式得到b集合. 我们先用a[ 1 ]去和 b 中的元素结合, 只有size(a) 个数字未被覆盖 ...