您的位置:首页 > 理论基础 > 数据结构算法

数据结构—类模板实现链表

2017-09-20 19:35 375 查看


template_linklist.hpp

#pragma once
#include<iostream>
using namespace std;
//链表节点
template<class T>
class LinkNode
{
public:
T data;//如果T是类类型的话记得一定要要在类内提供默认构造函数
LinkNode<T>* next;
};

//链表
template<class T>
class LinkList
{
public:
LinkNode<T> header;
int size;

LinkList()
{
this->header.next = NULL;
this->size = 0;
}
//指定位置插入
void Inset_LinkList(int pos, T data)
{
if (pos<0 || pos>this->size)
{
pos = this->size;
}
//创建新的节点
LinkNode<T>* NewNode = new LinkNode<T>;
NewNode->data = data;
NewNode->next = NULL;
//新节点入链表
LinkNode<T>* Pcurrent = &this->header;
for (int i = 0; i < pos; ++i)
{
Pcurrent = Pcurrent->next;
}
NewNode->next = Pcurrent->next;
Pcurrent->next = NewNode;
++this->size;

}
//头部插入
void Push_Front(T data)
{
Inset_LinkList(0, data);
}
//尾部插入
void Push_Back(T data)
{
Inset_LinkList(this->size, data);
}
//指定位置删除
void RemoveByPos(int pos)
{
if (pos<0 || pos>this->size - 1)
{
cout << "RemoveByPos Transboundary" << endl;
return;
}

//找到要删除位置的前一个节点
LinkNode<T>* Pcurrent = &this->header;
for (int i = 0; i < pos; ++i)
{
Pcurrent = Pcurrent->next;
}
LinkNode<T>* PDel = Pcurrent->next;
Pcurrent->next = PDel->next;//把删除节点位置的前一个节点和删除节点位置的后一个节点连接起来
delete PDel;
--this->size;
}
//头删
void Remove_Front()
{
if (this->size == 0)
{
cout << "size is 0,Remove_Front error" << endl;
return;
}
RemoveByPos(0);
}
//尾删
void Remove_Back()
{
if (this->size == 0)
{
cout << "size is 0,Remove_Back error" << endl;
return;
}
RemoveByPos(this->size - 1);
}
//获得链表大小
int Size_LinkList()
{
return this->mSize;
}
//值删除
void RemoveByVal(T data)
{
if (this->size == 0)
{
cout << "size is 0,RemoveByVal error" << endl;
return;
}
//辅助指针
LinkNode<T>* Pcurrent = &this->header;
LinkNode<T>* PDel = Pcurrent->next;
while (PDel != NULL)
{
if (PDel->data == data)
{
Pcurrent->next = PDel->next;
delete PDel;
--this->size;
break;
}
Pcurrent = PDel;
PDel = PDel->next;
}
}

//打印链表,函数模板
template<class MYPRINT>
void Print_LList(MYPRINT print_llist)
{
LinkNode<T>* Pcurrent = this->header.next;
while (Pcurrent != NULL)
{
print_llist(Pcurrent->data);
Pcurrent = Pcurrent->next;
}
}

public:
LinkNode<T> header;
int size;

};

template_linklist.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include"template_linklist.hpp"
#include <string>
class person
{
public:
person(){};//为节点的类模板T data提供默认构造函数
person(string Name, int Age)
{
name = Name;
age = Age;
}
bool operator==(const person& p)//重载等于,因为在值删除函数中使用了==符号
{
return this->name == p.name && this->age == p.age;
}

public:
string name;
int age;

};

void Print_list(person& p )
{
cout << "name:"<<p.name <<"a
4000
ge:"<< p.age << endl;
}

struct Print_list2
{
void operator()(person& p)
{
cout << "name:" << p.name << "age:" << p.age << endl;
}
};

int main()
{
LinkList<person> list;
person p1("aaa", 10);
person p2("bbb", 20);
person p3("ccc", 30);
person p4("ddd", 40);
person p5("eee", 50);
person p6("fff", 60);

//插入
list.Push_Front(p1);
list.Push_Front(p2);
//尾插
list.Push_Back(p3);
list.Push_Back(p4);
//指定位置插入
list.Inset_LinkList(4, p5);
list.Inset_LinkList(2, p6);
list.Print_LList(Print_list);
cout << "------------------" << endl;
//指定位置删除
list.RemoveByPos(5);
//指定值删除
list.RemoveByVal(p6);
list.Print_LList(Print_list);
cout << "------------------" << endl;
//头删
list.Remove_Front();
list.Remove_Front();
//尾删
list.Remove_Back();
list.Remove_Back();

list.Print_LList(Print_list);
getchar();
return 0;

}

打印结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: