#include<iostream>
using namespace std;
template <class T>
class LinkList{
private:
typedef struct Linknode{
T t;
Linknode* next;
}Linknode;//节点
Linknode* head;// 头指针
Linknode H;//头结点
int sum; //节点的个数(不包括头结点)
public:
//初始化
LinkList();
//创造节点
Linknode* c_node(T tmp);
//头插法
bool add(T* tmp);
bool add(T tmp);
T findK(int k); //查找下标的值
int findNum(T tmp); //查找值的下标
//中间插入
bool insert(T* tmp,int k);
//删除
bool deleteK(int k);
~LinkList();
};
template <class T>//初始化
LinkList<T>::LinkList(){
H.t = NULL;
H.next = NULL;
head = &H;
sum = 0;
cout<<"已初始化节点"<<endl;
}
template <class T> //创造节点
struct LinkList<T>::Linknode* LinkList<T>::c_node(T tmp){
Linknode* K = new Linknode;
K->t = tmp;
K->next = NULL;
return K;
}
template <class T>//头插法
bool LinkList<T>::add(T* tmp){
Linknode* pnode = c_node(*tmp);
cout <<"将数值转化为节点 ***";
pnode->next = head->next;
head->next = pnode;
sum++;
cout <<"头插入一个节点"<<endl;
return true;
}
template <class T>//头插法
bool LinkList<T>::add(T tmp){
Linknode* pnode = c_node(tmp);
cout <<"将数值"<<tmp<<"转化为节点 ***";
pnode->next = head->next;
head->next = pnode;
sum++;
cout <<"头插入一个节点"<<endl;
return true;
}
template <class T> //查找 第K个节点的值
T LinkList<T>::findK(int k){
Linknode* pnode = head;
if(sum == 0)cout <<"当前链表为空链表"<<endl;
else if(k<1 || k>sum)cout <<"越界"<<endl;
else{
int i=0;
while(i!=k){
pnode = pnode->next;
i++;
}
cout <<"找到目标节点"<<endl;
}
return pnode->t;
}
template <class T> //查找值是第几个节点
int LinkList<T>::findNum(T tmp){
int k = 0;
if(sum == 0)cout <<"当前链表为空链表"<<endl;
else{
Linknode* pnode = head;
while(k<=sum){
pnode = pnode->next;
k++;
}
}
return k;
}
template <class T>//中间插入
bool LinkList<T>::insert(T* tmp, int k){
if(k<1 || k>sum){
cout << "越界"<<endl;
return false;
}else{
Linknode* ptem = c_node(*tmp);
Linknode* pnode = head;
int i = 0;
while(i!=k-1){
pnode = pnode->next;
}
ptem->next = pnode->next;
pnode->next = ptem;
return true;
}
}
template <class T>//删除
bool LinkList<T>::deleteK(int k){
if(k<1 || k>sum){
cout << "越界"<<endl;
return false;
}else{
Linknode* ptem;
Linknode* pnode = head;
int i = 0;
while(i!=k-1){
pnode = pnode->next;
}
ptem-> next= pnode->next;
pnode->next = ptem->next;
delete ptem;
return true;
}
}
template <class T>//析构
LinkList<T>::~LinkList(){
if(sum!=0){
while(sum>0){
deleteK(1);
}
}
}
void text(){
cout <<"你将创建一个数值链表\n数值类型可为 int long short double \n请输入你想创建的链表类型:"<<endl;
}
int main(){
cout <<"1、创建新列表"<<endl;
LinkList<int> L;
cout<<"2.1、通过值头插入添加元素"<<endl;
L.add(111);
cout << "查找 第K个节点的值 "<<L.findK(1)<<endl;
cout<<"2.2、通过地址,指针头插入添加元素"<<endl;
int q = 222;
L.add(&q);
cout << "查找 第K个节点的值 "<<L.findK(1)<<" "<<L.findK(2) <<endl;
cout<<"3、在中间插入元素"<<endl;
int w = 333;
int* e = &w;
cout<<"查找333是第几个元素 "<<L.findNum(333)<<endl;
cout<<"4、删除元素"<<endl;
cout << L.findK(1)<<endl;
cout<<"显示现有元素 "<<L.findK(1)<<" "<<L.findK(2)<<endl;
return 0;
}
链表
最新推荐文章于 2024-06-14 09:15:00 发布