持之以恒
分类:
2009-12-15 22:51:31
算法的基本的思想:这个是我们寝室的牛人Yang同学的成果,我拿过来学习一下,呵呵。
void main()
{
While (A不为空)
{
a=first(A); //取出A中第一个元素
while (a not in list)//是否形成了一个环,a在List中说明形成了一个环
{
if (a not in A) //a已经从A中删除,但是a已经不在list中,想想说明什么?
//这个是说明a曾经在list中存在过,也就是a已经是一个环的一部分
//这句话的目的是是为了去尾巴,当然这个尾巴是为了去后面加的尾
//巴,还有一种是为了去前面的尾巴
{
clear(list);
break;
}
delete(a); //将a从A中删除
list.add(a);
a=f(a);
}
copyList(a,list,S); //将list中从a到结束的元素拷贝到S中,为什么从a开始就是为
//了去掉前面可能出现的尾巴,呵呵
clear(list);
}
output(S);
}
程序代码如下:
#pragma once
#include
#include
#include
#include
//===================================================//
数据结构A
class A
{
public:
char * m_pData;
size_t m_length;
public:
A(int length = 6);
~A();
A(const A &);
A & operator=(const A &);
public:
char GetFristData();//获得数组中的第一个数据
void DeleteData(char a);//将数组中的元素值为a的元素删除
bool IsEmpty();
bool IsInA(char a);
};
A::A(int length)
{
_ASSERT(length > 0);
m_length = length;
m_pData = new char[m_length + 1];
memset(m_pData,'\0',m_length + 1);
}
A::~A()
{
}
A::A(const A & a)
{
if (this != &a)
{
m_length = a.m_length;
delete[] m_pData;
m_pData = new char[m_length + 1];
memcpy(m_pData,a.m_pData,m_length);
m_pData[m_length] = '\0';
}
}
A & A::operator=(const A & a)
{
if (this != &a)
{
m_length = a.m_length;
delete[] m_pData;
m_pData = new char[m_length + 1];
memcpy(m_pData,a.m_pData,m_length);
m_pData[m_length] = '\0';
}
return *this;
}
char A::GetFristData()
{
if (m_length > 0)
{
return m_pData[0];
}
}
bool A::IsEmpty()
{
return m_length == 0;
}
bool A::IsInA(char a)
{
for (int i = 0;i < m_length;i++)
{
if (m_pData[i] == a)
{
return true;
}
}
return false;
}
void A::DeleteData(char a)
{
//删除A集合中的所有的元素值为a的单元
std::vector
for (size_t i = 0;i < m_length;i++)
{
if (m_pData[i] == a)
{
deleteIndexVec.push_back(i);
}
}
if (!deleteIndexVec.empty())
{
if (m_length - deleteIndexVec.size() != 0)
{
char * data = new char[m_length - deleteIndexVec.size() + 1];
char * tmp = data;
for (size_t i = 0;i < m_length;i++)
{
if (m_pData[i] != a)
{
memcpy(tmp,&m_pData[i],sizeof(char));
tmp += sizeof(char);
}
}
data[m_length - deleteIndexVec.size()] = '\0';
delete [] m_pData;
m_pData = NULL;
m_length = m_length - deleteIndexVec.size();
m_pData = data;
tmp = NULL;
}
else
{
m_length = 0;
delete [] m_pData;
m_pData = NULL;
}
}
}
//=======================================================//
bool FindElement(char toBeFind,const std::vector
{
bool bRet = false;
std::vector
if (It == vec.end())
{
return bRet;//没找到
}
else
{
bRet = true;
return bRet;
}
}
char f(const char & a)//映射函数f
{
switch (a)
{
case 'A':
return 'B';
break;
case 'B':
return 'C';
break;
case 'C':
return 'D';
break;
case 'D':
return 'C';
break;
}
}
//=====================================================//
void main()
{
A a(4);
a.m_pData[0] = 'A';
a.m_pData[1] = 'B';
a.m_pData[2] = 'C';
a.m_pData[3] = 'D';
std::vector
list.clear();
std::vector
S.clear();
char dataToProcess;
while(!a.IsEmpty())
{
dataToProcess = a.GetFristData(); //取出A中第一个元素
while (!FindElement(dataToProcess,list))//还没有形成环
{
if (!a.IsInA(dataToProcess)) //a已经从A中删除
{
list.clear();
break;
}
a.DeleteData(dataToProcess); //将a从A中删除
list.push_back(dataToProcess);
dataToProcess = f(dataToProcess);
}
if (!list.empty())
{
std::vector
std::copy(listIt,list.end(),std::back_inserter(S));
list.clear();
}
}
if (!S.empty())
{
for (std::vector
{
std::cout<<*sIt<<",";
}
std::cout<
else
{
std::cout<<"不存在"<
getchar();
}
//---------------------------------------------------------------------------------------//
测试数据:
集合A: ABCD
映射函数f
A->B B->C C->D D->C
程序结果:
S中集合的元素:CD