C++ | 一道例题

遗传算法是经典的进化算法之一,其中涉及选择、交叉、变异等操作,现用两个大小为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;
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值