Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Posortowanie alfabetyczne tablicy list

Ostatnio zmodyfikowano 2016-03-05 20:28
Autor Wiadomość
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.

C/C++
#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;
    //Sortuj_Liste(TABL, wylosowana, licznik);
    //wyswietlliste(TABL, wylosowana, licznik);
   
   
   
   
    delete[] TABL;
    system( "pause" );
    return 0;
}
P-145564
mateczek
» 2016-03-05 08:53:18
taki przykład sortowania alfabetycznego
C/C++
#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;
    }
   
}
P-145567
carlosmay
» 2016-03-05 10:26:23
Strasznie to skomplikowane.
Tak nie wystarczy?
C/C++
bool alfabetSort( string s1, string s2 ) {
    return s1 < s2;
}
Lub bardziej uniwersalnie
C/C++
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.
P-145572
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

C/C++
#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;
    }
   
}
P-145578
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ć :/
P-145591
mateczek
» 2016-03-05 20:28:53

C/C++
#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;
   
}
P-145595
« 1 »
  Strona 1 z 1