目录
单指针类双向链表及测试程序(包括按位置查找、添加、插入、删除、打印所有元素、打印某个元素):
核心思想:
指针中存放前后结点地址异或值,记为Xmid,前结点地址Xforward,后结点地址Xback,则有:
Xforward 异或 Xmid = Xback
Xback 异或 Xmid = Xforward
单指针类双向链表及测试程序(包括按位置查找、添加、插入、删除、打印所有元素、打印某个元素):
#include <iostream>
using namespace std;
//结点类
template<typename type>
class node
{
private:
type _data;
node<type> *_pointer;
public:
node(type data=0, node<type>* pointer=NULL) :_data(data) ,_pointer(pointer){}
~node() = default;
type get_data(void) const
{
return _data;
}
node<type> *get_pointer(void) const
{
return _pointer;
}
void set_data(type data)
{
_data = data;
}
void set_pointer(node<type> *pointer)
{
_pointer = pointer;
}
};
//四个地址异或运算处理函数
template<typename type>
node<type>* process(node<type>* temp1, node<type>* temp2)
{
unsigned long long temp3 = (unsigned long long)temp1 ^ (unsigned long long)temp2;
return (node<type>*)temp3;
}
template<typename type>
node<type>* process(int temp1, node<type>* temp2)
{
unsigned long long temp3 = (unsigned long long)temp1 ^ (unsigned long long)temp2;
return (node<type>*)temp3;
}
template<typename type>
node<type>* process(node<type>* temp1, int temp2)
{
unsigned long long temp3 = (unsigned long long)temp1 ^ (unsigned long long)temp2;
return (node<type>*)temp3;
}
template<typename type>
node<type>* process(int temp1, int temp2)
{
unsigned long long temp3 = (unsigned long long)temp1 ^ (unsigned long long)temp2;
return (node<type>*)temp3;
}
//单指针双向链表类
template<typename type>
class biolist
{
private:
node<type> *_begin;
public:
biolist()
{
_begin = new node<type>(0,NULL);
}
~biolist() = default;
//按位置查找
node<type>* inquire(int number)
{
if (number < 0 || number > _begin->get_data())
{
return NULL;
}
else if (number == 0)
{
return _begin;
}
node<type>* temp1 = _begin;
node<type>* temp2 = _begin;
node<type>* temp3 = NULL;
temp2 = process(temp2->get_pointer(), 0);
for (int x = 1; x < number; x++)
{
temp3 = temp2;
temp2 = process(temp2->get_pointer(), temp1);
temp1 = temp3;
}
return temp2;
}
//添加
void add(type data)
{
if (_begin->get_data() == 0)
{
node<type>* temp = new node<type>(data);
_begin->set_pointer(process(0, temp));
}
else if (_begin->get_data() == 1)
{
node<type>* temp = new node<type>(data);
process(0, _begin->get_pointer())->set_pointer(process(_begin, temp));
}
else if (_begin->get_data() > 1)
{
node<type>* temp1 = _begin;
node<type>* temp2 = _begin;
node<type>* temp3 = NULL;
node<type>* temp4 = NULL;
temp2 = process(temp2->get_pointer(), 0);
while (temp2->get_pointer() != NULL)
{
temp4 = temp2;
temp2 = process(temp2->get_pointer(), temp1);
temp1 = temp4;
}
temp3 = new node<type>(data,NULL);
temp2->set_pointer(process(temp1, temp3));
}
_begin->set_data(_begin->get_data() + 1);
}
//插入
void insert(int number, type data)
{
if (number == _begin->get_data() + 1)
{
this->add(data);
}
else if (number == _begin->get_data())
{
node<type>* temp1 = this->inquire(number - 1);
node<type>* temp2 = this->inquire(number);
node<type>* temp3 = new node<type>(data, NULL);
temp1->set_pointer(process(process(temp1->get_pointer(), temp2), temp3));
temp2->set_pointer(NULL);
temp3->set_pointer(process(temp1, temp2));
_begin->set_data(_begin->get_data() + 1);
}
else
{
node<type>* temp1 = this->inquire(number - 1);
node<type>* temp2 = this->inquire(number);
node<type>* temp3 = new node<type>(data, NULL);
temp1->set_pointer(process(process(temp1->get_pointer(), temp2), temp3));
temp2->set_pointer(process(process(temp2->get_pointer(), temp1), temp3));
temp3->set_pointer(process(temp1, temp2));
_begin->set_data(_begin->get_data() + 1);
}
}
//删除
void del(int number)
{
node<type>* temp1 = this->inquire(number-1);
node<type>* temp2 = this->inquire(number);
if (number == _begin->get_data())
{
temp1->set_pointer(NULL);
delete temp2;
}
else if (number == _begin->get_data() - 1)
{
temp1->set_pointer(process(process(temp2, temp1->get_pointer()),
process(temp1, temp2->get_pointer())));
delete temp2;
}
else
{
node<type>* temp3 = this->inquire(number+1);
temp1->set_pointer(process(process(temp2, temp1->get_pointer()),
process(temp1, temp2->get_pointer())));
temp3->set_pointer(process(process(temp2, temp3->get_pointer()), temp1));
delete temp2;
}
_begin->set_data(_begin->get_data() - 1);
}
};
//打印所有元素
template<typename type>
void print_all(biolist<type> temp)
{
for (int x = 1; x <= (temp.inquire(0))->get_data(); x++)
{
cout << (temp.inquire(x))->get_data() <<" ";
}
cout << endl;
}
//打印某个元素
template<typename type>
void print_one(biolist<type> temp,int number)
{
cout << (temp.inquire(number))->get_data() << endl;
}
int main(void)
{
biolist<int> system;
system.add(1);
system.add(2);
system.add(3);
cout << "打印所有元素:";
print_all(system);
cout << "打印二号元素: ";
print_one(system,2);
system.insert(4,4);
system.insert(2,5);
cout << "插入后打印所有元素:";
print_all(system);
cout << "插入后打印二号元素: ";
print_one(system, 2);
system.del(2);
cout << "删除后打印所有元素:";
print_all(system);
cout << "删除后打印二号元素: ";
print_one(system, 2);
return 0;
}