題目要求基本如下:
請編寫一個控制臺程序,要求用戶可以輸入任意組條件,定義兩個字母之間的大小關系。程序可以通過已輸入的條件,推斷出給定的兩個字母之間的大小關系。例如:
用戶輸入:A>B
用戶輸入:B>C
用戶輸入:A?C
程序顯示:A>C
用戶輸入:C<D
用戶輸入:A?D
程序顯示:無法判斷
用戶輸入:A<C
程序顯示:與原有條件沖突
#include <cstdlib>
#include <iostream>
using namespace std;
/*
*數組依次存放A-Z,并保存大于和小于該字母的字母鏈表
*/
const int N = 26;
struct CharNode
{
CharNode( char n,CharNode* p):node(n),next(p){}
char node;
CharNode* next;
};
struct ArrayNode
{
int sign;
CharNode* up;
CharNode* down;
};
ArrayNode array[N];
void Init( )
{
for ( int i = 0; i < N; ++i )
{
array[i].sign = 0;
array[i].up = NULL;
array[i].down = NULL;
}
};
void Free( )
{
CharNode* pChar = NULL;
for ( int i = 0; i < N; ++i )
{
pChar = array[i].up;
while( NULL != pChar )
{
array[i].up = pChar->next;
delete pChar;
pChar = array[i].up;
}
pChar = array[i].down;
while( NULL != pChar )
{
array[i].down = pChar->next;
delete pChar;
pChar = array[i].down;
}
}
};
void Reset( )
{
for ( int i = 0; i < N; ++i )
array[i].sign = 0;
};
void InsertNodeUp( char arraynode, char c )
{
CharNode* pNode = new CharNode(c,NULL);
CharNode* pCharNode = array[arraynode-'A'].up;
if ( NULL != pCharNode )
pNode->next = pCharNode;
array[arraynode-'A'].up = pNode;
};
void InsertNodeDown( char arraynode, char c )
{
CharNode* pNode = new CharNode(c,NULL);
CharNode* pCharNode = array[arraynode-'A'].down;
if ( NULL != pCharNode )
pNode->next = pCharNode;
array[arraynode-'A'].down = pNode;
};
bool _FindUp( char source, char dest )
{
if ( source == dest )
return true;
if ( 1 == array[source-'A'].sign )
return false;
array[source-'A'].sign = 1;
CharNode* pChar = array[source-'A'].up;
while ( NULL != pChar )
{
if ( _FindUp(pChar->node,dest) )
return true;
pChar = pChar->next;
}
return false;
};
bool FindUp( char source, char dest )
{
Reset( );
return _FindUp(source,dest);
};
bool _FindDown( char source, char dest )
{
if ( source == dest )
return true;
if ( 1 == array[source-'A'].sign )
return false;
array[source-'A'].sign = 1;
CharNode* pChar = array[source-'A'].down;
while ( NULL != pChar )
{
if ( _FindDown(pChar->node,dest) )
return true;
pChar = pChar->next;
}
return false;
};
bool FindDown( char source, char dest )
{
Reset( );
return _FindDown(source,dest);
};
int main(int argc, char *argv[])
{
char first;
char compare;
char second;
char minchar;
Init( );
while( 1 )
{
cin >> first >> compare >> second;
minchar = first < second ? first:second;
switch( compare )
{
case '>':
if ( FindUp(first,second) )
{
cout << "Wrong" << endl;
break;
}
InsertNodeDown(first,second);
InsertNodeUp(second,first);
break;
case '<':
if ( FindDown(first,second) )
{
cout << "Wrong" << endl;
break;
}
InsertNodeUp( first,second );
InsertNodeDown( second,first );
break;
case '?':
if ( FindUp(first,second) )
{
cout <<first<<'<'<<second<<endl;
break;
}
if( FindDown(first,second) )
{
cout<<first<<'>'<<second<<endl;
break;
}
cout << "Unknown" << endl;
break;
case 'Q':
goto End;
}
}
End:
Free( );
system("PAUSE");
return EXIT_SUCCESS;
}