C ++ Linked List - Чтение в файле и сортировка его по числу

anonymous спросил: 28 апреля 2018 в 08:53 в: c++

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

e 2
b 1
a 3   
h 5
c 4

Если бы я сортировал их по номеру, я бы получил слово "пляж". Мне нужно сделать это, но в большем масштабе. В настоящее время у меня две ошибки. Есть строки, которые я читаю, в которых есть пробел и число ["" 6], и моя программа не добавит их / не сортирует в мой связанный список, и поэтому это вызывает ошибку сегментации, потому что мой цикл цикла для печати предназначен для цикла через все 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 ответ

Robert Andrzejuk ответил: 28 апреля 2018 в 11:58

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

ss >> word

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

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

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