在C++中,可以用结构类型来描述单链表的结点 ,由于结点的元素类型不确定,所以采用C++的模板机制。 template <typename T> struct Node { T data; Node<T> *next;
单链表的实现
template <class T>
class LinkList {
public:
LinkList ( ) {first=new Node<T>; first -> next= NULL ;}
LinkList ( T a[ ], int n ) ;
~LinkList ( ) ;
int Length ( ) ;
T Get ( int i ) ;
int Locate ( T x ) ;
void Insert ( int i, T x ) ;
T Delete ( int i ) ;
void PrintList ( ) ;
private:
Node<T> *first; // 单链表的头指针 , <T>可以省略
};
尾插template <class T>
LinkList<T>:: LinkList(T a[ ], int n) {
Node<T> *r,*s; //尾指针
first=new Node<T>; //生成头结点
r=first;
for (int i=0; i<n; i++)
{
s=new Node<T>;
s->data=a[i]; //为每个数组元素建立一个结点
r->next=s; r=s; //插入到终端结点之后
}
r->next=NULL; //单链表建立完毕,将终端结点的指针域置空
}
1 工作指针p初始化,计数器初始化 2 查找第i-1个节点,并使工作指针p指向该节点 3 若查找不成功(P==NULL),说明位置错误,抛出位置异常,否则 3.1 生成一个元素值为x的新节点s 3.2 将s插入到p之后
析构函数template <class T>
LinkList<T>:: ~LinkList()
{
Node<T> *q;
while (first)
{
q=first->next;
delete first;
first=q;
}
}
循环列表将单链表或者双链表的头尾结点链接起来,就是一个循环链表。
不增加额外存储花销,却给不少操作带来了方便
从循环表中任一结点出发,都能访问到表中其他结点。
template <class T> class CycleLinkList{ public: CycleLinkList( ); CycleLinkList(T a[ ], int n); CycleLinkList(T a[ ], int n,int i); ~CycleLinkList(); int Length(); T Get(int i); void Insert(int i, T x); T Delete(int i); void PrintList( ); private: Node<T> *first; };
头插循环列表template <class T>
CycleLinkList<T>:: CycleLinkList(T a[ ], int n,int k)
{
first=new Node<T>; //生成头结点
first->next=first;
Node<T> *s;
for (int i=1; i<n; i++)
{
s=new Node<T>;
s->data=a[i]; //为每个数组元素建立一个结点
s->next=first->next;
first->next=s;
}
}