c++ - 删除某些节点

标签 c++

我创建了一个数据包结构。我读取一个文件的文本并将每个单词插入一个节点,然后如果有相同的字符串则增加计数。但我的问题是,我只想输出一串相同的字符串和它被使用的次数。但是每当我使用我的删除功能时,它都会删除我文件中的所有内容,如果我不使用它,我会得到如下所示的输出。我不知道我做错了什么,有没有办法不输出重复的字符串?

ofstream output;
struct  BagNode
{
    string dataValue;
    string dataCopy;
    int dataCountCopy;
    int dataCount;
    BagNode * next;
};
class Bag{
private:

BagNode * head;

public:

Bag()
{
    head = NULL;

}
void insert(string v)
{
    if(head == NULL){ //empty list
        head = new BagNode;
        removePunct(v);
        head->dataValue = v;
        transform(v.begin(), v.end(), v.begin(), ::tolower);
        head->dataCopy = v;
        head->next = NULL;

    }
    else
    {
            BagNode * n = new BagNode;      // new node
            removePunct(v);
            n->dataValue = v;
            transform(v.begin(), v.end(), v.begin(), ::tolower);
            n->dataCopy = v;
            BagNode * current = head;           //for traversal
            //current = head;
            n->dataCount = 0;
                if(current->dataCopy > v)
                {                       
                    n->next = head;
                    head = n;
                }
                else{           //mid and tail insert
                    while(current->next && current->next->dataCopy < v)
                    {
                        current = current->next;
                    }
                    n->next = current->next;
                    current->next = n;

                }   

    }
    BagNode * check = new BagNode;
    for(check = head; check->next != NULL; check = check->next) 
    {
        if(check->dataCopy == v)//isSame(check->dataValue, v)) 
        {
            check->dataCount++;
        }

    }

}
 bool remove(string v) //bool
{
    bool status;
    if(head == NULL){
        status = false;
    }
    else if(head->dataCopy > v)
    {//(head->dataValue > v){
        status = false;
    }
    else if(head->dataCopy == v)
    {
        BagNode * t = head;
        head = head->next;
        delete t;
        status = true;
    }
    else//general case
    {
        BagNode * current = head;
        while(current->next && current->next->dataCopy < v){
            current = current->next;
        }
        if(current->next == NULL)
        {
            status = false;
        }
        else if(current->next->dataCopy == v)   //found it
        {
            BagNode *t = current->next;
            current->next = current->next->next;
            delete t;
            status = true;
        }
        else
        {
            status = false;
        }
    }
    return status;
}
void traverse()
{
    BagNode * current;

    current = head;
    while(current)
    {
            output << current->dataValue << " (" << current->dataCount << ")" << " ";
            current = current->next;

    }
    cout << endl;
}

Output: 10Annette (1) 1805 (1) 7 (1) a (1) a (2) a (3) a (4) a (5) a (6) All (1) all (2) an (1) and (1) and (2) and (3) and (4) and (5) and (6) and (10) and (7)

if(!inputFile)
    {
        cout << "Could Not Open " << fileName << " File" << endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        while(inputFile >> text)
        {
            theBag.insert(text);

        }
        cout << "Processing File Complete" << endl;
        cout << "Please Enter An Output File Name: ";
        getline(cin,outputFilename);
        output.open(outputFilename);
        theBag.traverse();
        theBag.remove(text);
        inputFile.close();
        output.close();
    }

最佳答案

如果您在插入函数中查看此处,您实际上是在用该值接触每个节点。所以如果 v = "And" 每个单独的 "And"词都会增加它的数据计数。这会使您在每个节点上获得正确的单词计数。

for(check = head; check->next != NULL; check = check->next) 
{
    if(check->dataCopy == v)//isSame(check->dataValue, v)) 
    {
        check->dataCount++;
    }
}

似乎您可以利用该行为使您的插入更简单。

关于c++ - 删除某些节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40520003/

相关文章:

c++ - 如何使用 Boost 库比较两个不同的日期?

c++ - 虚函数是在编译期间确定的吗?

python - swig 将元组列表传递给 C++ 函数

c++ - 临时对象存储在哪里?

C++:输出文件中ASCII字符频率计数结果时出现奇怪的数字

c++ - 我如何获得与打开它们的应用程序关联的端口?

使用外部函数的 C++ 模板

c++ - Reader/Writer : multiple heavy readers, 每天只写 1 次

c++ - 如何在arduino上使函数返回字符串?

c++ - 链接列表中的错误