题目链接:http://poj.org/problem?id=1002
思路分析:先对输入字符进行处理,转换为标准形式;插入标准形式的电话号码到查找树中,若有相同号码计数器增加1,再中序遍历查找树。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct TreeNode; typedef char ElementType[30]; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree; struct TreeNode { int Count; ElementType Element; SearchTree Left; SearchTree Right; }; void StrToNum( char *str , char * Tel ); SearchTree MakeEmpty( SearchTree T ); SearchTree Insert( ElementType X, SearchTree T ); void PrintTel( SearchTree T ); int flag = 0; int main() { int n; char Str[100], Tel[100]; SearchTree T = NULL; menset( Tel, 0, sizeof(Tel) ); scanf( "%d", &n ); for ( int i = 0; i < n; ++i ) { scanf( "%s", Str ); StrToNum( Str, Tel ); T = Insert( Tel, T ); } PrintTel( T ); if ( flag == 0 ) printf( "No duplicates.\n" ); return 0; } void PrintTel( SearchTree T ) { if ( T != NULL ) { PrintTel( T->Left ); if ( T->Count > 1 ) { printf( "%s %d\n", T->Element, T->Count ); flag = 1; } PrintTel( T->Right ); } } SearchTree MakeEmpty( SearchTree T ) { if ( T != NULL ) { MakeEmpty( T->Left ); MakeEmpty( T->Right ); free( T ); } return NULL; } SearchTree Insert( ElementType X, SearchTree T ) { if ( T == NULL ) { T = ( Position )malloc( sizeof( struct TreeNode ) ); if ( T == NULL ) { printf( "Out of space" ); return NULL; } else { strcpy( T->Element, X ); T->Left = T->Right = NULL; } } else if ( strcmp(X, T->Element) < 0 ) T->Left = Insert( X, T->Left ); else if ( strcmp(X, T->Element) > 0 ) T->Right = Insert( X, T->Right); return T; } void StrToNum( char *str , char * Tel ) { int i, j; for ( i = j = 0; str[i] != '\0'; i++ ) { if ( str[i] == '-' ); else if ( '0' <= str[i] && str[i] <= '9' ) Tel[j++] = str[i]; else if ( str[i] < 'Q' ) Tel[j++] = ( str[i] - 'A' ) / 3 + 2 + '0'; else Tel[j++] = ( str[i] - 'A' - 1 ) / 3 + 2 + '0'; if ( j == 3 ) Tel[j++] = '-'; } }