skullek Temat założony przez niniejszego użytkownika |
Posortowanie alfabetyczne tablicy list » 2016-03-05 01:39:20 Witam mam takie zadanie aby pobrać z zewnętrznego pliku słowa, wpisać je z pliku do tablicy list, zawierajacych w danym indeksie słowa o tej długosci w tab[3] = 3 literowe np, potem mam wylosowac randem indeks od 0-9 az do wylosowania pierwszej niepustej listy - No i do tego momentu mi działa :D, teraz mam uporządkować alfabetycznie tab od wylosowanego indeksu czyli np tab[4] = posortować całą listę tab[4] alfabetycznie - Nie mam na to pomysłu, próbowałem gotowymi sort i qsort, ale coś nie pykało... Dorzucam kod ;) Liczę na pomoc i z góry dzięki. #include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <ctime> using namespace std;
struct lista { string slowo; lista * next; };
lista * wpisz_na_liste( lista **& TABL, string wyraz ) { int pomoc = wyraz.length(); if( TABL[ pomoc ] == NULL ) { lista * wsk = new lista; wsk->slowo = wyraz; wsk->next = NULL; TABL[ pomoc ] = wsk; return wsk; } else { lista * wsk = new lista; wsk->slowo = wyraz; wsk->next = TABL[ pomoc ]; TABL[ pomoc ] = wsk; return wsk; } pomoc = 0; }
void odczyt( lista **& TABL ) { fstream plik; string dane; plik.open( "slowa.txt", ios::in ); if( plik.good() == true ) { while( !plik.eof() ) { getline( plik, dane ); wpisz_na_liste( TABL, dane ); } plik.close(); } }
void wyswietlliste( lista **& TABL, int wylosowana, int & licznik ) { while( TABL[ wylosowana ] != NULL ) { licznik++; cout << TABL[ wylosowana ]->slowo << " "; TABL[ wylosowana ] = TABL[ wylosowana ]->next; } cout << licznik; }
int losuj() { int wylosowana; wylosowana = rand() % 10 + 0; cout << wylosowana; return wylosowana; }
int main() { int wylosowana; int licznik = 0; srand( time( NULL ) ); lista ** TABL = new lista *[ 10 ]; for( int i = 0; i < 10; i++ ) { TABL[ i ] = NULL; } cout << "Odczytuje dane z pliku " << endl; odczyt( TABL ); cout << "Losuje indeks tablicy" << endl; do { cout << "Wylosowany indeks to: "; wylosowana = losuj(); cout << endl; if( TABL[ wylosowana ] == NULL ) { cout << "W wylosowanym indeksie nie ma danych" << endl << "Losuje ponownie"; } } while( TABL[ wylosowana ] == NULL ); cout << "Lista przed sortowaniem: " << endl; wyswietlliste( TABL, wylosowana, licznik ); cout << endl; cout << "Lista po sortowaniu: " << endl; delete[] TABL; system( "pause" ); return 0; } |
|
mateczek |
» 2016-03-05 08:53:18 taki przykład sortowania alfabetycznego #include <iostream> #include<string> #include<algorithm> #include<vector>
using namespace std; bool alfabetSort( string s1, string s2 ) { int i = 0; while( 1 ) { if( s1[ i ] < s2[ i ] ) return true; if( s1[ i ] > s2[ i ] ) return false; if( s1.size() - 1 == i ) { return true; } if( s2.size() - 1 == i ) { return false; }; i++; } return false; }
int main() { vector < string > a = { { "www" }, { "aaa" }, { "abb" }, { "abbb" }, { "aaab" } }; sort( a.begin(), a.end(), alfabetSort ); for( string s: a ) { cout << s << endl; } } |
|
carlosmay |
» 2016-03-05 10:26:23 Strasznie to skomplikowane. Tak nie wystarczy? bool alfabetSort( string s1, string s2 ) { return s1 < s2; } Lub bardziej uniwersalnie template < typename T > class AlphabetSort { public: bool operator ()( const T t1, const T t2 ) { return t1 < t2; } };
int main() { vector < string > a = { { "www" }, { "aaa" }, { "abb" }, { "abbb" }, { "aaab" } }; sort( a.begin(), a.end(), AlphabetSort < string >() ); for( string s: a ) { cout << s << endl; } } Można jeszcze do klasy dołożyć opcje przełączania ignorowania wielkich liter przy porównaniu. |
|
mateczek |
» 2016-03-05 16:17:02 Dzięki !!! nie wiedziałem, że stringi mają już operator "<" przeładowany. Jeśli tak to nic nie trzeba robić:P #include <iostream> #include<string> #include<algorithm> #include<vector>
using namespace std;
int main() { vector < string > a = { { "www" }, { "aaa" }, { "abb" }, { "abbb" }, { "aaab" }, { "aaaa" } }; sort( a.begin(), a.end() ); for( string s: a ) { cout << s << endl; } } |
|
skullek Temat założony przez niniejszego użytkownika |
» 2016-03-05 19:28:23 Jak mam w tę funkcję sort wrzucić początek i koniec... Bo to ma posortować tylko jeden rząd - losowy. licznik wstazuje na ostatni element, wylosowana to wylosowany index. Próbowałem coś takiego sort( TABL[ wylosowana ][ 0 ], TABL[ wylosowana ][ licznik ] ); sort( TABL[ wylosowana ][ 0 ].slowo, TABL[ wylosowana ][ licznik ].slowo ); sort( TABL[ wylosowana ][ 0 ]->slowo, TABL[ wylosowana ][ licznik ]->slowo ); ale nic mi nie trybi :/ Próbowałem jeszcze innymi metodami, nie wiem jak to w ogóle zapisać :/ |
|
mateczek |
» 2016-03-05 20:28:53 #include <iostream> #include<string> #include<algorithm>
using namespace std;
int main() { string tabl[ 6 ] = { "www", "aaa", "abb", "abbb", "aaab", "aaaa" }; sort( tabl + 0, tabl + 6 ); for( int i = 0; i < 6; i++ ) cout << tabl[ i ] << endl; }
|
|
« 1 » |