遗传算法是经典的进化算法之一,其中涉及选择、交叉、变异等操作,现用两个大小为10的int型顺序表分别代表两个染色体L1和L2:L1中数据为1,2,3,4,5,6,7,8,9,0;L2中数据为0,9,8,7,6,5,4,3,2,1。实现成员函数:交叉算子,从下标为n(测试是传递参数为5)的元素开始,L1和L2的元素进行互换。最后打印互换后L1和L2中的所有个体。
头文件
//SeqList_template.h
using namespace std;
#include <stdlib.h>
#include <iostream>
template<class T>
class SeqList
{
private: //私有
T *data;
int size;
int max;
void Error(char *s)const
{cout<<s;
exit(1);}
public: //公有
//构造函数和析构函数
SeqList(int n=100);
SeqList(const SeqList& l);
~SeqList(){delete[] data;}
//用于修改的成员函数
SeqList& operator=(const SeqList& l);
void InsertRear(const T& item);
void Insert(T *itr,const T& item);
void Erase(T *itr);
void Clear(){size=0;}
T& operator[](int id);
const T& operator[](int id)const;
//用于读取的成员函数
int Size()const{return size;}
int Empty()const{return size==0;}
int Full()const{return size==max;}
T *Begin(){return data;}
const T *Begin()const{return data;}
T *End(){return data+size;}
const T *End()const{return data+size;}
void Insertgroup(int n); //连续插入元素
void Cross(SeqList& l,int n);
};
template<class T>
SeqList<T>::SeqList(int n)
{
data=new T[n];
if(data==NULL)
Error("Memory allocation error\n");
size=0;
max=n;
}
template<class T>
void SeqList<T>::InsertRear(const T& item)
{
if(size==max)
Error("InsertRear:list is full!\n");
data[size]=item;
size++;
}
template<class T>
SeqList<T>::SeqList(const SeqList& l)
{
data=new T[l.max];
if(data==NULL)
Error("Memory allocation error\n");
for(int i=0;i<l.size;++i)
data[i]=l.data[i];
size=l.size;
max=l.max;
}
template<class T>
SeqList<T>& SeqList<T>::operator=(const SeqList& l)
{
if(max!=l.max)
{
delete[] data;
data=new T[l.max];
if(data==NULL)
Error("Memory allocation error\n");
}
for(int i=0;i<l.size;++i)
data[i]=l.data[i];
size=l.size;
max=l.max;
return *this;
}
template<class T>
void SeqList<T>::Insert(T *itr,const T& item)
{
for(T *p=data+size,*q=data+size-1;p!=itr;--p,--q)
*p=*q;
*itr=item;
size++;
}
template<class T>
void SeqList<T>::Erase(T *itr)
{
for(T *p=itr,*q=itr+1;q!=data+size;++p,++q)
*p=*q;
size--;
}
template<class T>
T& SeqList<T>::operator[](int id)
{
if(id<0||id>size-1)
Error("id is illegal!\n");
return data[id];
}
template<class T>
const T& SeqList<T>::operator[](int id)const
{
if(id<0||id>size-1)
Error("id is illegal!\n");
return data[id];
}
template<class T>
void SeqList<T>::Insertgroup(int n)
{
T temp;
for(int i=0;i<10;++i)
{
cin>>temp;
InsertRear(temp);
}
}
template<class T>
void SeqList<T>::Cross(SeqList& l,int n)
{
T temp;
for(int i=n;i<10;i++)
{
temp=data[i];
data[i]=l.data[i];
l.data[i]=temp;
}
}
自己填写
#include "seqList_template.h"
#include <iostream>
template<class T>
void display_seqlist(T *first,T *last)
{
for(;first!=last;++first)
cout<<*first<<'\t';
cout<<endl;
}
int main()
{
SeqList<int> L1(10); //初始化一个长度为10的int型顺序表
SeqList<int> L2(10); //初始化一个长度为10的int型顺序表
L1.Insertgroup(10); // 输入数据为:1 2 3 4 5 6 7 8 9 0
L2.Insertgroup(10); // 输入数据为:0 9 8 7 6 5 4 3 2 1
L1.Cross(L2,5);
display_seqlist(L1.Begin(),L1.End()); //显示所有输入的元素
display_seqlist(L2.Begin(),L2.End()); //显示所有输入的元素
return 0;
}
第一块:
用指针(不是迭代器,实现输出)
函数模版的形式
template<class T>
void display_seqlist(T *first,T *last)
{
for(;first!=last;++first)
cout<<*first<<'\t';
cout<<endl;
}
第二块:
如何实现两个顺序链表相同位置的互换
思路:利用中间变量
temp=a;
a=b;
b=temp;
data是指针,不是数据
data[i] 数组的形式
头文件 (重点代码)
template<class T>
void SeqList<T>::Cross(SeqList& l,int n)
{
T temp;
for(int i=n;i<10;i++)
{
temp=data[i];
data[i]=l.data[i];
l.data[i]=temp;
}
}