Struktury dany - lista jedno kierunkowa

0

Witam mam robię właśnie bazę danych i już prawie ją skończyłem tyle że nie wiem jak za bardzo mam zrobić takie coś żeby mi sprawdzało czy podana przez użytkownika branża jest poprawna a w razie braku zgodności użytkownik ma dostać możliwość ponownego wprowadzenia danych lub dodania tej nowej branży do zdefiniowanej ówcześnie listy "poprawnych' branż. Ktos pomoże bo już mi głowa pęka;) ?

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Struktura z danymi studenta
typedef struct DANE
{
    long int* numer;
    char* miejscowosc;
    char* branza;
    int* liczba_p;
    int* godzina_o;
    int* godzina_z;
} Dane;

//Struktura z list¹ jednokierunkow¹
typedef struct SKLEP Sklep;
struct SKLEP
{
    Dane dane;
    Sklep* next;
};

typedef struct BRANZA_list Branza_list;
struct BRANZA_list
{
    char* branza;
    Branza_list* next;
};

void dodaj_branze_const(Branza_list **head2, char *el_staly)
{
    Branza_list *element;

    element=(Branza_list*)malloc(sizeof(Branza_list));
    element->branza=el_staly;

    Branza_list *tmp = element;

    if (*head2 != NULL)
        tmp->next = *head2;
    *head2 = tmp;
}
int check_branza(Branza_list *head2, char *branza)
{
    Branza_list *tmp;

    tmp=head2;
    while (tmp!=NULL&&strcmp((tmp->branza),branza)!=0)
        tmp=tmp->next;
    if (tmp==NULL)
        return 1;
    else
        return 0;
}
//Tworzenie nowego elementu
Sklep* stworz_element(Branza_list **head2)
{
    char x;//x zmienna pomocnicza
    Sklep *element;

    char bufor1[41], bufor2[41];
    char *miejscowosc, *branza;
    long int *numer;
    int *liczba_p, *godzina_o, *godzina_z;

    system("cls");

    printf("Podaj miejscowosc: ");
    gets(bufor1);
    miejscowosc=(char*)malloc(sizeof(char)* (strlen(bufor1)+1));
    strcpy(miejscowosc, bufor1);

    do
    {
        int x;
        printf("Podaj branze: ");
        gets(bufor2);
        branza=(char*)malloc(sizeof(char)* (strlen(bufor2)+1));
        strcpy(branza, bufor2);

        x=check_branza(&head2, branza);
        if (x!=0)
        {
            system("cls");
            int y;
            puts("Nie ma takiej branzy w bazie");
            puts("1. Dodaj do bazy.");
            puts("2. Popraw");
            y=getchar();
            getchar();
            if (y==1)
            {
                dodaj_branze_const(&head2, branza);
            }
        }
    }
    while(x==0);

    printf("Podaj numer sklepu: ");
    while(scanf("%ld", &numer)==0)
    {
        puts("Blad danych, podaj numer jeszcze raz");
    }

    printf("Podaj liczbe pracownikow: ");
    while(scanf("%d", &liczba_p)==0)
    {
        puts("Blad danych, podaj numer jeszcze raz");
    }

    printf("Podaj godzine otwarcia: ");
    while(scanf("%d", &godzina_o)==0)
    {
        puts("Blad odczytu, podaj numer jeszcze raz");
    }

    printf("Podaj godzine zamkniecia: ");
    while(scanf("%d", &godzina_z)==0)
    {
        puts("Blad odczytu, podaj numer jeszcze raz");
    }

    element=(Sklep*)malloc(sizeof(Sklep));
    element->next=NULL;
    element->dane.numer=numer;
    element->dane.miejscowosc=miejscowosc;
    element->dane.branza=branza;
    element->dane.liczba_p=liczba_p;
    element->dane.godzina_o=godzina_o;
    element->dane.godzina_z=godzina_z;

    return element;
}

//Dodawanie na pocz¹tek listy
void dodaj_sklep(Sklep **head, Branza_list **head2)
{
    Sklep *tmp = stworz_element(&head2);

    if (*head != NULL)
        tmp->next = *head;
    *head = tmp;
}

//Wyœwietlanie listy jednokierunkowej
void wyswietlanie_listy(Sklep *head)
{
    Sklep *tmp;

    system("cls");
    tmp = head;
    if (tmp == NULL)
        printf("Brak elementow");
    else
    {
        puts(" ______________________________________________________________________________________________");
        printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
        puts("|---------------|------------------------------|------------------------------|--------|-------|");
        while (tmp != NULL)
        {
            printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
            tmp = tmp->next;
        }
        puts("'---------------'------------------------------'------------------------------'--------'-------'");
    }
    getchar();
}

//Wyszukiwanie elementu
Sklep* wyszukaj_element_numer(Sklep *head, long int *numer)
{
    Sklep *tmp;

    tmp=head;
    while (tmp!=NULL&&(tmp->dane.numer)!=numer)
        tmp=tmp->next;
    return tmp;
}

void wyswietl_element_numer(Sklep *head)
{
    Sklep *tmp;
    long int numer;

    system("cls");
    puts("Podaj numer sklepu: ");
    scanf("%ld", &numer);

    tmp=wyszukaj_element_numer(head, numer);
    if (tmp!=NULL)
    {
        puts(" ______________________________________________________________________________________________");
        printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
        puts("|---------------|------------------------------|------------------------------|--------|-------|");
        printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
        puts("'---------------'------------------------------'------------------------------'--------'-------'");
    }
    else
        puts("Brak takiego sklepu.");
    getchar();
    getchar();
}

void wyswietl_element_liczba_p(Sklep *head)
{
    Sklep *tmp;
    int pom=0;
    int liczba_p;

    system("cls");
    puts("Podaj liczbe pracownikow sklepu: ");
    scanf("%d", &liczba_p);

    tmp = head;
    puts(" ______________________________________________________________________________________________");
    printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
    puts("|---------------|------------------------------|------------------------------|--------|-------|");
    while (tmp!=NULL)
    {

        if ((tmp->dane.liczba_p)==liczba_p)
        {
            printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
            pom++;
        }
        tmp = tmp->next;
    }
    puts("'---------------'------------------------------'------------------------------'--------'-------'");

    if (pom==0)
    {
        system("cls");
        puts("Brak takich sklepow");
    }

    getchar();
    getchar();
}

void wyswietl_element_godziny(Sklep *head)
{
    Sklep *tmp;
    int pom=0;
    int godzina_o, godzina_z;

    system("cls");
    puts("Podaj godzine otwarcia sklepu: ");
    scanf("%ld", &godzina_o);
    puts("Podaj godzine zamknięcia sklepu: ");
    scanf("%ld", &godzina_z);

    tmp = head;

    puts(" ______________________________________________________________________________________________");
    printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
    puts("|---------------|------------------------------|------------------------------|--------|-------|");
    while (tmp!=NULL)
    {

        if ((tmp->dane.godzina_o)==godzina_o)
        {
            if ((tmp->dane.godzina_z)==godzina_z)
            {
                printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
                pom++;
            }
        }
        tmp = tmp->next;
    }
    puts("'---------------'------------------------------'------------------------------'--------'-------'");

    if (pom==0)
    {
        system("cls");
        puts("Brak takich sklepow");
    }

    getchar();
    getchar();
}

void wyswietl_element_miejscowosc(Sklep *head)
{
    Sklep *tmp;
    int pom=0;
    char bufor[41];
    char *miejscowosc;

    system("cls");
    puts("Podaj miejscowosc, w ktorej znajduje sie sklep: ");
    gets(bufor);
    miejscowosc = (char*)malloc(sizeof(char)* (strlen(bufor) + 1));
    strcpy(miejscowosc, bufor);

    tmp = head;

    puts(" ______________________________________________________________________________________________");
    printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
    puts("|---------------|------------------------------|------------------------------|--------|-------|");
    while (tmp!=NULL)
    {

        if (strcmp(tmp->dane.miejscowosc, miejscowosc)==0)
        {
            printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
            pom++;
        }
        tmp = tmp->next;
    }
    puts("'---------------'------------------------------'------------------------------'--------'-------'");

    if (pom==0)
    {
        system("cls");
        puts("Brak takich sklepow");
    }
    free(miejscowosc);
    getchar();
}
//Usuwanie ca³ej listy
void usun_liste(Sklep **head)
{
    Sklep *tmp;

    while (*head != NULL)
    {
        tmp = *head;
        *head = (*head)->next;
        if (tmp->dane.numer)
            free(tmp->dane.numer);
        if (tmp->dane.branza)
            free(tmp->dane.branza);
        if (tmp->dane.miejscowosc)
            free(tmp->dane.miejscowosc);
        if (tmp->dane.liczba_p)
            free(tmp->dane.liczba_p);
        if (tmp->dane.godzina_o)
            free(tmp->dane.godzina_o);
        if (tmp->dane.godzina_z)
            free(tmp->dane.godzina_z);
        free(tmp);
    }
}
//Usuwanie wybranego elementu
void usuwan_wybrany_element(Sklep **head)
{
    Sklep *tmp, *pom;
    long int numer;

    system("cls");
    puts("Podaj numer sklepu: ");
    scanf("%ld", &numer);

    tmp = wyszukaj_element_numer(*head, numer);
    if (tmp == NULL)
    {
        puts("Nie ma takiego sklepu");
        getchar();
    }
    else
    {
        if (tmp == *head)
        {
            *head = (*head)->next;
            if (tmp->dane.numer)
                free(tmp->dane.numer);
            if (tmp->dane.branza)
                free(tmp->dane.branza);
            if (tmp->dane.miejscowosc)
                free(tmp->dane.miejscowosc);
            if (tmp->dane.liczba_p)
                free(tmp->dane.liczba_p);
            if (tmp->dane.godzina_o)
                free(tmp->dane.godzina_o);
            if (tmp->dane.godzina_z)
                free(tmp->dane.godzina_z);
            free(tmp);
        }
        else
        {
            pom = *head;
            while ((strcmp(pom->next->dane.miejscowosc, tmp->dane.miejscowosc) != 0))
                pom = pom->next;
            pom->next = tmp->next;
            if (tmp->dane.numer)
                free(tmp->dane.numer);
            if (tmp->dane.branza)
                free(tmp->dane.branza);
            if (tmp->dane.miejscowosc)
                free(tmp->dane.miejscowosc);
            if (tmp->dane.liczba_p)
                free(tmp->dane.liczba_p);
            if (tmp->dane.godzina_o)
                free(tmp->dane.godzina_o);
            if (tmp->dane.godzina_z)
                free(tmp->dane.godzina_z);
            free(tmp);
        }
    }
}

//Menu g³ówne
void menu(Sklep *head, Branza_list *head2)
{
    char i;

    do
    {
        system("cls");
        printf("1. Dodaj sklep do bazy.\n");
        printf("2. Wyszykaj sklep o podanym numerze.\n");
        printf("3. Wyszukaj sklepy o podanej liczbie pracownikow.\n");
        printf("4. Wyszukaj sklepy o podanych godzinach otwarcia.\n");
        printf("5. Wyszukaj sklepy znajdujacy sie w podanej miejscowosci.\n");
        printf("6. Wyswietl liste branzowa\n");
        printf("7. Usun liste\n");
        printf("8. Usun wybrany sklep z bazy\n");
        printf("0. Wyjscie\n\n");
        printf("Twoj wybor: ");
        i = getchar();
        getchar();
        if (i == '1')
        {
            dodaj_sklep(&head, &head2);
            getchar();
        }
        else if (i == '2') wyswietl_element_numer(head);
        else if (i == '3') wyswietl_element_liczba_p(head);
        else if (i == '4') wyswietl_element_godziny(head);
        else if (i == '5') wyswietl_element_miejscowosc(head);
        else if (i == '6') wyswietlanie_listy(head);
        else if (i == '7')
        {
            usun_liste(&head);
            getchar();
        }
        else if (i == '8')
        {
            usuwan_wybrany_element(&head);
            getchar();
        }
    }
    while (i != '0');
}

int main()
{
    Sklep *head = NULL;
    Branza_list *head2 = NULL;
    char el_staly[]= {"Piekarnia"};
    dodaj_branze_const(&head2, el_staly);





    menu(head, head2);
    return 0;
}
0

Nic dziwnego, od tego kodu łeb pęka aż kompilator się buntuje.
A teraz odwieczne pytanie to C czy C++? By to było bez znaczenia ale dołączasz bibliotekę string a potem i tak z niej nie korzystasz, nie lepiej by było robić napisy jako string a nie char*? i po prostu zmienne jak godzinaOtwarcia czy nazwaSklepu trzymać jako zwykłe zmienne a nie jako wskaźniki, bo to prowadzi do takich błędów jak w linii 101:

long int *numer;
 while(scanf("%ld", &numer)==0)

gdzie funkcja scanf oczekuje wskaźnika na numer a ty jej przekazujesz wskaźnik na wskaźnik na numer.
Stosuj albo polskie nazewnictwo albo angielskie bo nazewnictwo w stylu check_braza wygląda dziwacznie.

Dodawanie wstępnie zrobiłbym tak:

 while (true)
 {
        int x;
        printf("Podaj branze: ");
        gets(bufor2);
        branza = (char*)malloc(sizeof(char)* (strlen(bufor2)+1));
        strcpy(branza, bufor2);
 
        x = sprawdz_branze(head2, branza);
        if (x != 0)
        {
            system("cls");
            int y;
            puts("Nie ma takiej branzy w bazie");
            puts("1. Dodaj do bazy.");
            puts("2. Popraw");
            y = getchar();
            getchar();
            if (y == '1')
            {
                dodaj_branze_const(head2, branza);
				break;
            }
			else if (y == '2') puts("Poprawianie wprowadzonych danych: ");
			else puts("nie ma takiej opcji, podaj branze ponownie: ");
        }
    }

niby działa ale po dodaniu i tak coś się crashuje.
Sprawdzanie poprawności wczytywanych danych zmień, bo jak wpiszesz znak zamiast liczby to się program zawiesza, tu można coś o tym znaleźć:
Zabezpieczenie przed wpisywaniem liter

0
czaffik napisał(a):

A teraz odwieczne pytanie to C czy C++? By to było bez znaczenia ale dołączasz bibliotekę string a potem i tak z niej nie korzystasz, nie lepiej by było robić napisy jako string a nie char*?

Przecież string.h to biblioteka języka C jak najbardziej. Używana jest również w C++ i nazywa się cstring
http://www.cplusplus.com/reference/cstring/

0

Witam ponownie, generalnie program już sprawdza poprawność branzy, tyle że nie działa mi później dodanie do bazy stałych branż i możonść poprawienia wpisu. W pierwszym przypadku program przechodzi "przez sekwencje normalnie, tyle że no właśnie nie dodaje tego elementu do bazy a w drugim przypadku to się jakby zapętla po wpisaniu poprawnej branzy znów wyskakuje mi okienko do wyboru "1. dodaj do bazy.... 2. Popraw"

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Struktura z danymi studenta
typedef struct DANE
{
    long int numer;
    char* miejscowosc;
    char* branza;
    int liczba_p;
    int godzina_o;
    int godzina_z;
} Dane;

//Struktura z list¹ jednokierunkow¹
typedef struct SKLEP Sklep;
struct SKLEP
{
    Dane dane;
    Sklep* next;
};

typedef struct BRANZA_list Branza_list;
struct BRANZA_list
{
    char* branza;
    Branza_list* next;
};

void dodaj_branze_const(Branza_list **head2, char *el_staly)
{
    Branza_list *element;

    element=(Branza_list*)malloc(sizeof(Branza_list));
    element->next=NULL;
    element->branza=el_staly;

    Branza_list *tmp;
    tmp=element;

    if (*head2 != NULL)
        tmp->next = *head2;
    *head2 = tmp;
}

int sprawdz_branze(Branza_list *head2, char *branza)
{
    Branza_list *tmp;

    tmp=head2;
    while (tmp!=NULL&&strcmp((tmp->branza),branza)!=0)
        tmp=tmp->next;
    if (tmp==NULL)
        return 1;
    else
        return 0;
}
//Tworzenie nowego elementu
Sklep* stworz_element(Branza_list *head2)
{
    int x;//x zmienna pomocnicza
    Sklep *element;
    Branza_list *tmp;
    tmp=head2;


    char bufor1[41];
    char *miejscowosc, *branza;
    long int numer;
    int liczba_p, godzina_o, godzina_z;

    system("cls");
    do
    {
        printf("Podaj miejscowosc: ");
        gets(bufor1);
        x=strlen(bufor1);
        if (x==0) puts("Brak danych, podaj je jeszcze raz.");
    }
    while(x==0);
    miejscowosc=(char*)malloc(sizeof(char)* (x+1));
    strcpy(miejscowosc, bufor1);

    char bufor2[41];
    printf("Podaj branze: ");

    x=1;
    while (x==1)
    {

        gets(bufor2);
        branza = (char*)malloc(sizeof(char)* (strlen(bufor2)+1));
        strcpy(branza, bufor2);

        puts("1");// jedynka kontrolna
        while (tmp!=NULL&&strcmp(tmp->branza, branza)!=0)
            {
                puts("1");
                tmp=tmp->next;
            }
        if (tmp==NULL)
            x=1;
        else
            x=0;
        if (x==1)
        {
            system("cls");
            int y;
            puts("Nie ma takiej branzy w bazie");
            puts("1. Dodaj do bazy.");
            puts("2. Popraw");
            y = getchar();
            getchar();
            if (y == '1')
            {
                dodaj_branze_const(&head2, branza);
                x=0;
                break;
            }
            else
            {
                system("cls");
                free(branza);
                printf("Podaj branze ponownie: ");

            }
        }

    }

    printf("Podaj numer sklepu: ");
    while(scanf("%ld", &numer)==0)
    {
        puts("Blad danych, podaj numer jeszcze raz");
        int c;
        while((c = getchar()) != '\n' && c != EOF);
    }

    printf("Podaj liczbe pracownikow: ");
    while(scanf("%d", &liczba_p)==0)
    {
        puts("Blad danych, podaj numer jeszcze raz");
        int c;
        while((c = getchar()) != '\n' && c != EOF);
    }

    printf("Podaj godzine otwarcia: ");
    while(scanf("%d", &godzina_o)==0)
    {
        puts("Blad odczytu, podaj numer jeszcze raz");
        int c;
        while((c = getchar()) != '\n' && c != EOF);
    }

    printf("Podaj godzine zamkniecia: ");
    while(scanf("%d", &godzina_z)==0)
    {
        puts("Blad odczytu, podaj numer jeszcze raz");
        int c;
        while((c = getchar()) != '\n' && c != EOF);
    }

    element=(Sklep*)malloc(sizeof(Sklep));
    element->next=NULL;
    element->dane.numer=numer;
    element->dane.miejscowosc=miejscowosc;
    element->dane.branza=branza;
    element->dane.liczba_p=liczba_p;
    element->dane.godzina_o=godzina_o;
    element->dane.godzina_z=godzina_z;


    return element;
}

//Dodawanie na pocz¹tek listy
void dodaj_sklep(Sklep **head, Branza_list *head2)
{
    Sklep *tmp = stworz_element(head2);

    if (*head != NULL)
        tmp->next = *head;
    *head = tmp;
}

//Wyœwietlanie listy jednokierunkowej
void wyswietlanie_listy(Sklep *head)
{
    Sklep *tmp;

    system("cls");
    tmp = head;
    if (tmp == NULL)
        printf("Brak elementow");
    else
    {
        puts(" ______________________________________________________________________________________________");
        printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
        puts("|---------------|------------------------------|------------------------------|--------|-------|");
        while (tmp != NULL)
        {
            printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
            tmp = tmp->next;
        }
        puts("'---------------'------------------------------'------------------------------'--------'-------'");
    }
    getchar();
}

//Wyszukiwanie elementu
Sklep* wyszukaj_element_numer(Sklep *head, long int *numer)
{
    Sklep *tmp;

    tmp=head;
    while (tmp!=NULL&&(tmp->dane.numer)!=numer)
        tmp=tmp->next;
    return tmp;
}

void wyswietl_element_numer(Sklep *head)
{
    Sklep *tmp;
    long int numer;

    system("cls");
    puts("Podaj numer sklepu: ");
    scanf("%ld", &numer);

    tmp=wyszukaj_element_numer(head, numer);
    if (tmp!=NULL)
    {
        puts(" ______________________________________________________________________________________________");
        printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
        puts("|---------------|------------------------------|------------------------------|--------|-------|");
        printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
        puts("'---------------'------------------------------'------------------------------'--------'-------'");
    }
    else
        puts("Brak takiego sklepu.");
    getchar();
    getchar();
}

void wyswietl_element_liczba_p(Sklep *head)
{
    Sklep *tmp;
    int pom=0;
    int liczba_p;

    system("cls");
    puts("Podaj liczbe pracownikow sklepu: ");
    scanf("%d", &liczba_p);

    tmp = head;
    puts(" ______________________________________________________________________________________________");
    printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
    puts("|---------------|------------------------------|------------------------------|--------|-------|");
    while (tmp!=NULL)
    {

        if ((tmp->dane.liczba_p)==liczba_p)
        {
            printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
            pom++;
        }
        tmp = tmp->next;
    }
    puts("'---------------'------------------------------'------------------------------'--------'-------'");

    if (pom==0)
    {
        system("cls");
        puts("Brak takich sklepow");
    }

    getchar();
    getchar();
}

void wyswietl_element_godziny(Sklep *head)
{
    Sklep *tmp;
    int pom=0;
    int godzina_o, godzina_z;

    system("cls");
    puts("Podaj godzine otwarcia sklepu: ");
    scanf("%ld", &godzina_o);
    puts("Podaj godzine zamknięcia sklepu: ");
    scanf("%ld", &godzina_z);

    tmp = head;

    puts(" ______________________________________________________________________________________________");
    printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
    puts("|---------------|------------------------------|------------------------------|--------|-------|");
    while (tmp!=NULL)
    {

        if ((tmp->dane.godzina_o)==godzina_o)
        {
            if ((tmp->dane.godzina_z)==godzina_z)
            {
                printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
                pom++;
            }
        }
        tmp = tmp->next;
    }
    puts("'---------------'------------------------------'------------------------------'--------'-------'");

    if (pom==0)
    {
        system("cls");
        puts("Brak takich sklepow");
    }

    getchar();
    getchar();
}

void wyswietl_element_miejscowosc(Sklep *head)
{
    Sklep *tmp;
    int pom=0;
    char bufor[41];
    char *miejscowosc;

    system("cls");
    puts("Podaj miejscowosc, w ktorej znajduje sie sklep: ");
    gets(bufor);
    miejscowosc = (char*)malloc(sizeof(char)* (strlen(bufor) + 1));
    strcpy(miejscowosc, bufor);

    tmp = head;

    puts(" ______________________________________________________________________________________________");
    printf("|%-15s|%-30s|%-30s|%-8s|%-7s|\n", "Nr. sklepu", "Miejscowosc", "Branza", "L. prac.", "G. otw.");
    puts("|---------------|------------------------------|------------------------------|--------|-------|");
    while (tmp!=NULL)
    {

        if (strcmp(tmp->dane.miejscowosc, miejscowosc)==0)
        {
            printf("|%-15ld|%-30s|%-30s|%-8d|%2d-%-2d  |\n", tmp->dane.numer, tmp->dane.miejscowosc, tmp->dane.branza, tmp->dane.liczba_p, tmp->dane.godzina_o, tmp->dane.godzina_z );
            pom++;
        }
        tmp = tmp->next;
    }
    puts("'---------------'------------------------------'------------------------------'--------'-------'");

    if (pom==0)
    {
        system("cls");
        puts("Brak takich sklepow");
    }
    free(miejscowosc);
    getchar();
}
//Usuwanie wybranego elementu
void usuwan_wybrany_element(Sklep **head)
{
    Sklep *tmp, *pom;
    long int numer;

    system("cls");
    puts("Podaj numer sklepu: ");
    scanf("%ld", &numer);

    tmp = wyszukaj_element_numer(*head, numer);
    if (tmp == NULL)
    {
        puts("Nie ma takiego sklepu");
        getchar();
    }
    else
    {
        if (tmp == *head)
        {
            *head = (*head)->next;
            if (tmp->dane.numer)
                free(tmp->dane.numer);
            if (tmp->dane.branza)
                free(tmp->dane.branza);
            if (tmp->dane.miejscowosc)
                free(tmp->dane.miejscowosc);
            if (tmp->dane.liczba_p)
                free(tmp->dane.liczba_p);
            if (tmp->dane.godzina_o)
                free(tmp->dane.godzina_o);
            if (tmp->dane.godzina_z)
                free(tmp->dane.godzina_z);
            free(tmp);
        }
        else
        {
            pom = *head;
            while ((strcmp(pom->next->dane.miejscowosc, tmp->dane.miejscowosc) != 0))
                pom = pom->next;
            pom->next = tmp->next;
            if (tmp->dane.numer)
                free(tmp->dane.numer);
            if (tmp->dane.branza)
                free(tmp->dane.branza);
            if (tmp->dane.miejscowosc)
                free(tmp->dane.miejscowosc);
            if (tmp->dane.liczba_p)
                free(tmp->dane.liczba_p);
            if (tmp->dane.godzina_o)
                free(tmp->dane.godzina_o);
            if (tmp->dane.godzina_z)
                free(tmp->dane.godzina_z);
            free(tmp);
        }
    }
}

//Menu g³ówne
void menu(Sklep *head, Branza_list *head2)
{
    char i;

    do
    {
        system("cls");
        printf("1. Dodaj sklep do bazy.\n");
        printf("2. Wyszykaj sklep o podanym numerze.\n");
        printf("3. Wyszukaj sklepy o podanej liczbie pracownikow.\n");
        printf("4. Wyszukaj sklepy o podanych godzinach otwarcia.\n");
        printf("5. Wyszukaj sklepy znajdujacy sie w podanej miejscowosci.\n");
        printf("6. Wyswietl liste branzowa\n");
        printf("7. Usun wybrany sklep z bazy\n");
        printf("8. Dodaj branze.\n");
        printf("0. Wyjscie\n\n");
        printf("Twoj wybor: ");
        i = getchar();
        getchar();
        if (i == '1')
        {
            dodaj_sklep(&head, head2);
            getchar();
        }
        else if (i == '2') wyswietl_element_numer(head);
        else if (i == '3') wyswietl_element_liczba_p(head);
        else if (i == '4') wyswietl_element_godziny(head);
        else if (i == '5') wyswietl_element_miejscowosc(head);
        else if (i == '6') wyswietlanie_listy(head);
        else if (i == '7')
        {
            usuwan_wybrany_element(&head);
            getchar();
        }
        else if (i == '8') ;
    }
    while (i != '0');
}

int main()
{
    Sklep *head = NULL;
    Branza_list *head2 = NULL;
    char el_staly[]= {"Piekarnia"};
    dodaj_branze_const(&head2, el_staly);
    char a[]= {"Apteka"};
    dodaj_branze_const(&head2, a);
    Branza_list *tmp;
    tmp=head2;

    menu(head, head2);
    return 0;
}


1

1 Lista branż będzie działać poprawnie jeśli będzie wyglądała jakoś tak:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct lista_branz
{
    char* branza;
    lista_branz* next;
};
 
void dodaj_branze(lista_branz *head, char *nazwa)
{ 	
    lista_branz *element = (lista_branz*)malloc(sizeof(lista_branz));
    element->branza = nazwa;
    element->next = NULL;
    	
    lista_branz *tmp = head;
    while (tmp->next) tmp = tmp->next; 
    tmp->next = element;
}
 
bool sprawdz_branze(lista_branz *head, char *branza)
{
    lista_branz *tmp = head;
	
    while (tmp != NULL && strcmp((tmp->branza), branza) != 0)
        tmp = tmp->next;
    if (tmp == NULL) return false;
    else return true;
}

int main()
{
    lista_branz *head = (lista_branz*)malloc(sizeof(lista_branz));
    char nazwa[] = {"cokolwiek"};
    head->branza = nazwa;
    head->next = NULL;
	
    char b1[] = {"Piekarnia"};
    dodaj_branze(head, b1);
	
    char b2[] = {"Apteka"};
    dodaj_branze(head, b2);
	
    char b3[] = {"abc"}; 
    if (sprawdz_branze(head, b3)) printf("branza na liscie\n");
        else printf("branzy nie ma na liscie\n");
	
    return 0;
}

więc ostatnio dodany element wstawiać na koniec listy i przed dodaniem czegokolwiek ustawić łeb branż na jakąkolwiek wartość.

2 Przed poprawieniem branży należy wyczyścić bufor inaczej funkcja gets nie zadziała tak jak powinna, gdyż coś tam już siedzi, po poprawkach wygląda to jakoś tak:

while (true)
{
    gets(bufor2);
    branza = (char*)malloc(sizeof(char)* (strlen(bufor2) + 1));
    strcpy(branza, bufor2);
 
    if (sprawdz_branze(head2, branza) == 1) break;
        
    system("cls");
    puts("Nie ma takiej branzy w bazie");
    puts("1. Dodaj do bazy.");
    puts("2. Popraw");
    char y = getchar();
    if (y == '1')
    {
        dodaj_branze(head2, branza);
        break;
    }
    else
    {        
        fflush(stdin);  // czyszczenie bufora przed ponownym wpisywaniem danych
        system("cls");
        free(branza);
        printf("Podaj branze ponownie: ");
    }
}

3 Po co próbujesz zwalniać pamięć po czymś co nie jest wskaźnikiem:

if (tmp->dane.numer)
     free(tmp->dane.numer);           // błąd kompilacji
if (tmp->dane.branza)
    free(tmp->dane.branza);
if (tmp->dane.miejscowosc)
    free(tmp->dane.miejscowosc);
if (tmp->dane.liczba_p)
    free(tmp->dane.liczba_p);        // błąd kompilacji
if (tmp->dane.godzina_o)
    free(tmp->dane.godzina_o);     // błąd kompilacji
if (tmp->dane.godzina_z)
    free(tmp->dane.godzina_z);     // błąd kompilacji
free(tmp);

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