C++实现线性表的链式存储结构(单链表)
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。也就是说,这些数据元素可以存储在未被使用的内存的任意位置。
链式存储结构中:存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称做指针或链。
在使用链式存储结构的时候,通常我们我们在第一个结点前面设一个结点(头结点),并通过头结点的指针位唯一标识该链表,头结点的数据域不存储任何信息(也可以存储线性表的长度),头结点的指针域指向第一个结点。
链表中第一个结点的存储位置叫做头指针,整个链表的存取必须是从头指针开始进行。之后的每一个结点,就是上一个的后继指针指向的位置。最后一个结点指针为“空”(通常用NULL或“^”符号表示)。
单链表的基本操作:
-
插入:在表头、表尾、数据x前面和数据x后面插入数据
-
删除:删除表头、表尾、第pos个位置的数据和数据x
-
修改:修改表头、表尾和第pos个位置的数据和数据x
-
得到数据:得到表头、表尾和第pos个位置的结点和数据
-
查找:在单链表中查找数据为p的结点、前驱节点和后继节点
-
计算长度:返回单链表的长度
-
打印
一、结点类的定义
template<class T>
class LinkList;
template<class T>
class LinkNode {
friend class LinkList<T>;
private:
T data;
LinkNode<T> *next;
public:
LinkNode() {
next = NULL;
}
explicit LinkNode(T p) {
data = p;
next = NULL;
}
LinkNode<T> &operator=(const LinkNode<T> *p) {
data = p->data;
next = p->next;
return *this;
}
};
二、单链表类的定义
template<class T>
class LinkList {
private:
LinkNode<T> *head;
public:
LinkList(); //构造函数
~LinkList(); //析构函数
void push_first(T p); //在单链表头添加数据
void push_last(T p); //在单链表尾添加数据
bool push_node_prev(T x, T p); //在单链表数据x前面添加数据
bool push_node_next(T x, T p); //在单链表数据x后面添加数据
void pop_first(); //删除单链表头的数据
void pop_last(); //删除单链表尾的数据
bool pop_node_data(T x); //删除单链表中的数据x
bool pop_node_cur(int pos); //删除第pos个数据
bool get_first_node(LinkNode<T> *&p); //得到单链表的头结点
bool get_last_node(LinkNode<T> *&p); //得到单链表的尾结点
bool get_node(LinkNode<T> *&p, int pos); //得到单链表中第pos个结点
bool get_first_data(T &p); //得到单链表头的数据
bool get_last_data(T &p); //得到单链表尾的数据
bool get_data(T &x, int pos); //得到单链表中第pos个数据
void change_first_data(T p); //修改单链表中头的数据
void change_last_data(T p); //修改单链表尾的数据
bool change_node_data(T x, T p); //修改单链表中的数据x修改为数据p
bool change_node_cur(T p, int pos); //修改单链表中第pos个数据
LinkNode<T> *search(T p); //查找单链表数据为p的结点
LinkNode<T> *search_prev(T p); //查找单链表数据为p的结点的前驱节点
LinkNode<T> *search_next(T p); //查找单链表数据为p的结点的后续节点
bool isEmpty(); //判断单链表是否为空
int length(); //返回单链表的长度
void print(); //打印单链表
void delete_link(); //摧毁单链表
};
1. 基本函数(构造函数、析构函数、判空函数等)
//初始化单链表
template<class T>
inline LinkList<T>::LinkList() {
head =