//链表的基本操作
//生成链表,插入结点,查找结点,删除结点,遍历链表,清空链表
//链表类模板 //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:链表的基本操作的更多相关文章

  1. html5标签video(播放器)学习笔记(二)-基本操作

    html5标签video(播放器)学习笔记(二)-基本操作 subying 发布时间: 2014/12/01 23:59 阅读: 13008 收藏: 21 点赞: 3 评论: 0 摘要 本文介绍了ht ...

  2. Kettle学习笔记(二)— 基本操作

    目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...

  3. [Golang学习笔记] 08 链表

    链表(Linked list)是一种常见数据结构,但并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针. 由于不必须按顺序存储,链表在插入的时候可以达到O(1),比顺序表快得多,但是查 ...

  4. CUBRID学习笔记 48查询优化

    cubrid的中sql查询语法 查询优化 c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com ...

  5. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. c++学习笔记—单链表基本操作的实现

    用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include  ...

  7. linux C学习笔记03--单链表

    单链表一直是程序员的基础,我也来复习下,下面是link.c中的代码,供main.c 调用,代码很简单,单链表的插入,删除,查找和遍历输出, #include <stdio.h> #incl ...

  8. 学习笔记 C++ 链表

    今天查了不少关于链表的资料大概理解了链表,为记录只用留笔于此. 链表概述:动态的数据存储单元,可以比数组更加灵活. 链表的组成:存储的数据,下一个节点. 首先让我们用代码完成一个节点. class N ...

  9. 3ds max学习笔记(六)-- 基本操作(建模前奏)

    1.界面设置 在3ds Max的版本的界面中,默认是较深.若需要切换至较亮的界面,步骤: 执行“自定义”菜单,选择“加载自定义用户界面方案”从弹出的界面中选择样式文件,单击“打开”即可: 注:“amg ...

随机推荐

  1. oa项目环境搭建的操作步骤详解

    dto:多表关联查询用单独建一个类,把查询数据放dto即可 vo:是view的缩写.单独定义一个类

  2. 【C++ Primer | 11】关联容器(一)

    在multimap或multiset中查找元素 第二种方法解释: #include <iostream> #include <utility> #include <ite ...

  3. js 给定时间,如'2013-08-30',换算和今天的天数差

    由于项目中需要用到给定时间格式,如'2013-08-30',需要计算其和当前时间的间隔,需要算出间隔的时间,自己在网上搜索,并做了下简单的整理,总体思路分3步:1.将给定的时间和当前时间转换为毫秒 2 ...

  4. B - Alyona and towers CodeForces - 739C

    链接: https://vjudge.net/contest/202699#problem/B 题意: 给出一个序列,要支持区间加和操作 求其中最长的区间,该区间内的元素满足(ai<ai+1&l ...

  5. OAuth2:客户端证书授权(Client Credentials)类型的开放授权

    适应范围 认证服务器不提供像用户数据这样的重要资源,仅仅是有限的只读资源或者一些开放的API.例如使用了第三方的静态文件服务,如Google Storage或Amazon S3.这样,你的应用需要通过 ...

  6. 【Android】Android取消EditText自动获取焦点

    解决方法: 在EditText的父级控件中找一个,设置成 android:focusable="true" android:focusableInTouchMode="t ...

  7. fanuc 机床,加工中心通信总结,机床联网监控系统

    有需求要与fanuc机床及加工中心通讯,读取状态信息. 1.通过了解,与fanuc通讯需要具备的硬件条件如下: a.串口通讯:可以进行程序的上传下载,绝大部分机床状态也是以文件的形式保存,所以理论上都 ...

  8. django引入现有数据库 转

    django引入现有数据库   Django引入外部数据库还是比较方便的,步骤如下: 1.创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新 ...

  9. gitlab之一: gitlab安装配置使用

    参考: gitlab 安装和配置 gitlab下载地址: https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/ 官方教程: https://about.gitl ...

  10. springmvc+ajax——第二讲(页面缓存)

    springmvc+ajax+页面缓存(参考:https://www.cnblogs.com/liuling/archive/2013/07/25/2013-7-25-01.html) 必须设置响应头 ...