问题如下:

写一个程序,读取文本文件,判断关系结构是否存在错误。文件格式如下:

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");

}

 欢迎拍砖!!!

posted on 2012-06-18 10:58  足球王子  阅读(540)  评论(0)    收藏  举报