C ++ Linked List - чтение в файле и сортировка его по номеру - PullRequest
0 голосов
/ 22 мая 2018

Я работаю над чтением в файле.Строка за строкой заполняется такими вещами, как:

e 2
b 1
a 3   
h 5
c 4

Если бы я отсортировал их по номеру, я бы получил слово «пляж».Мне нужно сделать это, но в большем масштабе.У меня сейчас две ошибки.Есть строки, которые я прочитал, в которых есть пробел и число ["" 6], и моя программа не будет добавлять их / сортировать их в мой связанный список, и поэтому это вызывает ошибку сегментации, потому что цикл for для печати предназначен для циклачерез все 53 слова.

Есть ли какое-нибудь решение, почему пробелы не отображаются в моем связанном списке?Кроме того, около 44/53 слов правильно находят свои места, используя мою функцию addInOrder, но есть некоторые, которые этого не делают, есть ли причина для этого?

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
#include <ctype.h>

using namespace std;

struct ListNode
{
    string letter;
    string num;
    ListNode *next;
};

void append(ListNode *&h, string l, string n);
void addInOrder(ListNode *&h, string l, string n);
void printList(ListNode *h, int &lengthOfFile);
void deleteNode(ListNode *&h, string l, string n);
void deleteList(ListNode *&h);

int main()
{
    string letter;
    string num;
    string lines;
    int lengthOfFile = 0;
    const string FILENAME = "file link";
    ifstream inFile(FILENAME);

    /*if (inFile)
    {
        while (getline( inFile, lines )) 
        {
            lengthOfFile++;
            cout << "Hello...1" << endl;
        }
    }*/
    ListNode *head = nullptr;

    if (inFile)
    {
        string line;
        for (int lineNum = 1; getline(inFile, line); lineNum++)
        {
            stringstream ss(line);
            string word;

            for (int wordNum = 1; ss >> word; wordNum++)
            {

                if (wordNum == 1)
                {
                    char c = word[0];

                    if (isalpha(c))
                    {
                        cout << "letter: " << c << endl;
                        letter = c;
                    }
                    else if (word == "!" or word == ".")
                    {
                        cout << "letter: " << word << endl;
                        letter = word;
                    }
                    else if (word != "!" or word != ".")
                    {
                        cout << "letter: " << "  " << endl;
                        cout << "number: " << word << endl;
                        letter = "  ";
                        num = word;
                        lengthOfFile++;
                    }
                }
                if (wordNum == 2)
                {
                    cout << "number: " << word;
                    num = word;
                    lengthOfFile++;
                }
                if (wordNum == 2)
                {
                    cout << endl;
                    append(head, letter, num);
                    //cout << "letter: " << letter << "   and   num: " << num << endl;
                    cout << endl;
                    addInOrder(head, letter, num);
                    //cout << "letter: " << letter << "   and   num: " << num << endl;
                    cout << endl;
                    cout << endl;
                    cout << endl;
                }
            }
            cout << endl;
        }
    inFile.close();
    }

    cout << "lengthOfFile++;: " << lengthOfFile << endl;

    printList(head, lengthOfFile);
}

void append(ListNode *&h, string l, string n)
{
    // create a new ListNode and set data and next
    ListNode *newNode;
    newNode = new ListNode;
    newNode->letter = l;
    //cout << "l: " << l << endl;
    newNode->num = n;
    //cout << "n: " << n << endl;
    newNode->next = nullptr;
}

void addInOrder(ListNode *&h, string l, string n)
{
    // create a new ListNode and set data
    ListNode *newNode;
    newNode = new ListNode;
    newNode->letter = l;
    //cout << "l: " << l << endl;
    newNode->num = n;
    //cout << "n: " << n << endl;
    newNode->next = nullptr;

    // if list is empty, assign head to new ListNode; otherwise, 
    // find where to add in (non-descending) order
    if (h == nullptr)
    {
        h = newNode;
        newNode->next = nullptr;
    }
    else
    {
        ListNode *prev = nullptr;
        ListNode *curr = h;

        // find location to add
        while (curr != nullptr && curr->num < n)
        {
            prev = curr;
            curr = curr->next;
        }

        // if prev is nullptr, then we're adding to the beginning
        // of the list; else, adding to end or between two nodes
        if (prev == nullptr)
        {
            h = newNode;                    
            newNode->next = curr;
        }
        else
        {
            prev->next = newNode;
            newNode->next = curr;
        }
    }
}

void printList(ListNode *h, int &lengthOfFile)
{
    ListNode * ptr = h; 

    // loop through and print data
    for(int i = 0; i < lengthOfFile; i++)
    {
        cout << ptr->letter << " ";
        cout << ptr->num << " ";
        cout << endl;
        ptr = ptr->next;
    }
}

1 Ответ

0 голосов
/ 22 мая 2018

1) Проблема в следующей строке:

ss >> word

operator >> поглощает пробел и ищет действительный (не пробел) символ.

Чтобы получитьследует использовать один символ из потока ss.get().

2) Если вы хотите сравнить символьный литерал, используйте один апостроф '.Но потом также не забудьте извлечь символ из line.

...