版权声明:本文为博主原创文章,欢迎分享!吾生有涯而知也无涯,一起加油 https://blog.csdn.net/qq_41822235/article/details/82559778
#include<iostream>
using namespace std;
template<typename T>
class LinkedList {
public:
//嵌套类
class LinkedNode {
public:
T _val;
LinkedNode *_next;
};
LinkedList(); //构造方法
~LinkedList(); //析构方法
void headInsert(T value); //头部插入
void show(); //打印输出
/*先查找再删除,让删除函数调用查找函数*/
bool delNode(T value); //删除节点
LinkedNode *queryNode(T value); //查找节点
private:
LinkedNode *_head;
};
//template <>表示对函数模板进行特例化
template<>
class LinkedList<char *> {
public:
//嵌套类
class LinkedNode { //链表节点类
public:
LinkedNode(char *value = char()) { _val = value; _next = NULL; };
char * _val;
LinkedNode *_next;
};
LinkedList(); //构造方法
~LinkedList(); //析构方法
void headInsert(char* value); //头部插入
void show(); //打印输出
/*先查找再删除,让删除函数调用查找函数,提高代码的复用性*/
bool delNode(char* value); //删除节点
LinkedNode *queryNode(char* value); //查找节点
private:
LinkedNode *_head;
};
/**********************************************************************************/
LinkedList<char*>::LinkedList() //特例化的链表类进行初始化
{
_head = new LinkedNode;
}
/**********************************************************************************/
LinkedList<char*>::~LinkedList() //特例化的链表类进行析构
{
LinkedNode *p = _head;
while (p != NULL) {
p = p->_next; //p指针后移
delete _head;
_head = p;
}
}
/**********************************************************************************/
void LinkedList<char*>::headInsert(char * value) //特例化的链表类进行头部插入
{
LinkedNode *p = new LinkedNode(value);
p->_next = _head->_next;
_head->_next = p;
}
/**********************************************************************************/
void LinkedList<char*>::show() //打印输出特例化的链表类;因为是头部插入,所以具有后来局前的特点
{
LinkedNode *p = _head->_next;
if (NULL != p)
cout << "头插法构造的单链表为:";
while (NULL != p) {
cout << p->_val << " ";
p = p->_next;
}
cout << endl;
}
/**********************************************************************************/
bool LinkedList<char*>::delNode(char * value) //删除特例化的链表类的特定节点
{
LinkedNode *p = _head;
LinkedNode *q;
while (p->_next != NULL) {
q = queryNode(value); //进行查找 如果找到:p是待删除节点的前驱;q是待删除节点
if (q != NULL) {
p->_next = q->_next; //p的后继变成q的后继;跳过q本身
delete q;
return true;
}
p = p->_next; //p指针后移,待进行下一次查找
}
return false;
}
/**********************************************************************************/
LinkedList<char*>::LinkedNode * LinkedList<char*>::queryNode(char * value) //查找特例化的链表类的特定节点
{
LinkedNode *p = _head->_next;
while (p != NULL) {
if (0 == strcmp(p->_val, value))
return p;
p = p->_next; //p指针后移,待进行下一次查找
}
return NULL;
}
/******************************测试用例************************************************/
int main() {
LinkedList<char*>list;
char str1[] = { "aaaaaaaaa" };
char str2[] = { "bbbbbbbbbbbb" };
char str3[] = { "cccccccccc" };
//测试头插函数是否正确
list.headInsert(str1);
list.headInsert(str2);
//测试打印输出函数是否正确
list.show();
//测试查找函数是否正确
LinkedList<char*>::LinkedNode* p = list.queryNode(str3);
if (p != NULL)
cout << "找到 " <<str3<< endl;
else
cout << "没找见 " <<str3<< endl;
//测试删除函数是否正确
bool flag = list.delNode(str3);
cout << "想要删除值为" << str3 <<" 的节点"<< endl;
if (flag)
cout << "删除 " <<str3<<"成功 "<<endl;
else
cout << "并不包含 "<<str3<<"故而删除失败" << endl;
list.show();
//说明,构造函数和析构函数无需测试,因为运行无误的话,就证明了其正确性,测试用例的结果显示正常,暂时没有问题。
system("pause"); //解决黑窗口一闪而过的问题,暂时没有什么其他好办法
return 0;
}