sortowanie alfabetyczne c++

0

Mam problem w sortowaniu alfabetycznym wersów z pliku względem autora. Podzieliłem już wersy na części i dodałem do struktury oraz stworzyłem listę. Program działa, ale bez sortowania. Niestety nie mogę użyć funkcji sort ani wektorów. Jestem początkującym programistą i szczerze mówiąc nie wiem, jak się za to zabrać. Czytałem wiele innych wątków i widziałem, że polecają sortowanie bąbelkowe, ja jednak nic z niego nie rozumiem. Będę wdzięczny za wszystkie wskazówki i porady.

struct dane {
    string autor;
    string tytul;
    string etykieta;
    struct dane* poprz = NULL, * nast = NULL;
};

typedef dane* lista;
lista glowa = NULL;
lista wsk = NULL;

void sort(string autor, int k, string linia)
{
   
    lista kolejny;
    kolejny = glowa;
   
  
    for (int i = 0;i < k- 1;i++)
        for (int j = 0;j < k - 1;j++)
            if (kolejny->autor[j] > autor[j + 1])
                swap(linia[j], linia[j + 1]);
}
0

Co ten sort właściwie sortuje?

void sort(string autor, int k, 
   string linia)// !!!!!!
{
   .....
     swap(linia[j], linia[j + 1]); /// WTF???

literki w jakiejś linii na podstawie autora?

Na dodatek te zmienne globalne.

0

Po pierwsze musisz zbudować funkcję sortującą wyrazy alfabetycznie i od razu pytanie pierwsze - czy musisz używać polskich znaków ? Jeżeli musisz to mozna np. przekonwertować każdy znak na liczbę zgodnie z kolejnością liter w języku polskim, i napisać funkcję która porównuje czy dany wyraz jest przed drugim wg porządku alfabetycznego. Po posortowaniu trzeba odtworzyc znaki z liczb. Jeżeli nie musisz używać polskich znaków to można porównywać wyrazy funkcją compare(uprzednio przekształcić wyrazy na małe litery).

2

A Musisz mieć linked listę? Tablicę by się fajnie sortowalo.

2

Uproszczając do minimum:

#include <iostream>
using namespace std;

struct Node
{
	string author,title,tag;
	Node *next;
	Node(const string &author,const string &title,const string &tag,Node *next):
	author(author),
	title(title),
	tag(tag),
	next(next)
	{
	}
};

class List
{
	Node *head;
	public:
	List():head(nullptr) {}
	void put(const string &author,const string &title,const string &tag)
	{
		head=new Node(author,title,tag,head);
	}
	void sort()
	{
		if(!head) return;
		for(bool x=true;x;)
		{
			x=false;
			for(Node **curr=&head;((*curr))&&((*curr)->next);curr=&(*curr)->next)
			{
				Node *next=(*curr)->next;
				if((*curr)->author>next->author)
				{
					(*curr)->next=next->next;
					next->next=*curr;
					*curr=next;
					x=true;
				}
			}
		}
	}
	friend ostream &operator<<(ostream &s,const List &lst)
	{
		for(Node *i=lst.head;i;i=i->next) s<<i->author<<endl;
		return s;
	}
};

int main()
{
	List lst;
	lst.put("Aaaaa","","");
	lst.put("Qqqqq","","");
	lst.put("Ppppp","","");
	lst.put("Xxxxx","","");
	cout<<lst<<endl;
	lst.sort();
	cout<<lst<<endl;
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1