~cpp #include <iostream> using namespace std; #include <cstring> struct Node { Node * front; char * data; struct Node * next; }; void inDictionary(Node & dic); void inWords(Node & word); void enNode(Node & node, int type = 1); void isDoublet(Node & dic, Node & word); void showDoublet(Node * dou); int main() { Node dictionary; Node words; inDictionary(dictionary); inWords(words); isDoublet(dictionary, words); return 0; } void inDictionary(Node & dic) { enNode(dic); } void inWords(Node & word) { enNode(word, 2); } void enNode(Node & node, int type) { char word[17]; node.front = NULL; int count = 0; while (cin.peek() != '\n') { if (type == 1) cin.getline(word, 17, '\n'); if (type == 2) { if (count % 2 == 0) cin.getline(word, 17, ' '); else cin.getline(word, 17, '\n'); count++; } int len = strlen(word); Node * temp = new Node; temp->data = new char[len + 1]; strcpy(temp->data, word); temp->next = NULL; if (node.front == NULL) { node.front = temp; node.next = node.front; } else { node.next->next = temp; node.next = node.next->next; } } cin.get(); } void isDoublet(Node & dic, Node & word) { word.next = word.front; char formerWord[17] = "None"; char first[17], second[17]; while(word.next != NULL) { strcpy(first, word.next->data); word.next = word.next->next; strcpy(second, word.next->data); word.next = word.next->next; dic.next = dic.front; Node * doublet = new Node; doublet->front = NULL; Node * temp = new Node; temp->data = new char[strlen(first) + 1]; strcpy(temp->data, first); temp->next = NULL; doublet->front = temp; doublet->next = doublet->front; while (true) { if (dic.next == NULL) { cout << "No solution.\n"; break; } if (strcmp(first, second) == 0) { showDoublet(doublet); break; } int gap = 0; for (int i=0; i<strlen(first); i++) { if (strlen(first) != strlen(dic.next->data)) { gap--; break; } if (first[i] != dic.next->data[i]) gap++; if (gap > 1) break; } if (gap == 1 && strcmp(formerWord, dic.next->data) != 0) { Node * temp = new Node; temp->data = new char[strlen(first) + 1]; strcpy(temp->data, dic.next->data); temp->next = NULL; doublet->next->next = temp; doublet->next = doublet->next->next; strcpy(formerWord, first); strcpy(first, dic.next->data); dic.next = dic.front; } else dic.next = dic.next->next; } delete temp, doublet; if (word.next != NULL) cout << endl; } } void showDoublet(Node * dou) { dou->next = dou->front; while (dou->next != NULL) { cout << dou->next->data << endl; dou->next = dou->next->next; } }