目录
c++模板类实现链表 可以应用于任何数据类型
头文件.h
模板类定义 创建链表(构造函数) 插入操作 删除操作 清空操作 获取节点 返回长度
#pragma once
#include"iostream"
using namespace std;
template<typename T>
struct node
{
node<T>*next;//写在第一行避免偏移量操作
T data;
};//模板类底层要用的节点数据结构 也可以定义在模板类内部
template<typename T>
class LinkList
{
public:
LinkList();
~LinkList();
void LinkListClear();
int getlen();//返回长度
int insert(int pos, T&node);//指定位置插入节点
int getNode(int pos, T&node);//获取指定位置节点
int LinkListDelete(int pos, T&node);//删除指定位置节点
private:
node<T>*head;
int len;
};
.hpp文件(实际是cpp文件 二次编译模板类)
不同于c节点内存单元由主调函数分派 c++模板类底层自己开辟管理内存空间
#include"dm_11_linklistTemplate.h"
template<typename T>
LinkList<T>::LinkList()//构造函数 创建链表 无需像c特意的句柄 类的私有成员head 和len即可
{
head = new node<T>;
head->next = NULL;
len = 0;
}
template<typename T>
LinkList<T>::~LinkList()//析构函数 调用完毕析构空间
{
node<T>*tmp = NULL;
while(head != NULL)
{
tmp = head->next;
delete head;
head = tmp;
}
}
template<typename T>
void LinkList<T>::LinkListClear()//清空链表
{
if (head == NULL)
{
cout << "指针传入为空" << endl;
return;
}
else
{
this->len = 0;
head->next = NULL;
}
}
template<typename T>
int LinkList<T>::getlen()//返回长度
{
if (head == NULL)
{
cout << "指针传入为空" << endl;
return 0;
}
else
{
return this->len;
}
}
template<typename T>
int LinkList<T>::insert(int pos, T&t)//指定位置插入节点
{
int ret = 0;
if (head == NULL || pos < 0)
{
ret = -1;
cout << "LinklistInsert err list == NULL || node == NULL || pos < 0" << endl;
return ret;
}
node<T>*pcurr = NULL;
pcurr = head;
node<T>*node_insert = new node<T>;//开辟空间存储插入的节点 C++模板类 存储空间在底层类中开辟
node_insert->data = t;//缓存外部数据
node_insert->next = NULL;//做一个负责人的人避免野指针
for (int i = 0; i < pos && (pcurr->next != NULL); i++)
{
pcurr = pcurr->next;//带头结点的链表,指针指向指定位置的前一个
}
node_insert->next = pcurr->next;
pcurr->next = node_insert;
this->len++;
return ret;
}
template<typename T>
int LinkList<T>::getNode(int pos, T&t)//获取指定位置节点
{
int ret = 0;
if (head == NULL || pos < 0)
{
ret = -1;
cout << "getNode err list == NULL || t == NULL || pos < 0" << endl;
return ret;
}
node<T>*pcurr = NULL;
pcurr = head;
for (int i = 0; i < pos && (pcurr->next != NULL); i++)
{
pcurr = pcurr->next;//带头结点的链表,指针指向指定位置的前一个
}
t = pcurr->next->data;
return ret;
}
template<typename T>
int LinkList<T>::LinkListDelete(int pos, T&t)//删除指定位置节点
{
int ret = 0;
if (head == NULL || pos < 0)
{
ret = -1;
cout << "LinkListDelete err list == NULL || t == NULL || pos < 0" << endl;
return ret;
}
node<T> *pcurr = NULL;
node<T> *tmp = NULL;
pcurr = head;
for (int i = 0; i < pos && (pcurr->next != NULL); i++)
{
pcurr = pcurr->next;//带头结点的链表,指针指向指定位置的前一个
}
tmp = pcurr->next;
t = tmp->data;
pcurr->next = tmp->next;
delete tmp;
this->len--;
return ret;
}
main自定义抽象类Teacher_11测试函数
比较懒测试程序都用的同一个
#define _CRT_SECURE_NO_WARNINGS
#include"dm_11_linklistTemplate.hpp"
#include"iostream"
struct Teacher_11 {
int age;
char name[32];
};
void main()
{
int ret = 0;
LinkList<Teacher_11>linklist;
Teacher_11 t1, t2, t3, t4;
strcpy(t1.name, "zhangsan11");
strcpy(t2.name, "lisi11");
strcpy(t3.name, "wangwu11");
strcpy(t4.name, "maliu11");
t1.age = 20;
t2.age = 22;
t3.age = 24;
t4.age = 26;
//建立链表
linklist.insert(0, t1);
linklist.insert(0, t2);
linklist.insert(0, t3);
linklist.insert(0, t4);
//遍历
for (int i = 0; i < linklist.getlen(); i++)
{
Teacher_11 tmp;
linklist.getNode(i, tmp);
cout << tmp.name << tmp.age << endl;
}
//删除
while (linklist.getlen() > 0)
{
Teacher_11 tmp;
linklist.LinkListDelete(0, tmp);
cout << tmp.name << '\t' << tmp.age << endl;
}
//检验是否删除完毕
for (int i = 0; i < linklist.getlen(); i++)
{
Teacher_11 tmp;
ret = linklist.getNode(i, tmp);
if (ret != 0)
{
ret = -3;
cout << "func linklist.getNode( err" << ret << endl;
return;
}
cout << tmp.name << tmp.age << endl;
}
}
测试结果:
最近特别丧,下午和女票去成都浪几天,希望回来转运,阿弥陀佛么么哒