テキスト ファイルを読み込んで、C++ で検索できるように整理しています。キーワードの配列と Web ページのリンク リストをテキスト ファイルに作成する必要があります。次に、各キーワードがノード自体へのポインターのリンクされたリストを持つことにより、キーワードを Web ページにリンクする必要があります。キーワード配列はアルファベット順である必要があり、Web ページ リストの順序は関係ありません。キーワードごとのリストがうまく機能していないようです。
これはキーワード クラスです。
class KeywordList
{
private:
friend std::ostream& operator<<(std::ostream&, const KeywordList&);
public:
struct Keyword
{
std::string word;
std::list<WebPageList::WebPage*> list;
};
Keyword keywords [1000];
std::size_t size;
KeywordList()
{
size = 0;
}
~KeywordList() {}
void add(std::string value, WebPageList::WebPage* page)
{
bool keepGoing = true;
int i = 0;
while (keepGoing)
{
if (value == keywords[i].word)
{
keywords[i].list.push_front(page);
keepGoing = false;
} else if (i == size)
{
keywords[i].word = value;
keywords[i].list.push_front(page);
keepGoing = false;
++size;
} else if (value < keywords[i].word)
{
for (int j = size; j > i; --j)
{
keywords[j].word = keywords[j - 1].word;
keywords[j].list = keywords[j - 1].list;
}
keywords[i].word = value;
keywords[i].list.push_front(page);
keepGoing = false;
++size;
} else {
++i;
}
}
}
void search(std::string);
void printAllData()
{
for (int i = 0; i < size; ++i)
{
std::cout << keywords[i].word << " : " << keywords[i].list.size() << " : ";
WebPageList::WebPage * pagesList = keywords[i].list.front();
while (pagesList)
{
std::cout << pagesList->url << " ";
pagesList = pagesList->next;
}
std::cout << std::endl;
}
std::cout << std::endl;
}
これはウェブページのリンクされたリストです:
class WebPageList
{
public:
struct WebPage
{
std::string url;
WebPage * next;
};
WebPage * head;
WebPageList()
{
head = NULL;
}
void add(std::string value)
{
WebPage * newPage;
newPage = new WebPage;
newPage->url = value;
if (!head)
{
head = newPage;
newPage->next = NULL;
}
else
{
newPage->next = head;
head = newPage;
}
}
void printAllPages()
{
WebPage * page = head;
while (page)
{
std::cout << page->url << std::endl;
page = page->next;
}
}
そして、これがメインです:
ifstream dataFile;
dataFile.open(argv[1], std::ios::in);
KeywordList keywordList;
WebPageList mainPages;
int i = 0;
std::string line;
while (getline(dataFile, line))
{
std::string keyword, url;
std::istringstream lineStream(line);
lineStream >> url;
mainPages.add(url);
WebPageList::WebPage * passingPage = mainPages.head;
while (lineStream >> keyword)
{
keywordList.add(keyword, passingPage);
cout << endl;
keywordList.printAllData();
}
}
mainPages.printAllPages();
dataFile.close();
これが私が得る出力です:
structures : 1 : http://test1
structures : 1 : http://test1
zzz : 1 : http://something http://test1
structures : 1 : http://test1
zalgorithms : 2 : http://www.algorithms.com/ http://something http://test1
zzz : 1 : http://something http://test1
structures : 1 : http://test1
zalgorithms : 2 : http://www.algorithms.com/ http://something http://test1
zzz : 2 : http://somethingelse http://www.algorithms.com/ http://something http://test1
http://somethingelse
http://www.algorithms.com/
http://something
http://test1
これは、次の入力ファイルに基づいています。
http://test1 structures
http://something zzz
http://www.algorithms.com/ zalgorithms
http://somethingelse zzz
私は大きな損失を被っているので、どんな助けも本当に感謝しています!