c++ - 计数列表元素

标签 c++ linked-list counter

我正在编写一个双向链表,从给定文件中读取字符串。 因此,我编写了一个名为 Node 的类,在其中我存储了一个字符串(读取的单词)和一些用于字长和其他参数的整数。

从文件中读取所有字符串后,我打开第二个文件并再次读取每个单词并将该单词与链表中的字符串进行比较。之后,我将找到的每个单词存储在结果文件中。

现在我想向用户显示找到的单词在文本中的位置,例如:

"Found the word on the 200 place in the thext file"

因此我创建了一个计数器,每次创建新节点时计数器都会递增。我现在的问题是我的计数器只计算总共创建了多少个节点。所以我只看到创建了大约 56000 个节点,但我无法存储节点数。

我做错了什么?

编辑:我没有尝试减少计数器,因为我从不删除节点。 这是我的完整代码

#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>
#include <cstring>

using namespace std;
class Word
{
    public:
    Word (string inputstring = 0, int b = 0, int c = 0, int l = 0, Word *n = 0, Word *p = 0 ) : word (inputstring), book (b), chapter (c), length (l), next (n), prev (p)
    {
      ++counter;
    }
    int book;
    int chapter;
    int length;
    string word;
    Word *next;
    Word *prev;

    static size_t howMany()
    {
      return counter;
    }

    private:
      static size_t counter;
};

size_t Word::counter;

int main ()
{
    string inputstring = "empty";
    string compare = "empty";
    int l1 = 0;
    int book = 0;
    int chapter = 0;
    int count = 0;
    Word *p = 0;
    Word *x = 0;
    Word *start = 0;

    ifstream file;
    file.open("Beispieltext.txt");

    ofstream outfile;

    if (!file) cout << ("can't open input file");
    else         cout << "File: Beispieltext.txt open\n";

    // create nodes
    while (file >> inputstring)
    {
        l1 = (int)inputstring.length();

        if ( (!(inputstring[0] >= 'A' && inputstring[0] <= 'Z')) && (!(inputstring[0] >= 'a' && inputstring[0] <= 'z'))) inputstring = inputstring.substr(1,l1--); // l1-- reduce length
        while ( (!(inputstring[l1-1] >= 'A' && inputstring[l1-1] <= 'Z')) && (!(inputstring[l1-1] >= 'a' && inputstring[l1-1] <= 'z'))) inputstring = inputstring.substr(0,--l1); // --l1 go till n-1

        // book?
        if (std::strncmp(inputstring.data(), "BOOK", 4) == 0) ++book, chapter = 0/*, cout << "\nBook Nr.: " << book << "\n"*/;

        // Chapter?
        if (std::strncmp(inputstring.data(), "CHAPTER", 7) == 0) ++chapter/*, cout << "chapter: " << chapter << "\n"*/;

        if (p == NULL)
        {
            p = new Word (inputstring);
        } else
        {
            x = new Word (inputstring, book, chapter, l1, 0, p);
            p->next = x;
            p = x;
        }
    }
    file.close();
    cout << "File: Beispieltext.txt closed!\n";

    // n...0
    for (; p; p = p->prev) start = p; // go to start

    // Open compare file 1
    file.open("Suchbegriffe_1.txt");
    if (!file) cout << "Can't open compare file!\n";
    else        cout << "File: Suchbegriffe.txt open!\n";

    // Open result file 1
    outfile.open("Result_1.txt");
    if(!outfile) cout << "Can't open Result_1.txt file!\n";
    else        cout << "File: Result_1.txt open!\n";

    while (file >> compare)
    {
        l1 = (int)compare.length();
        // Search
        x = start;
        // 0...n go to end
        for (; x; x = x->next)
        {
            if (l1 == x->length)
            {
                if (compare == x->word)
                {
                    outfile << "Word: " << compare << " found in book Nr.: " << x->book << ", chapter: " << x->chapter << "!\n";
                    outfile << "Word: " << compare << " is the " << x->howMany() << " Word in the book.\n";
                    count++;
                }
            }
        }
        outfile << "Word: " << compare  << ", " << count << "x found!\n";
        count = 0;
    }
    file.close();
    cout << "File: Suchbegriffe_1.txt closed!\n";
    outfile.close();
    cout << "File: Result.txt closed!\n";

    // Open compare file 2
    file.open("Suchbegriffe_2.txt");
    if (!file) cout << "Can't open compare file!\n";
    else        cout << "File: Suchbegriffe.txt open!\n";

    // Open result file 2
    outfile.open("Result_2.txt");
    if (!outfile) cout << "Can't open Result_2 file!\n";
    else        cout << "File: Result_2.txt open!\n";

    while (file >> compare)
    {
        l1 = (int)compare.length();

        // Search
        x = start;
        // 0...n go to end
        for (; x; x = x->next)
        {
            if (l1 == x->length)
            {
                if (compare == x->word)
                {
                    outfile << "Word: " << compare << " found in book Nr.: " << x->book << ", chapter: " << x->chapter << "!\n";
                    count++;
                }
            }
        }
        outfile << "Word: " << compare  << ", " << count << "x found!\n";
        count = 0;
    }
    file.close();
    cout << "File: Suchbegriffe_2.txt closed!\n";

    outfile.close();
    cout << "File: Result_2.txt closed!\n";
}

最佳答案

My problem now is that my counter is just counting how many nodes are created at whole.

是的,因为您有一个全局计数器来计算创建的节点数。

So I just see there are about 56000 nodes created, but I can't store the number of the node.

如果您希望每个节点都有不同的数字,那么您不能将一个数字存储在一个地方并期望它有多个不同的值!

你需要

  • 要么在每个节点中存储一个数字作为成员变量,而不是静态变量(但如果从节点的开头或中间添加或删除节点,请确保它们都正确列表,如果您要在程序中同时拥有两个列表,请确保列表中的第一个节点的编号为 0,即它必须是 该列表中的编号 而不仅仅是全局节点分配节点的计数器。)

  • ,更简单,只需在遍历列表时保留一个计数器,并为您看到的每个节点递增它。您已经在计算匹配字词的数量,为什么不能只保留所有检查字词的总数,包括不匹配的字词?

例如:

while (file >> compare)
{
    int checked = 0;
    int found = 0;
    for (Word* x = start; x; x = x->next)
    {
        if (compare == x->word)
        {
            outfile << "Word: " << compare << " found in book Nr.: " << x->book << ", chapter: " << x->chapter << " at word " << checked << "!\n";
            found++;
        }
        checked++;
    }
    outfile << "Word: " << compare  << ", " << found << "x found!\n";
}

请注意,我在循环内声明了变量(而不是在函数的顶部)并且没有费心检查字长,因为比较 std::string 已经这样做了。为什么还要将长度存储在 Word 类中? x->word.length() 告诉你长度,你不需要明确地存储它。

此外,这很疯狂:

for (; p; p = p->prev) start = p; // go to start

这通过一个大列表向后查找开始...只需在分配第一个节点时设置开始并保留它!

    x = new Word (inputstring, book, chapter, l1, 0, p);
    if (!start)
        start = x;  // remember the start
    p->next = x;
    p = x;

关于c++ - 计数列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26177474/

相关文章:

Java:替代 LinkedList 或 int 指针数据结构

python - 根据条件在 groupby 数据框上创建汇总表

java - 如何从 .t​​xt 文件中读取字符串并根据出现次数将它们排序到 ArrayList 中?

python - 获取字典值的 value_counts()

c++ - 从 C++ 基类中的函数返回枚举

c++ - libtool: install: error: 在安装之前用上面的命令重新链接 `libmyprog.la'

C++ fill() 与 uninitialized_fill()

javascript - 尝试创建一个 Node 类函数,它接受一个项目数组并将它们全部推送到一个链接列表中

c++ - 为什么在for循环中k == 0时,我的程序返回无用值?

java - 通用节点和对象节点有什么区别