C ++链接列表节点计数(需要帮助) [英] C++ Linked List node counting (need help)

查看:27
本文介绍了C ++链接列表节点计数(需要帮助)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个从文本文件获取字符串输入的程序,将内容逐字地插入列表中.我还必须计算重复项的数量.我的程序适用于小的输入文本文件(字符串的1行).但是,每当我向它提供较大的文本文件时,它就会崩溃.任何帮助都会很棒.

I'm trying to create a program that gets string input from a text file, inserting the content into a list, word by word. I also have to calculate the numbers of the duplicates. My program works fine for the small input text file (1 line of string). But whenever I feed it with a bigger text file, it crashes. Any help will be great.

这是我的代码:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

class Bag
{
    private:
        struct BagNode
        {
            string dataValue;
            int dataCount;
            BagNode *next;
            BagNode(string);
        };

        BagNode *root;
        string removePunctuations(string);
        string toLower(string);
        void insertData(string);

    public:
        Bag();
        void procesFile(string, string);
        void removeData(string);
        void traverse();
};

Bag::BagNode::BagNode(string _data)
{
    dataValue.assign(_data);
    dataCount=1;
    next = NULL;
}

Bag::Bag()
{
    root = NULL;
}

void Bag::procesFile(string ifile, string ofile)
{
    ifstream infile;
    infile.open(ifile.c_str());
    if (!infile.good())
    {
        cout<<"Input file not opening."<<endl;
        return;
    }

    string line;
    while(getline(infile,line))
    {
        stringstream lineStream(line);
        string token = "";
        while(lineStream >> token)
        {
            insertData(removePunctuations(token));
        }
    }
    infile.close();
    traverse();
    cout<< endl <<"File processed successfully." << endl;
}

string Bag::removePunctuations(string data)
{
    int length = data.size();
    for(int i = 0; i < length; i++)
    {
        if(ispunct(data[i]))
        {
            data.erase(i--, 1);
            length = data.size();
        }
    }
    return data;
}

string Bag::toLower(string data)
{
    for(int i = 0; data[i]; i++){
      data[i] = tolower(data[i]);
    }
    return data;
}

void Bag::insertData(string data)
{
    BagNode *n = new BagNode(data);
    if (root == NULL)
    {
        root = n;
        return;
    }

    BagNode *temp = root;
    BagNode *prev = NULL;

    string tdata;
    data.assign(toLower(data));
    while(temp != NULL)
    {
        tdata.assign(temp->dataValue);
        tdata.assign(toLower(tdata));
        if (tdata.compare(data) == 0)
        {
            temp->dataCount++;
            return;
        }
        else
        {
            if (data.compare(tdata) < 0)
            {
                if (temp == root)
                {
                    n->next = temp;
                    root = n;
                    return;
                }
                else
                {
                    n->next = temp;
                    prev->next = n;
                    return;
                }
            }
        }
        prev = temp;
        temp = temp->next;
    }

    n->next = temp;
    prev->next = n;
}

void Bag::removeData(string data)
{
    BagNode *temp = root;
    BagNode *prev = NULL;

    if (root->dataValue.compare(data)==0)
    {
        if (root->dataCount > 1)
            root->dataCount--;
        else
        {
            delete root;
            root = NULL;
        }
        cout<<"Data removed successfully."<<endl;
        return;
    }
    while (temp != NULL)
    {
        if (temp->dataValue.compare(data)==0)
        {
            if (temp->dataCount > 1)
                temp->dataCount--;
            else
            {
                prev->next = temp->next;
                delete temp;
                temp = NULL;
            }
            cout<<"Data removed successfully."<<endl;
            return;
        }
        prev = temp;
        temp = temp->next;
    }
    cout<<"Data not found match."<<endl;
}

void Bag::traverse()
{
    if (root == NULL)
    {
        cout<<"No data."<<endl;
        return;
    }

    BagNode *temp = root;
    while(temp != NULL)
    {
        if (temp->dataCount > 1)
            cout << temp -> dataValue << "(" << temp->dataCount << ")" << endl;
        else
            cout << temp -> dataValue << endl;
         temp = temp->next;
    }
}

int main(int argc, char *argv[])
{
    bool outputConsole = false;
    string infile, outfile = "\0";
    cout << "Welcome!" << endl; 
    int option = -1;
    do{
        if (argc==1 || option == 1)
        {
            cout << "Enter the input file: ";
            cin >> infile;
            cout << "Enter the output file: ";
            cin >> outfile;
        }
        else
        {
            infile.assign(argv[1]);
            if (argc == 3)
                outfile.assign(argv[2]);
        }

        Bag b;
        b.procesFile(infile,outfile);
        //b.traverse();

        cout<<endl<<"If you want to input another file press 1 or 2 to quit: ";
        cin>>option;
    }while (option != 2);

    return 0;
}

推荐答案

如果单词排序不是问题,则应真正尝试使用哈希表而不是链表,因为哈希表适合跟踪重复项.这将导致 O(1) 插入操作(在理想情况下)

If ordering of words is not an issue,you should really try and use a hash table instead of a linked list as hash table is suitable for keeping track of duplicates.This will lead to O(1) insert operation (in ideal situation)

这篇关于C ++链接列表节点计数(需要帮助)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆