LinkList.h
#pragma once
#include <iostream>
using namespace std;
template <class DataType>
struct Node
{
DataType data;//数据域
Node<DataType>* next;//指针域
};
template<class DataType>
class LinkList
{
public:
LinkList();//建立只有头结点的空链表
LinkList(DataType a[], int n);//建立n个元素的单链表
~LinkList();//析构函数
int length();//求单链表的长度
DataType Get(int i);//按位查找,查找第i个节点的的元素值
int Locate(DataType x);//按值查找,查找值为x的元素序号
void Insert(int i, DataType x);//插入操作,第i个位置插入值为x的结点
DataType Delete(int i);//删除操作,删除第i个结点
int Empty();//判断线性表是否为空
void PrintList();//遍历操作,按序号依次输出个元素
private:
Node<DataType>* first;//单链表的头指针
};
template <class DataType>
LinkList<DataType>::LinkList()//建立只有头结点的空链表
{
first = new Node<DataType>;//生成头结点
first->next = NULL;
}
template <class DataType>
int LinkList<DataType>::Empty()//判断线性表是否为空
{
if (first->next == NULL)return false;
else return true;
}
template <class DataType>
void LinkList<DataType>::PrintList()//遍历操作,按序号依次输出个元素
{
Node<DataType>* p = first->next;//工作p指针初始化
while (p != NULL)
{
cout << p->data << '\t';
p = p->next;
}
cout <<endl;
}
template <class DataType>
int LinkList<DataType>::length()//求单链表的长度
{
Node<DataType>* p = first->next;//工作指针初始化
int count = 0;//累加器初始化
while (p!= NULL)
{
p = p->next;
count++;
}
return count;
}
template <class DataType>
DataType LinkList<DataType>::Get(int i)//按位查找,查找第i个节点的的元素值
{
Node<DataType>* p = first->next;//工作指针p初始化
int count = 1;//累加器count初始化
while(p != NULL && count < i)
{
p = p->next;//工作指针p向后移
count++;
}
if (p == NULL)throw"查找位置错误";
else return p->data;
}
template <class DataType>
int LinkList<DataType>::Locate(DataType x)//按值查找,查找值为x的元素序号
{
Node<DataType>* p = first->next;//工作指针p初始化
int count = 1;//累加器count初始化
while (p != NULL)
{
if (p->data == x)return count;
p = p->next;
count++;
}
return 0;
}
template <class DataType>
void LinkList<DataType>::Insert(int i, DataType x)//插入操作,第i个位置插入值为x的结点
{
Node<DataType>* p = first, * s = NULL;
int count = 0;
while (p != NULL && count < i - 1)//查找第i-1个结点
{
p = p->next;//工作指针p向后移
count++;
}
if (p == NULL)throw"插入位置错误";
else
{
s = new Node<DataType>;
s->data = x;//申请结点s,数据域为x;
s->next = p->next;//将结点s插入结点p之后
p->next = s;
}
}
template <class DataType>
LinkList<DataType>::LinkList(DataType a[], int n)//建立n个元素的单链表
{
first = new Node<DataType>;//生成头结点
Node<DataType>* r = first, * s = NULL;
for (int i = 0; i < n; i++)
{
s = new Node<DataType>;
s->data = a[i];
r->next = s; r = s;//将结点s插入终端结点之后
}
r->next = NULL;
}
template <class DataType>
DataType LinkList<DataType>::Delete(int i)//删除操作,删除第i个结点
{
DataType x;
Node<DataType> *p = first, * q = NULL;
int count = 0;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL || p->next == NULL)//结点p不存在或p的后继结点不存在
throw"删除位置错误";
else
{
q = p->next; x = q->data;//暂存被删结点
p->next = q->next;//摘链
delete q;
return x;
}
}
template <class DataType>
LinkList<DataType>::~LinkList()//析构函数
{
Node<DataType>* p = first;
while (first != NULL)//释放每一个结点的存储空间
{
first = first->next;//first指向被释放结点的下一个结点
delete p;
p = first;//工作指针后移
}
}
main.cpp
#include "LinkList.h"
#include <iostream>
using namespace std;
int main(void)
{
int r[5] = {1,2,3,4,5},i,x;
LinkList<int> L(r,5);
cout << "当前线性表的数据为:";
L.PrintList();//输出当前链表1 2 3 4 5、
try
{
L.Insert(2, 8);//在第二个位置插入值为8的结点
cout << "执行插入操作后数据为:";
L.PrintList();//输出插入后链表1 8 2 3 4 5
}
catch (char *str) { cout << str << endl; }
cout << "当前链表的长度为:" << L.length() << endl;//输出链表长度
cout << "请输入查找的元素值:";
cin >> x;
i = L.Locate(x);
if (i > 0)cout << "元素" << x << "的位置为:" << i << endl;
else cout << "单链表中没有元素" << x << endl;
try
{
cout << "请输入要删除第几个元素:";
cin >> i;
x = L.Delete(i);//删除第i个元素
cout << "删除的元素值为:" << x << ",执行删除操作后的数据为:";
L.PrintList();//输出删除后的单链表
}
catch (char* str) { cout << str << endl; }
return 0;
}