C ++: сортировка связанного списка по порядку по ошибке номера - PullRequest
0 голосов
/ 22 мая 2018

Файл, который я читаю, выглядит следующим образом:

t 44

c 13

a 47

19

g 41

n 51

.4

и так далее, всего 53 строки.Мне нужно прочитать эти строки и привести их в порядок, используя функцию addInOrder.Я сделал тест с Cout's, и я увидел, что

буква = т, число = 44, голова = 44

буква = с, число = 13, голова = 13

буква = а, число = 47, голова = 13

буква: [пробел], число = 19, голова = 13

буква: г, число = 41, голова = 13

буква: n, номер = 51, голова = 13

буква:., num = 4, head = 13

Голова не изменяется до тех пор, пока не будет позже, когда num = 12, а затем снова, когда num = 1., head будет равен 1, пока не закончится добавление.

Когда я выполняю печать в конце, связанный список сортируется по первому номеру, а не по целому числу, он следует в следующем порядке:

  • 1
  • 10
  • 11
  • ...
  • 19
  • 2
  • 20
  • 21
  • ...
  • 29
  • 3
  • 30
  • 31

и так далее ... Мне нужноэто будет:

  • 1
  • 2
  • 3
  • ...
  • 9
  • 10
  • 11

Есть ли ошибка в моей логике для функции 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 addInOrder(ListNode *&h, string l, string n);
void printList(ListNode *h, int &lengthOfFile);
void deleteList(ListNode *&h);

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

    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))
                    {
                        letter = c;
                    }
                    else if (word == "!" or word == ".")
                    {
                        letter = word;
                    }
                    else if (word != "!" or word != ".")
                    {
                        letter = "  ";
                        num = word;
                        lengthOfFile++;
                        if (wordNum == 1)
                        {
                            addInOrder(head, letter, num);
                        }
                    }
                }
                if (wordNum == 2)
                {
                    num = word;
                    lengthOfFile++;
                }
                if (wordNum == 2)
                {
                    addInOrder(head, letter, num);
                }
            }
        }
    inFile.close();
    }

    printList(head, lengthOfFile);

    deleteList(head);
}

Здесьмоя функция, которую я добавляю в связанный список в следующем порядке:

void addInOrder(ListNode *&h, string l, string n)
{
    ListNode *newNode;
    newNode = new ListNode;

    newNode->letter = l;

    newNode->num = n;

    if (h == nullptr)
    {
        h = newNode;
        newNode->next = nullptr;
    }
    else
    {
        ListNode *prev = nullptr;
        ListNode *curr = h;

        while ((curr != nullptr) && (curr->num < n))
        {
            prev = curr;
            curr = curr->next;
        }
        if (prev == nullptr)
        {
            h = newNode;
            newNode->next = curr;
        }
        else
        {
            prev->next = newNode;
            newNode->next = curr;
        }

    }
}

Печать списка для проверки индексов:

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

    for(int i = 0; i < lengthOfFile; i++)
    {
        cout << ptr->letter << " ";
        cout << ptr->num << " ";
        cout << endl;
        ptr = ptr->next;
    }
    cout << endl;
}

Удаление списка:

void deleteList(ListNode *&h)
{
    ListNode *ptr;
    while (h != nullptr)
    {
        ptr = h;
        h = h->next;
        delete ptr;
    }
}

1 Ответ

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

Вы сравниваете string, а не числа.Список отсортирован правильно в алфавитном порядке.

Если вы хотите, чтобы он был отсортирован в числовом порядке, вы должны преобразовать строки в целые числа (или любое другое числовое значение).

...