函数Step5TraverseProcess: void Step5TraverseProcess(WORD_NODE* plist, ostream& out) { WORD_NODE* pnext = plist; vector<WORD_NODE*> VarWordsList; vector<WORD_NODE*>::iterator i; // list<WORD_NODE*> 使用STL链表保存结果,链表的每一个节点是WORD_NODE链表,这个WORD_NODE链表中保存的都是变位词 // 遍历WORD_NODE List,读取每一个WORD; // 遍历VarWordsList;比较wordNode->SortedStr和VarWordsList的每一个节点,相同则插入到该节点。 // 遍历结束没有找到,则插入到VarWordsList末尾。 do { bool bFoundVarNode = false; for ( i = VarWordsList.begin(); i < VarWordsList.end(); i++ ) { WORD_NODE *pSortedWord = (*i); if ( 0 == strcmp(pSortedWord->sorted_str, pnext->sorted_str) ) { WORD_NODE* ptemp = pnext; pnext = pnext->next; WORD_NODE* ptemp2 = pSortedWord->next; pSortedWord->next = ptemp; ptemp->next =ptemp2; bFoundVarNode = true; break; } } if ( !bFoundVarNode ) { WORD_NODE *ptemp = pnext; pnext = pnext->next; ptemp->next = NULL; VarWordsList.push_back(ptemp); } } while (NULL != pnext); for ( i = VarWordsList.begin(); i < VarWordsList.end(); i++ ) { vector<char*> str_arr; vector<char*>::iterator j; WORD_NODE *pWordList = (*i); // out << pWordList->sorted_str << ":/t"; while ( NULL != pWordList ){ bool bSameWord = false; for ( j = str_arr.begin(); j < str_arr.end(); j++) { char* pword = (*j); if ( 0 == strcmp(pword, pWordList->str) ){ bSameWord = true; } } if ( !bSameWord) { out << pWordList->str << "/t"; str_arr.push_back(pWordList->str); } pWordList = pWordList->next; } out << "/n"; } } 函数Step6TraverseProcess: #define VARWORDS_SIZE 100 void Step6TraverseProcess(WORD_NODE* plist, ostream& out) { WORD_NODE* pnext = plist; WORD_NODE* VarWordsList[VARWORDS_SIZE]; int cur_pos=0; memset(VarWordsList, 0, sizeof(WORD_NODE*)*VARWORDS_SIZE); // list<WORD_NODE*> 使用STL链表保存结果,链表的每一个节点是WORD_NODE链表,这个WORD_NODE链表中保存的都是变位词 // 遍历WORD_NODE List,读取每一个WORD; // 遍历VarWordsList;比较wordNode->SortedStr和VarWordsList的每一个节点,相同则插入到该节点。 // 遍历结束没有找到,则插入到VarWordsList末尾。 WORD_NODE head; WORD_NODE* phead = &head; memset(phead, 0, sizeof(WORD_NODE)); do { bool bFoundVarNode = false; for ( int i = 0; i < VARWORDS_SIZE; i++ ) { if ( NULL == VarWordsList[i] ){ break;} WORD_NODE *pSortedWord = VarWordsList[i]; if ( 0 == strcmp(pSortedWord->sorted_str, pnext->sorted_str) ) { WORD_NODE* ptemp = pnext; pnext = pnext->next; ptemp->next = NULL; phead = &head; phead->next = pSortedWord; bool bInOutList = false; while ( NULL != phead->next ) { int iRet = strcmp(phead->next->str, ptemp->str); if ( iRet >= 0){ WORD_NODE* ptemp2 = phead->next; phead->next = ptemp; ptemp->next = ptemp2; bInOutList = true; VarWordsList[i]=head.next; break; } phead = phead->next; } if ( !bInOutList ){ phead->next = ptemp; } bFoundVarNode = true; break; } } if ( !bFoundVarNode ) { WORD_NODE *ptemp = pnext; pnext = pnext->next; ptemp->next = NULL; if ( cur_pos >= VARWORDS_SIZE ){ cerr << "VarWordsList overflow" << endl; exit(-3); } VarWordsList[cur_pos++] = ptemp; } } while (NULL != pnext); for (int i = 0; i < VARWORDS_SIZE; i++ ) { if ( NULL == VarWordsList[i] ){ break;} WORD_NODE* pwordlist = VarWordsList[i]; do { if ( NULL == pwordlist->next ) { out << pwordlist->str << " "; break;} if ( 0 != strcmp(pwordlist->str, pwordlist->next->str) ) { out << pwordlist->str << " ";} // out << pwordlist->str << " "; pwordlist = pwordlist->next; } while ( NULL != pwordlist ); out << "/n"; } }