C++ - 链表插入排序(字符串元素)

C++ - Linked List Insertion Sort (String elements)

本文关键字:字符串 元素 插入排序 链表 C++      更新时间:2023-10-16

我有一个家庭作业任务,我必须在字符串中第一个字符之后对链表元素(字符串)进行排序。例:

来自: 菠萝->苹果->灰>ABC->珍珠->篝火->球

收件人: APeople->A sh->Abc->B onfire->Ball->P ineapple->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;
};

您的程序很可能在这里崩溃:

while(insertionPointer->next != current)  {

因为执行时insertionPointer已变为空

insertionPointer = insertionPointer->next;

将循环条件更改为

while(insertionPointer && insertionPointer->next != current)  {