#pragma oncetemplate<typename T>struct Node {//链表结点
T data;//数据域
Node<T>* next;//指针域};template<typename T>classLinkList{public:LinkList();//建立只有头结点的空链表LinkList(T a[],int n);//建立有n个元素的单链表,头插法LinkList(int n, T a[]);//建立有n个元素的单链表,尾插法~LinkList();//析构函数intlength();//返回链表长度
T get(int i);//获取第i个结点的元素值intlocate(T x);//查找值为x的元素的序号voidinsert(int i, T x);//在第i个位置插入值为x的元素
T del(int i);//删除第i个元素boolempty();//判空voidprintList();//打印表private:
Node<T>* head;//头指针};
源文件
#include"LinkList.h"#include<iostream>usingnamespace std;template<typename T>void LinkList<T>::printList(){
Node<T>* p = head->next;//暂存第一个结点的指针while(p !=nullptr){//遍历链表打印
cout << p->data <<" ";
p = p->next;}
cout << endl;}template<typename T>bool LinkList<T>::empty(){//有没有第一个结点,没有就是空链表if(head->next ==nullptr)returntrue;returnfalse;}template<typename T>
T LinkList<T>::del(int i){
T x;//暂存将要删除的元素
Node<T>* p = head->next,*q =nullptr;int count =0;//计数器while(p !=nullptr&& count < i -1){
p = p->next;//走到第i-1位
count++;}//链表没这么长可以删if(p =nullptr){//throw"删除位置错误";}else{
q = p->next;
x = q->data;//暂存被删除结点
p->next = q->next;//摘链,这里是重点delete q;//释放q指针占的空间return x;//返回查找的元素}}template<typename T>int LinkList<T>::length(){
Node<T>* p = head->next;//暂存第一个结点的指针int length =0;//记录链表长度while(p !=nullptr){
p = p->next;//遍历整个链表
length++;}return length;//返回长度}template<typename T>
T LinkList<T>::get(int i){
Node<T>* p = head->next;//暂存第一个结点的指针int count =0;//计数器while(p !=nullptr&& count < i){
p = p->next;//如果当前元素不为空且没有到达我们要查找的位置则往下走
count++;}//链表没i这么长,if(p ==nullptr)throw"查找位置错误";return p->data;//返回位置i的元素}template<typename T>int LinkList<T>::locate(T x){
Node<T>* p = head->next;//暂存第一个结点的指针int index=0;//记录位置while(p !=nullptr&& p->data != x){
p = p->next;//如果当前结点部位空且不是我们要查找的元素就往下一个找
index++;}//如果最后找到的结点为空,说明没有这个元素if(p ==nullptr)return0;return index;//返回查找元素的位置}template<typename T>void LinkList<T>::insert(int i,T x){
Node<T>* p = head->next,* s =nullptr;int count =0;//计数器while(p !=nullptr&& count < i-1){
p = p->next;//如果当前元素不为空且没有到达我们要查找的位置则往下走
count++;}//链表没i这么长,if(p ==nullptr)throw"插入位置错误";
s =new Node<T>;s->data = x;//申请结点s,数据域位x
s->next = p->next;//插入s结点,这里是重点
p->next = s;}template<typename T>
LinkList<T>::LinkList(T a[],int n){
head =new Node<T>;//头结点,
head->next =nullptr;//next为空for(int i =0; i < n; i++){
Node<T>* s =nullptr;//申请结点s,数据域位a[i]
s =new Node<T>; s->data = a[i];
s->next = head->next;//头插法
head->next = s;}}template<typename T>
LinkList<T>::LinkList(int n,T a[]){
head =new Node<T>;//头结点,
Node<T>* r = head;//尾指针初始化for(int i =0; i < n; i++){
Node<T>* s =nullptr;//申请结点s,数据域位a[i]
s =new Node<T>; s->data = a[i];
r->next = s;//尾插法
r = s;}
r->next =nullptr;//链表尾结点的next为空}template<typename T>
LinkList<T>::~LinkList(){
Node<T>* p = head;//释放每一个结点while(head !=nullptr){
head = head->next;//head指向被释放的下一个结点delete p;
p = head;//工作指针后移}}