某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
class NodeList
{
public:
struct Node
{
int m_start;
int m_end;
Node * pNext;
int Get() { return (m_end - m_start +1);}
};
NodeList();
~NodeList();
void AddNode(Node* p);
int GetNum();
public:
Node* pFirst;
};
NodeList::NodeList()
{
pFirst = NULL;
}
NodeList::~NodeList()
{
Node * pTemp;
while(pFirst != NULL)
{
pTemp = pFirst;
pFirst = pFirst->pNext;
delete pTemp;
}
}
void NodeList::AddNode(NodeList::Node *p)
{
Node* pTemp = NULL;
Node* pTempHeader = NULL;
if(p!= NULL)
{
if(pFirst !=NULL)
{
pTemp = pFirst;
pTempHeader = pFirst;
while(pTemp != NULL)
{
if(p->m_start <= pTemp->m_start)
{
p->pNext = pTemp;
pTempHeader->pNext = p;
break;
}
else
{
if(pTemp->pNext !=NULL)
{
pTempHeader = pTemp;
pTemp = pTemp->pNext;
continue;
}
else
{
pTemp->pNext = p;
break;
}
}
}
}
else
{
pFirst = p;
}
}
}
int NodeList::GetNum()
{
int num = 0;
Node *pTemp = pFirst;
while(pTemp != NULL)
{
if(pTemp->pNext != NULL)
{
if(pTemp->m_end < pTemp->pNext->m_start)
{
num += pTemp->Get();
pTemp = pTemp->pNext;
continue;
}
else
{
if(pTemp->m_end < pTemp->pNext->m_end)
{
pTemp->pNext->m_start = pTemp->m_start;
pTemp = pTemp->pNext;
continue;
}
else
{
pTemp->pNext->m_start = pTemp->m_start;
pTemp->pNext->m_end = pTemp->m_end;
pTemp = pTemp->pNext;
continue;
}
}
}
else
{
num += pTemp->Get();
break;
}
}
return num;
}
int start()
{
NodeList::Node* p = NULL;
NodeList nl;
int L ,m ,start,end;
cout<<"please input int L :/n";
cin>> L;// 总长度
while((L < 1 &&L >10000))
{
cout<<"L is invalid,please retry !";
cin >>L;
}
cout<<"please input int m :/n";
cin>> m;// 区域的组数
while((m < 1 &&m >100))
{
cout<<"m is invalid,please retry !";
cin >>m;
}
for(int i =0;i<m;i++)
{
p = new NodeList::Node();
cout<<"please input (start and end ) numofarray :* "<<i+1<<" *"<<endl;
cin >>start;
cin >>end;
if(start >=end &&end > L)
{
cout<< " start or end is invalid ,please retry";
i--;
}
else
{
p->m_start = start;
p->m_end = end;
nl.AddNode(p);
}
}
return (L -nl.GetNum());
}
void main()
{
int num = start();
system("cls");
cout<<"剩下树的棵数为 :"<< num <<endl;
}