模板编程方便只改变数据类型、而不改变基本操作的情况,STL基本都是基于模板进行编程,因此这里尝试修改面向int型的单向链表为模板,适用于其他类型的链表。
头文件
#pragma once
#include<iostream>
using namespace std;
template<typename T>
struct Node
{
T value;
Node* next;
Node(int a = 0, Node* n = NULL) :value(a), next(n) {}
};
template<typename T>
class List
{
private:
Node<T>* head = NULL;
Node<T>* tail = NULL;
int size = 0;
public:
int getSize() { return size; }
void print();
void append(T a);
void appendleft(T a);
void remove(T a);
};
源文件
#include "List.h"
template<typename T>
void List<T>::append(T a)
{
Node<T> *p = new Node<T>(a);
if (head)
{
tail->next = p;
tail = p;
}
else
{
head = p;
tail = p;
}
size++;
}
template<typename T>
void List<T>::appendleft(T a)
{
Node<T> *p = new Node<T>(a);
if (head)
{
p->next = head;
head = p;
}
else
{
head = p;
tail = p;
}
size++;
}
template<typename T>
void List<T>::remove(T a)
{
Node<T>* p = head;
bool flag = false;
if (!head)
{
flag = false;
cout << "链表已空,无需删除!" << endl;
}
else if (head->value == a && head != tail)
{
head = head->next;
delete p;
size--;
flag = true;
cout << "删除成功!" << endl;
}
else if (head->value == a && head == tail)
{
head = NULL, tail = NULL;
delete p;
size--;
flag = true;
cout << "删除成功!" << endl;
}
else
{
Node<T>*q = head->next;
while (q)
{
if (q->value == a && q != tail)
{
p->next = q->next;
delete q;
size--;
flag = true;
cout << "删除成功!" << endl;
break;
}
else if (q->value == a && q == tail)
{
p->next = NULL;
tail = p;
delete q;
size--;
flag = true;
cout << "删除成功!" << endl;
break;
}
else
{
p = q;
q = p->next;
}
}
if (!flag)
cout << "查无此值:" << a << endl;
}
}
template<typename T>
void List<T>::print()
{
if (!head)
cout << "链表为空,无法输出!" << endl;
else
{
cout << "链表为:" ;
Node<T>*p = head;
while (p)
{
cout << p->value << " ";
p = p->next;
}
cout << endl;
}
}
使用char类型进行检验
int main()
{
List<char> l1;
l1.appendleft('a');
l1.append('b');
l1.append('c');
l1.appendleft('d');
l1.append('e');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
l1.remove('a');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
l1.remove('y');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
l1.remove('d');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
l1.remove('c');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
l1.remove('b');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
l1.remove('d');
cout << "----链表大小:" << l1.getSize() << endl;
l1.print();
system("pause");
return 0;
}
运行结果及讨论
实际上使用float型不适用,因为浮点型计算机内部由于使用二进制存储会造成有一定的偏差,一般判断浮点型是否相等需要有一个很小的容差。