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

Strukty - na stos i ze stosu

Ostatnio zmodyfikowano 2011-01-31 00:08
Autor Wiadomość
Marys
Temat założony przez niniejszego użytkownika
Strukty - na stos i ze stosu
» 2011-01-24 03:43:44
Witam,
teraz zajmuję się strukturami, a właściwie usuwaniem i sortowaniem ich. Czy macie może jakieś algorytmy i materiały, gdzie jest to ładnie opisane. Dla lepszego zrozumienia o co mi chodzi podaj treść przykładowego zadnia:

Utwórz listę składającą się z 10 elementów całkowitych wygenerowanych losowo z zakresu <1, 10>.
Wyświetl listę.
Wyszukaj element o wartości maksymalnej i określ położenie tego elementu.
Usuń listę.

Chodzi głównie o znajdowanie danych elementów i dodawanie lub usuwanie oraz sortowanie.
P-26970
dmx81
» 2011-01-24 07:44:31
pewnie chodzi ci tez o jakis kontener, np wektor na struktury - poszukaj sobie "sortowanie c++" (jest kilka rodzajow, najwolniejsze, ale chyba najprostsze do zrozumienia jest sortowanie babelkowe) - do tego poczytaj o wektorach - jest tam funkcja swap - zamieniajaca pozycje w wektorze miejscami, wiec jesli ladnie to zakodujesz i postawisz dobre warunki,np
C/C++
for( int j = 0; j < wektor.size() - 1; j++ )
{
    for( int i = 0; i < wektor.size() - 1; i++ )
    {
        if( wektor[ i ]->wartosc1 < wektor[ i + 1 ]->wartosc1 )
             swap( wektor[ i ], wektor[ i + 1 ] );
       
    }
}

cos takiego, wektor ma tez usuwanie z okreslonej pozycji (erase) i podajesz tam iterator (ew wektor.begin()+ktora_pozycja)

PS>> post pisany w pospiechu,  wiec nie traktuj kodu doslownie, moga pojawic sie w nim bledy logiczne ;) ale mniej wiecej tak to wyglada, sam musisz doczytac wiecej - wystrczy wygooglowac sortowanie C++
P-26971
Marys
Temat założony przez niniejszego użytkownika
» 2011-01-24 13:18:08
Nie chodzi mi sortowanie bąbelkowe. Chodzi mi sortowanie list, struktur (struct). Później wrzucę przykład programu.
P-26983
ison
» 2011-01-24 13:32:05
C/C++
#include <list>
#include <cstdio>
#include <ctime>
#include <algorithm>

int main()
{
    srand( time( NULL ) );
   
    std::list < int > MyList;
    for( int i = 0; i < 10; ++i ) MyList.push_back( rand() % 100 );
   
    MyList.sort();
    for( std::list < int >::iterator it = MyList.begin(); it != MyList.end(); ++it ) {
        printf( "%d ", * it );
    }
}

gdy chcesz posortować listę struktur to musisz użyć komparatora
C/C++
#include <list>
#include <cstdio>
#include <ctime>
#include <algorithm>

struct Foo
{
    int a; //wg tej zmiennej bedziemy sortowac
    Foo() { }
    Foo( int new_a )
        : a( new_a )
    {
    }
    ~Foo() { }
};

bool smaller( Foo & f1, Foo & f2 ) //komparator miedzy dwoma Foo
{
    return f1.a < f2.a;
}

int main()
{
    srand( time( NULL ) );
   
    std::list < Foo > MyList;
    for( int i = 0; i < 10; ++i ) MyList.push_back( Foo( rand() % 100 ) );
   
    MyList.sort( smaller );
    for( std::list < Foo >::iterator it = MyList.begin(); it != MyList.end(); ++it ) {
        printf( "%d ", it->a );
    }
}
P-26986
Marys
Temat założony przez niniejszego użytkownika
» 2011-01-31 00:08:29
Dobra, mam problem z posortowaniem z głupią listą jednokierunkową. To jest mój kod:
C/C++
#include <iostream.h>
#include <conio.h>
typedef struct El // struktura elementu roboczego
{ int Wartosc;
    struct El * Nastepny; // wska«nik do nast©pnego elementu
} ELEMENT;
typedef struct // struktura elementu informacyjnego
{ ELEMENT * Glowa;
    ELEMENT * Ogon;
} INFO;

INFO * Wsk_Info; // wskaznik do elementu informacyjnego
void Do_Listy( INFO * Wsk, int L );
void Tworz_Liste( INFO * Wsk, int n );
void Pisz_Liste( INFO * Wsk );
void Sortuj( INFO * Wsk );
void Usun_Liste( INFO * Wsk );
//----------------------------------------------------------------------
int main()
{
    int n, L1;
    clrscr();
    cout << "Podaj dgugosc listy: ";
    cin >> n;
    Wsk_Info = new INFO;
    Tworz_Liste( Wsk_Info, n );
    cout << "\nOto lista:\n " << endl;
    Pisz_Liste( Wsk_Info );
    Sortuj( Wsk_Info );
    cout << "\n\nLista zmodyfikowana: \n\n";
    Pisz_Liste( Wsk_Info );
    Usun_Liste( Wsk_Info );
    getch();
}

//----------------------------------------------------------------------
void Do_Listy( INFO * Wsk, int L )
/* Funkcja dolacza nowy element do listy - na koniec listy */
{
    ELEMENT * Nowy;
    Nowy = new ELEMENT;
    if( Wsk->Glowa == NULL ) // dolaczenie nowego elementu
    { // do listy pustej
        Wsk->Glowa = Nowy;
        Wsk->Ogon = Nowy;
    }
    else // dolaczenie nowego elementu
    { Wsk->Ogon->Nastepny = Nowy; // na koncu listy niepustej
        Wsk->Ogon = Nowy;
    }
    Nowy->Wartosc = L;
    Nowy->Nastepny = NULL;
}
//----------------------------------------------------------------------
void Tworz_Liste( INFO * Wsk, int n )
{
    int i, L;
    Wsk->Glowa = NULL;
    Wsk->Ogon = NULL;
    cout << "Wprowadz kolejne elementy listy:\n";
    for( i = 1; i <= n; i++ )
    {
        cout << "el.";
        cout.width( 2 );
        cout << i << " = ";
        L = random( 10 ) + 1;
        cout << L << "\n";
        Do_Listy( Wsk, L );
    }
}
//----------------------------------------------------------------------
void Pisz_Liste( INFO * Wsk )
/*  Funkcja wyswietla elementy listy w kierunku od poczatku do konca */
{
    ELEMENT * Biezacy;
    int i = 0;
    Biezacy = Wsk->Glowa;
    if( Wsk->Glowa == NULL )
         cout << "Lista jest pusta\n";
    else while( Biezacy != NULL )
    {
        i++;
        cout.width( 2 );
        cout << Biezacy->Wartosc << endl;
        Biezacy = Biezacy->Nastepny;
    }
}
//----------------------------------------------------------------------
void Sortuj( INFO * Wsk )
/* Funkcja wyszukuje wskazany element  listy */
{
    ELEMENT * Biezacy, * Przed, * Po, * Tmp;
    int po, przed;
    Biezacy = Wsk->Glowa;
    // Przed=Biezacy;
    // Po=Biezacy->Nastepny;
   
    do
    {
        Przed = Biezacy;
        Po = Biezacy->Nastepny;
        po = Po->Wartosc;
        przed = Przed->Wartosc;
        Tmp = Po->Nastepny;
        if( przed > po )
        {
            Biezacy = Po;
            Biezacy->Nastepny = Przed;
            Przed->Nastepny = Biezacy->Nastepny->Nastepny;
        }
        Biezacy = Biezacy->Nastepny;
    }
    while(( Biezacy != NULL ) &&( po == 0 ) );
   
   
   
   
}

//----------------------------------------------------------------------
void Usun_Liste( INFO * Wsk )
{
    int i = 0;
    ELEMENT * Biezacy, * Usuniety;
    Biezacy = Wsk->Glowa;
    if( Wsk->Glowa == NULL )
         cout << "Lista jest pusta";
    else { while( Biezacy != NULL )
        {
            i++;
            Usuniety = Biezacy;
            Biezacy = Biezacy->Nastepny;
            delete Usuniety;
        }
        if( Biezacy == NULL )
             cout << "\nListe usunieto" << endl;
       
    }
}
//----------------------------------------------------------------------

W funkcji sortuj jest mój kod, ale mi nie działa :/ Już paru rzeczy próbowałem, ale nie wychodzi mi i już się trochę pogubiłem.

Już zrobiłem udało się :)
P-27559
« 1 »
  Strona 1 z 1