整个结构参考https://blog.csdn.net/morewindows/article/details/7186471,只是对删除节点部分进行了重写。
节点结构如下:
template<class T>
struct Node
{
T val;
Node *next;
Node(T t)
{
this->val = t;
this->next = nullptr;
}
};
对单链表进行封装
template<class T>
class slist
{
public:
slist();
~slist();
void push_front(T t);
bool remove(T&t);
bool removeAll(T&t);
bool find(T&t);
int size();
void clear();
void dis();
private:
int slistcount;
Node<T> *mhead;
};
删除首个置为t的节点
template<class T>
bool slist<T>::remove(T &t)
{
Node<T>*pre = mhead, *p = mhead;
while (p != nullptr)
{
if (p->val == t)
{
if (p != pre)//此处要判断是否为头结点,如果是将头结点置空
pre->next = p->next;
else
mhead = p->next;
delete p;
slistcount--;
return true;
}
pre = p;
p = p->next;
}
return false;
}
删除所有值为t的节点
template<class T>
bool slist<T>::removeAll(T&t)
{
Node<T>*pre = mhead, *p = mhead;
int count = 0;
while (p != nullptr)
{
if (p->val == t)
{
if (p == pre)
{
pre = pre->next;
delete p;
mhead = pre;
}
else
{
pre->next = p->next;
delete p;
}
p = pre;
count++;
slistcount--;
}
else
{
pre = p;
p = p->next;
}
}
return count;
}
测试:
int main()
{
slist<int> s;
int a = 4;
s.push_front(4);
s.push_front(6);
s.push_front(7);
s.push_front(8);
s.push_front(4);
s.push_front(4);
s.removeAll(a);
s.dis();
getchar();
return 0;
}
输出:
8
7
6