#include "pch.h"
#include <iostream>
using namespace std;
template<class T>
struct SNode
{
T data;
SNode* pNext;
};
template<class T>
class SList
{
public:
SList();
~SList();
void AddHead(T d);
void AddTail(T d);
void RemoveAt(int i);
int GetCount();
void Prints();
private:
SNode<T>* m_p;
};
template<class T>
void SList<T>::RemoveAt(int i)
{
if (m_p == NULL || this->GetCount() < i) { return; }
SNode<T>* p = m_p;
SNode<T>* per = new SNode<T>;
int count = 0;
while (p)
{
if (i == 0)
{
m_p = p->pNext;
return;
}
else if (count == i)
{
per->pNext = p->pNext;
p->pNext = NULL;
delete p;
return;
}
per = p;
p = p->pNext;
count++;
}
}
template<class T>
int SList<T>::GetCount()
{
if (m_p == NULL) { return 0; }
SNode<T>* p = m_p;
int i = 0;
while (p)
{
i++;
p = p->pNext;
}
return i;
}
template<class T>
void SList<T>::Prints()
{
if (m_p == NULL) { return; }
SNode<T>* p = m_p;
while (p)
{
cout << p->data << endl;
p = p->pNext;
}
}
template<class T>
SList<T>::SList()
{
m_p = NULL;
}
template<class T>
SList<T>::~SList()
{
SNode<T>* p = m_p;
SNode<T>* p1;
p1 = p;
p = p->pNext;
delete p1;
}
template<class T>
void SList<T>::AddHead(T d)
{
SNode<T>* p = new SNode<T>;
p->data = d;
p->pNext = m_p;
m_p = p;
}
template<class T>
void SList<T>::AddTail(T d)
{
SNode<T>* pNew = new SNode<T>;
pNew->data = d;
pNew->pNext = NULL;
if (!m_p)
{
m_p = pNew;
return;
}
SNode<T> *p = m_p;
while (p->pNext!=NULL)
{
p = p->pNext;
}
p->pNext = pNew;
}
int main()
{
SList<float> list;
SList<int> list2;
int i = 10;
for (int i = 0; i < 10; i++)
{
list.AddHead(i*0.2);//头插法
}
for (int i = 0; i < 10; i++)
{
list2.AddTail(i);//尾插法
}
list.RemoveAt(0);
list2.RemoveAt(6);
list.Prints();
list2.Prints();
}