Nano Hash - криптовалюты, майнинг, программирование

С++ — сортировка вставкой связанного списка (строковые элементы)

У меня есть домашнее задание, где я должен отсортировать элементы связанного списка (строки) после первого символа в строке. Пример:

От: Ананас->Яблоко->Пепел->Abc->Жемчуг->Костер->Мяч

Кому: Apple->Ash->Abc->B onfire->Ball->Pineapple->Pearl (только первый символ)

Я сделал функцию:

void insertionSort ()
{
    first = current;
    Node* insertionPointer = first;
    current = current -> next;
    for (start(); !end(); next()){ // Running through all list nodes
        while (current != NULL) {
            insertionPointer = first;
            while(insertionPointer->next != current) {
                if (insertionPointer->data.at(0) > current-> data.at(0)){   // Trying to sort strings alphabetically
                                                                            // (after only first char)
                    string temp = current->data;
                    current->data = insertionPointer->data;
                    insertionPointer->data = temp;
                }
                else {
                    insertionPointer = insertionPointer->next;
                }
            }
        }
    }
}

Но я получаю ошибку сегментации - я думаю, это означает, что я пытаюсь получить некоторую информацию, к которой я не могу получить доступ? Кроме того, я не уверен, если:

if (insertionPointer->data.at(0) > current-> data.at(0))

Будет сравнивать строки первого символа? Я просто пытаюсь здесь поэкспериментировать. :( Просто чтобы убедиться, я опубликую ниже весь свой код, чтобы вы могли увидеть, как я структурировал списки и другие функции. Я новичок в этом деле - любая информация будет полезна.

Полный код программы:

#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
using namespace std;
class Node
 {
public:
string data;
Node *next;
Node (string city) { data = city; next = NULL; };
};
class List
{
protected:
    Node *first, *last;
public:
    Node *current;
public:
    List () { first = last = current = NULL; };

 void add_element (string city);
 void delete_element ();
 ~List();

 bool is_empty () { return (first == NULL); };
 void start () { current = first; };
 bool end () { return (current == NULL); };
 void next(){if (!end())current = current -> next;};
 void print();

void insertionSort ()
{
first = current;
Node* insertionPointer = first;
current = current -> next;
for (start(); !end(); next()){ // Running through all list nodes
while (current != NULL) {
    insertionPointer = first;
    while(insertionPointer->next != current)  {
                        if (insertionPointer->data.at(0) >  current->data.at(0)){   // Trying to sort strings alphabetically
                                                                                    // (after only first char)
                        string temp = current->data;
                        current->data = insertionPointer->data;
                        insertionPointer->data = temp;
                        }else{
                        insertionPointer = insertionPointer->next;
                        }
    }
}
    }
}


};


int main()
{
string s;
List l;

l.add_element("Pineapple");
l.add_element("Apple");
l.add_element("Ash");
l.add_element("Abc");
l.add_element("Pearl");
l.add_element("Bonfire");
l.add_element("Ball");


l.print();
cout << endl;
l.insertionSort();
l.print();



return 0;
}

void List::add_element (string city)
{
 Node *p = new Node (city);
 if (first == NULL) first = last = p;
 else last = last -> next = p;
 current = p;
};

void List::delete_element ()
 {
 Node *p = first;
 if(!is_empty())
 { if (current == first) current = first-> next;
 first = first -> next;
 delete p;
 if(is_empty())last = NULL;
 }
 };
void List::print()
{
for (start(); !end(); next())
{
cout << current->data << endl;
}
cout << endl;
};
List::~List()
{
while (!is_empty())
 {
delete_element();
};
cout << "All memory of nodes deleted!"<< endl;
};
25.04.2016

  • Пожалуйста, не получайте данные из неизвестного файла (нам). Просто вызовите необходимые функции списка с известными жестко запрограммированными значениями. Вот как вы должны тестировать, особенно если другие хотят воспроизвести проблему. Если add_element("abc"); add_element("123"); add_element("Joe"); add_element("Bob"); insertionSort(); не работает, чтение из файла работать не будет. 25.04.2016
  • @PaulMcKenzie Я последовал твоему совету и изменил свою основную функцию в коде. Я до сих пор не могу решить: 1. Ошибка сегментации 2. if (insertionPointer-›data.at(0) › current-›data.at(0)){ Будет ли этот оператор сортировать только после первого символа строк? 26.04.2016
  • вся ваша логика неверна. ваш add:element должен вставляться отсортированным. 26.04.2016

Ответы:


1

Ваша программа, скорее всего, дает сбой здесь:

while(insertionPointer->next != current)  {

потому что insertionPointer стало нулевым, когда вы выполнили

insertionPointer = insertionPointer->next;

изменить условие цикла на

while(insertionPointer && insertionPointer->next != current)  {
25.04.2016
  • Все еще дает мне ошибку сегментации. 26.04.2016
  • ваш код полностью изменен, и он не дает сбоев, смотрите ваш код работает. тоже не сортирует.. 26.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..