C ++ Linked List节点计数(需要帮助)

时间:2016-11-08 00:40:57

标签: c++ linked-list

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

这是我的代码:

#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;
}

1 个答案:

答案 0 :(得分:0)

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