数据结构--单链表C++(模板类实现)
作者:
AmbitionX
,
2022-04-28 20:51:38
,
所有人可见
,
阅读 282
C++
#include <iostream>
using namespace std;
template <typename DataType>
struct Node
{
DataType data;
Node<DataType>* next;
};
template <typename DataType>
class LinkList
{
public:
LinkList();
LinkList(DataType a[], int n);
~LinkList();
int Length();
DataType Get(int i);
int Locate(DataType x);
void Insert(int i, DataType x);
DataType Delete(int i);
void Empty();
void PrintList();
private:
Node<DataType>* head;
};
template <typename DataType>
LinkList<DataType>:: LinkList()
{
head = new Node<DataType>;
head->next = nullptr;
}
template <typename DataType>
LinkList<DataType> :: LinkList(DataType a[ ], int n)
{
Node<DataType> *r, *s;
head = new Node<DataType>;
r = head;
for (int i = 0; i < n; i++)
{
s = new Node<DataType>; s->data = a[i];
r->next = s; r = s;
}
r->next = NULL;
}
template <typename DataType>
LinkList<DataType> :: ~LinkList( )
{
Node<DataType> *q;
while (head != NULL)
{
q = head;
head = head->next;
delete q;
}
}
template <typename DataType>
int LinkList<DataType>:: Length()
{
Node<DataType> *p = head->next;
int count = 1;
while (p != nullptr)
{
p = p->next;
count ++;
}
return count;
}
template <typename DataType>
DataType LinkList<DataType>:: Get(int i)
{
Node<DataType> *p = head->next;
int count = 1;
while (p != nullptr && count < i)
{
p = p->next;
count ++;
}
if (p == nullptr) throw "查找位置错误";
else return p;
}
template <typename DataType>
int LinkList<DataType>:: Locate(DataType x)
{
Node<DataType> *p = head->next;
int count = 1;
while (p != nullptr)
{
if (p->data == x) return count;
p = p->next;
count ++;
}
return 0;
}
template <typename DataType>
void LinkList<DataType>:: Insert(int i, DataType x)
{
Node<DataType> *p = head, *s;
int count = 0;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == nullptr) throw "插入位置错误";
else
{
s = new Node<DataType>;
s->data = x;
s->next = p->next;
p->next = s;
}
}
template <typename DataType>
DataType LinkList<DataType>:: Delete(int i)
{
DataType x;
Node<DataType> *p, *q;
int count = 0;
p = head;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == nullptr || p->next == nullptr) throw "删除位置错误";
else
{
q = p->next;
x = q->data;
p->next = q->next;
delete q;
return x;
}
}
template <typename DataType>
void LinkList<DataType>:: Empty()
{
if (head->next == nullptr) cout << "为空" << endl;
else cout << "不为空" << endl;
}
template <typename DataType>
void LinkList<DataType>:: PrintList()
{
Node<DataType> *p = head->next;
while (p != nullptr)
{
cout << p->data<<"\t";
p = p->next;
}
cout << endl;
}
int main()
{
int r[5]={1, 2, 3, 4, 5};
LinkList<int> L(r, 5);
L.Empty();
cout<<"执行插入操作前数据为:"<<endl;
L.PrintList( );
try
{
L.Insert(2, 3);
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"执行插入操作后数据为:"<<endl;
L.PrintList( );
cout<<"值为5的元素位置为:";
cout<<L.Locate(5)<<endl;
cout<<"执行删除操作前数据为:"<<endl;
L.PrintList( );
try
{
L.Delete(1);
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"执行删除操作后数据为:"<<endl;
L.PrintList( );
return 0;
}