单链表结点类Node<T>声明如下,成员变量data表示结点的数据域,保存数据元素,数据类型为T,next表示结点的指针域,保存后继结点的地址。文件名为Node.h
template <class T>
class Node
{
public;
T data;
Node<T>*next;
Node()
{
this->next = NULL;
}
Node(T data ,Node <T>*next = NULL)
{
this->data = data;
this->next = next;
}
}
Node类的一个对象表示单链表中的一个结点。通过next链,将两个结点连接起来。
插入操作:
空表插入:head = new Node<T>(x);
头插入: Node<T>*q = new Node <T>(x);
q->next = head;
head = q;
中间插入\尾插入:
Node<T>*q = new Node<T>(x);
q->next = front->next;
front->next = q;
带头结点的单链表
带头结点的单链表是指,在单链表的第0个结点之前增加一个特殊的结点,称为头结点,忽略其数据域。此时,空单链表就只有一个头结点。头结点的作用是,使得所有链表(包括空表)的头指针非空,则对单链表的插入,删除操作不需要分区操作位置。
循环单链表
如果单链表最后一个结点的next链保存单链表的头指针head值,则该单链表成为环形结构,称为循环单链表,循环单链表的结点同单链表结点类Node,当head->next == head时,循环单链表为空。其它操作算法与单链表相同。差别是,插入结点时,执行下列下列语句,使之成为一条循环单链表,设rear指针指向单链表最后一个结点。
rear->next = head;
双链表
每个结点有两个地址域的线性链表称为双链表,两个地址域分别指向前驱结点和后继结点。在单链表中,每个结点只有一个指向后继结点的链。若要查找前驱结点,必须从单链表的头指针开始沿着链表方向逐个检测,操作效率很低。此时,需要采用双向链表。
双链表结点类
template <class T>
class DoubleNode
{
public;
T data;
DoubleNode<T>*prev,*next;
DoubleNode()
{
this->prev = this->next = NULL;
}
DoubleNode(T data,DoubleNode<T>*prev =NULL,DoubleNode<T>*next = NULL)
{
this->data = data;
this->prev = prev;
this->next = next;
}
};