问题如下:
写一个程序,读取文本文件,判断关系结构是否存在错误。文件格式如下:
1,2
4,2
3,5
8,1
2, 8
…
每一行的两个数字a,b表示a>b 上面的文件中,因为1>2 8>1 所以当读到2>8时要返回错误,并指出错误的行号。如果没有错误 那么把正确的结果排序输出。
解决思路如下:
要想判断后续的序列是否存在逻辑错误,必须将每个元素的后续元素都保存起来。比如,1是大于2的。必须将2保存起来,并和1关联。8是大于1的,并且1大于2,因此必须将8>1>2都保存起来。
我的程序如下:
#include<iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef vector<int> myvector;
typedef map<int,std::vector<int> > myorder;
myorder orderList; //定义一个全局变量
//添加一个元素
void insertIntoMyList(int data)
{
myvector vec;
vec.push_back(data);
orderList.insert(myorder::value_type(data,vec));
}
//添加元素(子类表已知)
void insertIntoMyList(int data,myvector vec)
{
orderList.insert(myorder::value_type(data,vec));
}
//添加元素,data1和data2都存在于列表中
void AllExitInsertIntoMyList(int data1,int data2)
{
myorder::iterator iter,iter1;
myvector vector1;
myvector vector2;
for (iter=orderList.begin();iter!=orderList.end();iter++)
{
if (iter->first==data2) //找到元素data2
{
vector2=iter->second;
}
if (iter->first==data1) //找到元素data1
{
iter1=iter;
vector1=iter->second;
}
}
//将data2的vector添加到data1
for (int i=0;i<vector2.size();i++)
{
vector1.push_back(vector2[i]);
}
iter1->second=vector1;
}
//将数据插入到MapList,data1和data2都不存在
void insertIntoMyList(int data1,int data2)
{
vector<int> vec2,vec1;
vec2.push_back(data2);
orderList.insert(myorder::value_type(data2,vec2));
vec1.push_back(data1);
vec1.push_back(data2);
orderList.insert(myorder::value_type(data1,vec1));
}
//判断某一个元素是否存在
bool JustElement(int data)
{
myorder::iterator iter;
for (iter=orderList.begin();iter!=orderList.end();iter++)
{
if (iter->first==data) //找到元素data2
{
return true;
}
}
return false;
}
//添加新元素后,更新相关数据
void FlushList(int data1)
{
myorder::iterator iter,iter1;
myvector vec1;
//获取子列表
for (iter=orderList.begin();iter!=orderList.end();iter++)
{
if (iter->first==data1)
{
vec1=iter->second;
}
}
//更新
for (iter=orderList.begin();iter!=orderList.end();iter++)
{
for (int i=0;i<iter->second.size();i++)
{
if (iter->second[i]==data1)
{
//添加data的子表到此元素
for (int j=0;j<vec1.size();j++)
{
iter->second.push_back(vec1[j]);
}
break;
}
}
}
}
//向MapList表中添加数据
void AddElement(int data1,int data2)
{
myorder::iterator iter,iter1;
myvector vector1;
myvector vector2;
if (JustElement(data1))//找到元素data1
{
if (JustElement(data2)) //如果有data2
{
AllExitInsertIntoMyList(data1,data2);
//更新表
FlushList(data1);
}
else
{
//如果没有data2
//首先添加data2
insertIntoMyList(data2);
//更新data1
AllExitInsertIntoMyList(data1,data2);
//更新表
FlushList(data1);
}
}
else //不存在data1
{
if (JustElement(data2)) //如果有data2
{
for (iter=orderList.begin();iter!=orderList.end();iter++)
{
if (iter->first==data2) //找到元素data2
{
vector2=iter->second;
}
}
//添加data1
vector2.push_back(data1);
insertIntoMyList(data1,vector2);
}
else
{
insertIntoMyList(data1,data2);
}
}
}
//判断是否存在逻辑错误
bool JustError(int data1,int data2)
{
myorder::iterator iter;
myvector vector1;
for (iter=orderList.begin();iter!=orderList.end();iter++)
{
if (iter->first==data2) //找到元素data2
{
vector1=iter->second;
for(int i=0;i<vector1.size();i++)
{
if (vector1[i]==data1)
{
return true;
}
}
}
}
return false;
}
void main()
{
FILE *readFile;
int countLine=0; //记录是第几行
readFile=fopen("aaa.txt","r");
while(!feof(readFile))
{
int data1,data2;
fscanf(readFile,"%d %d",&data1,&data2);
countLine=countLine+1;
//如果orderlist为空,则这俩个数据直接入表
if (orderList.size()==0)
{
insertIntoMyList(data1,data2);
}
//如果不为空,先查找表
else
{
if (JustError(data1,data2))
{
cout<<countLine<<"行出错!"<<endl;
continue;
}
else
{
AddElement(data1,data2);
}
}
}
//去重
for (myorder::iterator iter=orderList.begin();iter!=orderList.end();iter++)
{
//首先去掉vector重复元素
sort( iter->second.begin(), iter->second.end() ); //先排序
iter->second.erase( unique( iter->second.begin(), iter->second.end() ), iter->second.end() ); //调用unique算法
}
//遍历显示
for (myorder::iterator newiter=orderList.begin();newiter!=orderList.end();newiter++)
{
cout<<newiter->first<<"值:"<<endl;
for (int i=0;i<newiter->second.size();i++)
{
cout<<newiter->second[i]<<endl;
}
cout<<"结束"<<endl;
}
system("pause");
}
欢迎拍砖!!!
浙公网安备 33010602011771号