Sortowanie przez wybieranie C

Odpowiedz Nowy wątek
2019-01-21 15:42
0

Witam, otóż jestem początkujący w programowaniu w języku C.
Mam za zadanie utworzyć bazę filmów (tytuł-rok-gatunek) i do tej bazy powinno się dać dodawać filmy oraz posortować (sortowanie przez wybieranie) według tytułu, roku i gatunku.
I moim problemem jest wstawienie tej bazy do tablicy, aby posortować:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxDlugoscTytulu 50
#define maxDlugoscGatunku 50

//Struktura reprezentuj¹ca produkt
typedef struct movies_t
{
    char tytul[maxDlugoscTytulu];
    int rok;
    char gatunek[maxDlugoscGatunku];
}Film;

int *t[20]; //tablica indeksów
char *t_gatunek[50]; //tablica imion
char *t_tytul[50]; //tablica nazwisk

//Struktura reprezentuj¹ca jedna liste
typedef struct lista1_t {
    Film *movies;
    struct lista1_t *nastepny;
} Lista;

//Dodawanie nowych flmów do bazy
Lista *dodaj(char tytul[], int rok, char gatunek[], Lista *lista1) {
    Lista *nowaLista;
    nowaLista = (Lista*)malloc(sizeof(Lista)); //alokacja pamiêci dla noweej listy
    struct movies_t *movies = (struct movies_t*) calloc(1, sizeof(*movies)); //alokacja pamiêci dla nowego produktu
    if(!movies)
    {
        fprintf(stderr, "Nie mo¿na zaalokowaæ pamiêci!");
        exit(1);
    }

    strncpy(movies->tytul, tytul, sizeof(movies->tytul)); //przypisanie tytul do bazy
    movies->rok = rok;
    strncpy(movies->gatunek, gatunek, sizeof(movies->gatunek));
    nowaLista->movies = movies;
    nowaLista->nastepny= lista1;
    lista1 = nowaLista;

    return lista1;
}

//Funkcja do wypisywania filmow w konsoli
void wypisz(Lista *lista1) {
    Lista *obecnaLista = lista1;
    int liczbaPorzadkowa = 0;
    while(obecnaLista != NULL) {
        printf("%d. %s - %d - %s\n", liczbaPorzadkowa + 1, obecnaLista->movies->tytul, obecnaLista->movies->rok, obecnaLista->movies->gatunek);
        obecnaLista = obecnaLista->nastepny;
        liczbaPorzadkowa++;
    }
}

//Funkcja zwracaj¹ca d³ugoœæ listy
int znajdzDlugoscListy(Lista *lista2)
{
    int licznik = 0;
    for (; lista2 != NULL; lista2 = lista2->nastepny)
    {
        ++licznik;
    }
    return licznik;
}

int select_sort_tytul(Lista *movies_t)
{
    char *tytul;
    int i,j,m;

    for (i=0;i<=50;++i)
    {
        m=i;
        for (j=i+1;j<50;++j)
        {
            if ((tytul[j],t_gatunek[j],t[j])<(tytul[m],t_gatunek[m],t[m]))
                m=j;
        }
        j=tytul[i],t[i],t_gatunek[i];
        tytul[i],t[i],t_gatunek[i]=tytul[m],t[m],t_gatunek[m];
        tytul[m],t[m],t_gatunek[m]=j;
    }
    /*for (i=0;i<500;i++)
    {
        printf("%c - %c - %c\t",t_tytul[i],t_gatunek[i],t[i]);
    }*/return movies_t;
}

int main()
{
    Lista *lista1 = NULL;
    int wybor, rok;
    char tytul[50];
    char gatunek[50];
    char *temp;

     lista1 = dodaj("Plan B", 2010, "komedia", lista1);
     lista1 = dodaj("Droga bez powrotu", 2003, "horror", lista1);
     lista1 = dodaj("Kod niesmiertelnosci", 2011, "dramat", lista1);
     lista1 = dodaj("Skarb narodow", 2004, "akcja", lista1);
     lista1 = dodaj("The escort", 2015, "Dramat", lista1);
     lista1 = dodaj("Hush", 2016, "dreszczowiec", lista1);
     lista1 = dodaj("Annabelle", 2014, "mystery", lista1);
     lista1 = dodaj("Witajcie w dzungli", 2003, "akcja", lista1);

    while(1) {
        printf("\n *        Menu:    *\n");
        printf("\n 1. Dodaj nowy film do bazyn\n");
        printf("\n 2. Wypisz liste filmow\n");
        printf("\n 3. Posortuj filmy wg tytulu\n");
        printf("\n 4. Posortuj filmy wg roku produkcji\n");
        printf("\n 5. Posortuj filmy wg gatunku\n");
        printf("\n 6. Zakoncz\n");
        printf("\n Wybierz jedna z opcji [1-6] : ");

        if (scanf("%d", &wybor) != 1) {
            printf(" *Blad: Niepoprawne wejscie. Sprobuj ponownie !!!\n");
            scanf("%s", &temp);
            continue;
        }
       switch (wybor) {
            case 1:
                printf("Podaj tytu³ filmu, ktory chcesz dodac do bazy!\n");
                     scanf("%s", tytul);

                     printf("Podaj rok produkcji filmu, ktory chcesz dodac do bazy!\n");
                     scanf("%d", &rok);

                     printf("Podaj gatunek filmu, ktory chcesz dodac do bazy!\n");
                     scanf("%s", gatunek);

                lista1 = dodaj(tytul, rok, gatunek, lista1);
                break;
            case 2:
                printf("\nLista filmow znajdujacych sie w bazie: \n");
                wypisz(lista1);
                break;
            case 3:
                lista1 = select_sort_tytul(lista1);
                printf("\nPosortowano wg tytulu !!!\n\n");
                wypisz(lista1);
                 break;
            case 4:
                 //lista1 = quicksortCena(lista1);
                printf("\nPosortowano wg roku produkcji !!!\n\n");
                wypisz(lista1);
                break;
            case 5:
                //lista1 = quicksortNazwa(lista1);
                printf("\nPosortowano wg gatunku !!!\n\n");
                wypisz(lista1);
                break;
            case 6:
                return(0);
                break;

            default:
                printf("\nNiedozwolony opcja. Prosze sprobuj ponownie !!!\n");
            }
    }
    return(0);
}

Pozostało 580 znaków

2019-01-21 15:44
0

Mam problem z "int select_sort_tytul(Lista *movies_t)"

Pozostało 580 znaków

2019-01-21 17:54
0
  1. ponieważ, wartość korzenia się zmieni podczas sortowania potrzebujesz select_sort_tytul(Lista **root)!
  2. napisz sobie funkcję Lista **znajdzWskNaNajmniejszyTytuł(Lista **root) jako funkcję pomocniczą. Zwróć uwagę, że to zwraca wskaźnik na wskaźnik do elementu listy!
  3. napisz sobie funkcję, która zamieni elementy listy miejscami elementy listy: void zamienElemety(Lista **a, Lista **b)
  4. co to ma niby robić: if ((tytul[j],t_gatunek[j],t[j])<(tytul[m],t_gatunek[m],t[m])). To tak nie działa!
  5. taki sam problem tutaj: j=tytul[i],t[i],t_gatunek[i]; i niżej

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2019-01-21 18:47
0

Czyli coś takiego ?

Lista **znajdzWskNaNajmniejszyTytuł(Lista **root)
{
int min, tytul[];
min = tytul[0];

    for(int i=1;i<10;i++)
        if(min>tytul[i])
            min = tytul[i];

    system("pause");
    return 0;
}

A odnosnie zamiany to takie coś?

void zamienElementy(Lista **a,Lista **b, int x, int y)
{
    **a = movies[x];
    movies[x] = movies[y];
    movies[y] =**b;
}
edytowany 1x, ostatnio: kq, 2019-01-21 20:41

Pozostało 580 znaków

2019-01-22 10:41
0

Nie!
W C porównywanie napisów odbywa się za pomocą strcmp
min powinno być typu Lista **
indeksy nie maja tu zastosowania bo iterujesz po liście!

Zmieniasz miejscami elementy listy, więc musisz poprawić powiązania tych elementów. Po co ci to x y? Rozumiesz jak działa lista?

void zamienElementy(Lista **a,Lista **b)
{
    assert(a);
    assert(b);
    assert(*a);
    assert(*b);

    Lista *tmp;
    tmp = (*a)->nastepny;
    (*a)->nastepny = (*b)->nastepny;
    (*b)->nastepny = tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2019-01-22 10:44

Pozostało 580 znaków

2019-01-22 19:21
0

No tak słabo to ogarniam, bo dopiero zaczynam przygodę z programowaniem. Nie za bardzo rozumiem jak zrobić to porównanie..
Że.. if(strcmp(a<b)!=0) to wtedy zamiana wskźników?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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