Lista jednokierunkowa.

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Jak powinno się zapisywać listę do pliku aby później było można ją łatwo wczytać?
Mam taki kod ale nie wiem na jakiej podstawie później wczytywać to z powrotem do listy... I z tym wskaźnikiem pewnie coś pomieszałem :/

Kopiuj
 FILE *plik = fopen("test.txt","w");
     while(wsk!=NULL){
                 fwrite(wsk->imie,sizeof (char),strlen(wsk->imie),plik);
                 fwrite(wsk->nazwisko,sizeof (char),strlen(wsk->nazwisko),plik);

                 fwrite(&wsk,sizeof (Wizytowki), 1, plik);
                 wsk=wsk->nastepny;
                 }
     fclose(pliczek);

     }
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

fwrite(wsk,sizeof(*wsk),1,plik);
przy odczycie pamiętaj o odtworzeniu wskaźnika następny, bo będzie w nim kaszana.

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Dlaczego w utworzonym pliku tekstowym zapisuje mi także jakieś ścieżki (np. ows\system32\cmd.exe 1 _NO_HOST_CHECK=NO HOMEDRIVE=1 HOMEPATH=\Users\z1).
Gdzieś mam ustawiony zły rozmiar?

Dodatkowo powinienem zapisywać wszystkie dane w nowej linii aby móc to później odczytać (czym najlepiej to rozdzielić)? Bo z ciągu znaków bez przerw będzie ciężko cokolwiek wyciągnąć...

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Pytałeś jak najprościej odczytać zapisać a nie jak to zapisać aby plik był czytelny dla użytkownika.

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

A jak w ogóle się wziąć za odczytywanie z utworzonego pliku? ;)

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Napisałby mi ktoś funkcję zapisującą i odczytującą listę z plików? Za ile $? :D

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Zapisuję listę do pliku takim kodem:

Kopiuj
FILE *plik = fopen("test.txt","wb");
     while(wsk!=NULL){
                 fwrite(wsk->imie,sizeof (char),strlen(wsk->imie),plik);
                 fwrite(wsk->nazwisko,sizeof (char),strlen(wsk->nazwisko),plik);
                 fwrite(wsk->nazwafirmy,sizeof (char),strlen(wsk->nazwafirmy),plik);
                 fwrite(wsk->branza,sizeof (char),strlen(wsk->branza),plik);
                 fwrite(wsk->telefon,sizeof (char),strlen(wsk->telefon),plik);
                 fwrite(wsk->email,sizeof (char),strlen(wsk->email),plik);
                 fwrite(wsk->www,sizeof (char),strlen(wsk->www),plik);
                 fwrite(wsk->ulica,sizeof (char),strlen(wsk->ulica),plik);
                 fwrite(wsk->nrdomu,sizeof (char),strlen(wsk->nrdomu),plik);
                 fwrite(wsk->pocztowy,sizeof (char),strlen(wsk->pocztowy),plik);
                 fwrite(wsk->miasto,sizeof (char),strlen(wsk->miasto),plik);
                 fwrite(wsk,sizeof(*wsk),1,plik);
                 wsk=wsk->nastepny;
                 }
     fclose(plik);

Jak mam to teraz wczytać tym fread? Z góry dzięki za pomoc ;)

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Nie ma takiej możliwości bo nie wiesz gdzie się kończy jeden a gdzie zaczyna się drugi tekst.

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Pomoże ktoś oprócz _13th_Dragon z wczytaniem listy z pliku? :D
_13th_Dragon już bardzo dziękuję...

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1

Tworzysz liste
Otwierasz plik
Dopoki nie dojdziesz do konca:
tworzysz nowy rekord
wypelniasz wartosciami

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Napisałby ktoś wczytywanie z pliku za 10zł? ;)

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Zapisuję listę do pliku takim kodem:

Kopiuj
void zapisz(Wizytowki *lista)
{
     char nazwa[30];
     Wizytowki *wsk = lista;

     FILE *plik = fopen("test.dat","wb");
     while(wsk!=NULL){
                 fwrite(wsk,sizeof(Wizytowki),1,plik);
                 wsk=wsk->nastepny;
                 }
     fclose(plik);

     }

Próbuję wczytywać takim czymś ale wiem, że to jest źle ;)

Kopiuj
int wczytaj(Wizytowki *lista)
{
        FILE *plik = fopen("test.dat","r");
     Wizytowki *nowa = (Wizytowki*)malloc(sizeof(Wizytowki));
     while(wsk=NULL){
                 fread(nowa,sizeof(Wizytowki),1,plik);

                 }
     fclose(plik);

}

Pomoże ktoś z tym wczytywaniem bo nie wiem co zrobić żeby działało... :/

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
  1. Odczyt zmienia początek listy więc trzeba przyjmować jako (Wizytowki **lista)
  2. Pętla ma być dopóki nie skończy się plik
  3. Wczytuj do jakiejś struktury statycznej Wizytowki bufor;
  4. Przydzielaj pamięć wewnątrz pętli i kopiuj do niej bufor.
  5. Nie zapomnij ustawić nowa->następny do tego celu będziesz potrzebować wskaźnik Wizytowki *ostatnia=NULL;
    if(ostatnia) ostatnia->następny=nowa;
    else *lista=nowa;
    ostatnia=nowa;
Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Dzięki za pomoc ale zrobiłem to trochę inaczej. Podczas wczytywania tworzona jest nowa wizytówka z danymi pobranymi z pliku.
Oto kod:

Kopiuj
//zapisywanie do pliku
void zapisz(Wizytowki *lista)
{
     char nazwa[30];
     Wizytowki *wsk = lista;

     printf("Podaj nazwe pliku do zapisania");
     fflush(stdin);
     fgets(nazwa, sizeof nazwa, stdin);

     FILE *plik = fopen("wizytownik_dane.dat","w+b");
     while(wsk!=NULL){
                 fwrite(wsk->imie,30,1,plik);
                 fwrite(wsk->nazwisko,30,1,plik);
                 fwrite(wsk->nazwafirmy,50,1,plik);
                 fwrite(wsk->branza,30,1,plik);
                 fwrite(wsk->telefon,15,1,plik);
                 fwrite(wsk->email,50,1,plik);
                 fwrite(wsk->www,30,1,plik);
                 fwrite(wsk->ulica,30,1,plik);
                 fwrite(wsk->nrdomu,4,1,plik);
                 fwrite(wsk->pocztowy,7,1,plik);
                 fwrite(wsk->miasto,20,1,plik);
                 wsk=wsk->nastepny;
                 }
     fclose(plik);

     }



//wczytywanie z pliku
void wczytaj(Wizytowki **lista)
{    char line[500];

FILE *plik = fopen("wizytownik_dane.dat","r+b");

     while(!feof(plik))
     {

     Wizytowki *nowa = (Wizytowki*)malloc(sizeof(Wizytowki));
     fread(nowa->imie,30,1,plik);
     fread(nowa->nazwisko,30,1,plik);
     fread(nowa->nazwafirmy,50,1,plik);
     fread(nowa->branza,30,1,plik);
     fread(nowa->telefon,15,1,plik);
     fread(nowa->email,50,1,plik);
     fread(nowa->www,30,1,plik);
     fread(nowa->ulica,30,1,plik);
     fread(nowa->nrdomu,4,1,plik);
     fread(nowa->pocztowy,7,1,plik);
     fread(nowa->miasto,20,1,plik);

     dodaj(lista, nowa);
     }

}

Wczytywanie działa ale tworzy się o 1 wizytówkę za dużo i zawiera ona jakieś ścieżki itp. Co powinienem zrobić aby nie tworzyła się na końcu wizytówka z błędnymi danymi?
Podejrzewam, że ta pętla: while(!feof(plik)) wykonuje się o jeden raz za dużo...

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
  1. Pętla ma być nieskończona while(true)
  2. Przed dodaj if(feof(plik)) break;
  3. Czy dodaj wstawią podaną strukturę czy robi jej kopię? Jeżeli kopie to należy zwolnić wskaźnik nowa
  4. Zamiast fread(nowa->imie,sizeof(nowa->imie),1,plik); to samo z fwrite, oraz pozostałymi polami
  5. Znacznie prościej by było przy poprzedniej wersji zapisu while(fread(nowa,sizeof(Wizytowki),1,plik)==1) { dodaj(lista,nowa); /ewentualnie przydzielamy nowa do następnego read/ } /zwalniamy nie użytą/
Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Właśnie odkryłem, że sortowanie nie działa jak należy... :/

Kopiuj
//porównywacz imie
int compare_imie(const void* first, const void* second)
{
    Wizytowki* a = (Wizytowki*)first;
    Wizytowki* b = (Wizytowki*)second;
    return strcmp(a->imie,b->imie)<0;
}

//porównywacz nazwisko
int compare_nazwisko(const void* first, const void* second)
{
    Wizytowki* a = (Wizytowki*)first;
    Wizytowki* b = (Wizytowki*)second;
    return strcmp(a->nazwisko,b->nazwisko)<0;
}

//porównywacz firma
int compare_firma(const void* first, const void* second)
{
    Wizytowki* a = (Wizytowki*)first;
    Wizytowki* b = (Wizytowki*)second;
    return strcmp(a->nazwafirmy,b->nazwafirmy)<0;
}

//porównywacz email
int compare_email(const void* first, const void* second)
{
    Wizytowki* a = (Wizytowki*)first;
    Wizytowki* b = (Wizytowki*)second;
    return strcmp(a->email,b->email)<0;
}

//funkcja wyswietlajaca posegregowane wizytowki
void sortuj_imie(Wizytowki *lista, int a)
{

    int d=dlugosc_listy(lista);
    Wizytowki *wsk = lista;

    Wizytowki **tm=(Wizytowki**)malloc(d*sizeof(Wizytowki*));


    int i = 0;
    while(wsk != NULL)
    {

              tm[i]=wsk;
              wsk = wsk->nastepny;
              i++;

    }
    if(a==2)
    qsort(tm, i, sizeof(tm), compare_imie);
    else if(a==3)
    qsort(tm, i, sizeof(tm), compare_nazwisko);
    else if(a==4)
    qsort(tm, i, sizeof(tm), compare_firma);
    else if(a==5)
    qsort(tm, i, sizeof(tm), compare_email);

    int j=0;

    while( j < i )
     {

            printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", j+1, tm[j]->imie, tm[j]->nazwisko, tm[j]->nazwafirmy, tm[j]->branza, tm[j]->telefon, tm[j]->email, tm[j]->www, tm[j]->ulica, tm[j]->nrdomu, tm[j]->pocztowy, tm[j]->miasto);
            j++;
     }


  free(tm);
}

Co może być nie tak? Wcześniej wydawało się, że działa dobrze ale teraz okazuje się, że jednak nie :/

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
  1. ma być <0
  2. Wizytowki a=((Wizytowki**)first);
  3. tak samo z Wizytowki *b
  4. tak samo we wszystkich porównujących
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

strcmp(a->nazwafirmy,b->nazwafirmy)>0;

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Funkcja ta ma taki kod:

Kopiuj
int dlugosc_listy(Wizytowki *lista)
{
    int d = 0;
    Wizytowki *wsk = lista;
    while(wsk != NULL)
    {
              d++;
              wsk = wsk->nastepny;
              }
    return d;
    }

Co tu może być nie tak? ;)

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Dzięki wszystkim za pomoc ;) W końcu mogę oddać projekt... Wiem, że nie jest do końca poprawnie napisany ale ważne że wszystko działa :D

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1

W celu wyjasnienia, porownanie do qsorta musi zwracac nastepujace wartosci:
0 - jesli rowne.
<0 - jesli drugi obiekt jest wiekszy.

0 - jesli pierwszy obiekt jest wiekszy.
Dlatego tez z samym strcmp dziala.

Z3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Kod programu dla potomnych... Może komuś się przyda. Tylko proszę nie komentować :D

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

typedef struct Wizytowki
    {
        char imie[30], nazwisko[30];
        char nazwafirmy[50], branza[30];
        char telefon[15], email[50], www[30], ulica[30], nrdomu[4], pocztowy[7], miasto[20];

        struct Wizytowki *nastepny;

    } Wizytowki;


// zlicza dlugosc listy
int dlugosc_listy(Wizytowki *lista)
{
    int d = 0;
    Wizytowki *wsk = lista;
    while(wsk != NULL)
    {
              d++;
              wsk = wsk->nastepny;
              }
    return d;
    }


// dodaje nowy wezel do listy
void dodaj(Wizytowki **lista, Wizytowki *nowa)
{
     while (*lista != NULL) lista = &((*lista)->nastepny);
     *lista = nowa;
     nowa->nastepny = NULL;
}



// dodaje wizytowke do listy
void dodajWizytowke(Wizytowki **lista)
{    char line[500];
     Wizytowki *nowa = (Wizytowki*)malloc(sizeof(Wizytowki));
     printf("\nPodaj imie: ");
     scanf("%s", nowa->imie);

     printf("Podaj nazwisko: ");
     scanf("%s", nowa->nazwisko);

     printf("Podaj nazwe firmy: ");
     fflush(stdin);
     fgets(nowa->nazwafirmy, sizeof nowa->nazwafirmy, stdin);


     printf("Podaj branze: ");
     fflush(stdin);
     fgets(nowa->branza, sizeof nowa->branza, stdin);

     printf("Podaj numer telefonu: ");
     fflush(stdin);
     fgets(nowa->telefon, sizeof nowa->telefon, stdin);

     printf("Podaj email: ");
     scanf("%s", nowa->email);

     printf("Podaj adres strony www: ");
     scanf("%s", nowa->www);

     printf("Podaj adres zamiszkania: \n");
     printf("Ulica: ");
     fflush(stdin);
     fgets(nowa->ulica, sizeof nowa->ulica, stdin);
     char len=strlen(nowa->ulica);
     if((len)&&(nowa->ulica[len-1]=='\n')) nowa->ulica[len-1]=0;

     printf("Numer domu: ");
     scanf("%s", nowa->nrdomu);

     printf("Kod pocztowy: ");
     scanf("%s", nowa->pocztowy);

     printf("Miasto: ");
     fflush(stdin);
     fgets(nowa->miasto, sizeof nowa->miasto, stdin);


     dodaj(lista, nowa);

}



//Wypisuje cala liste
void wypisz_liste(Wizytowki *lista)
{

     Wizytowki *wsk = lista;

     if(lista == NULL)
     printf("\nLISTA JEST PUSTA");
     else
     printf("Lista zawiera %d wizytowek: \n\n", dlugosc_listy(lista) );
     int i = 1;
     while( wsk != NULL)
     {
            printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", i, wsk->imie, wsk->nazwisko, wsk->nazwafirmy, wsk->branza, wsk->telefon, wsk->email, wsk->www, wsk->ulica, wsk->nrdomu, wsk->pocztowy, wsk->miasto);
            wsk=wsk->nastepny;
            i++;
     }
}

//wipisuje wybrana wizytowke po imieniu
void wypisz_wizytowke_imie_lista(Wizytowki *lista, char wyszukaj[50])
{

     Wizytowki *wsk = lista;

     if(lista == NULL)
     printf("\nLISTA JEST PUSTA");

     int i = 1, istnieje = 0;
     while( wsk != NULL )
     {
         if(strcmp(wsk->imie, wyszukaj)==0)
         {
             printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", i, wsk->imie, wsk->nazwisko, wsk->nazwafirmy, wsk->branza, wsk->telefon, wsk->email, wsk->www, wsk->ulica, wsk->nrdomu, wsk->pocztowy, wsk->miasto);
             istnieje++;
         }
            wsk=wsk->nastepny;
            i++;
     }
     if(istnieje==0)
     printf("\nNie znaleziono wizytowki o podanych kryteriach\n");
}

//wipisuje wybrana wizytowke po nazwisku
void wypisz_wizytowke_nazwisko_lista(Wizytowki *lista, char wyszukaj[50])
{

     Wizytowki *wsk = lista;

     if(lista == NULL)
     printf("\nLISTA JEST PUSTA");

     int i = 1, istnieje = 0;
     while( wsk != NULL )
     {
         if(strcmp(wsk->nazwisko, wyszukaj)==0)
         {
             printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", i, wsk->imie, wsk->nazwisko, wsk->nazwafirmy, wsk->branza, wsk->telefon, wsk->email, wsk->www, wsk->ulica, wsk->nrdomu, wsk->pocztowy, wsk->miasto);
             istnieje++;
         }
            wsk=wsk->nastepny;
            i++;
     }
     if(istnieje==0)
     printf("\nNie znaleziono wizytowki o podanych kryteriach\n");
}

//wipisuje wybrana wizytowke po nazwie firmy
void wypisz_wizytowke_firma_lista(Wizytowki *lista, char wyszukaj[50])
{

     Wizytowki *wsk = lista;

     if(lista == NULL)
     printf("\nLISTA JEST PUSTA");

     int i = 1, istnieje = 0;
     while( wsk != NULL )
     {
         if(strcmp(wsk->nazwafirmy, wyszukaj)==0)
         {
             printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", i, wsk->imie, wsk->nazwisko, wsk->nazwafirmy, wsk->branza, wsk->telefon, wsk->email, wsk->www, wsk->ulica, wsk->nrdomu, wsk->pocztowy, wsk->miasto);
             istnieje++;
         }
            wsk=wsk->nastepny;
            i++;
     }
     if(istnieje==0)
     printf("\nNie znaleziono wizytowki o podanych kryteriach\n");
}

//wipisuje wybrana wizytowke po adresie email
void wypisz_wizytowke_email_lista(Wizytowki *lista, char wyszukaj[50])
{

     Wizytowki *wsk = lista;

     if(lista == NULL)
     printf("\nLISTA JEST PUSTA");

     int i = 1, istnieje = 0;
     while( wsk != NULL )
     {
         if(strcmp(wsk->email, wyszukaj)==0)
         {
             printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", i, wsk->imie, wsk->nazwisko, wsk->nazwafirmy, wsk->branza, wsk->telefon, wsk->email, wsk->www, wsk->ulica, wsk->nrdomu, wsk->pocztowy, wsk->miasto);
             istnieje++;
         }
            wsk=wsk->nastepny;
            i++;
     }
     if(istnieje==0)
     printf("\nNie znaleziono wizytowki o podanych kryteriach\n");
}


//Usuwa wizytowke z listy
void usun(Wizytowki **lista, int ID)
{
             Wizytowki *poprzedni = NULL;
             Wizytowki *wsk = *lista;

             int i=0;
             for(i = 1; i < ID; i++)
             {
                     poprzedni=wsk;
                     wsk=wsk->nastepny;

                     }
             if(poprzedni==NULL)
             {
             (*lista)=(*lista)->nastepny;
             free(wsk);
             }
             else
             {
                 poprzedni->nastepny=wsk->nastepny;
                 free(wsk);
                 }
}

//Usuwa wizytowke z listy na podstawie numeru
void usun_wizytowke(Wizytowki **lista)
{
     int ID;
     printf("Podaj numer wizytowki do usuniecia: " );
     scanf("%d", &ID);

     if((ID > dlugosc_listy(*lista)) || (ID < 1))
     {
           printf("\nNie ma takiego indeksu");

           }
     else
     {
         usun(lista,ID);
         printf("\nUsunieto wizytowke");
         }
}

//usuwa branze z listy
int usun_branza_lista(char* usbranza, Wizytowki **lista)
     {
          Wizytowki *poprzedni=NULL;
          Wizytowki *wsk= *lista;
           //strcmp porownoje napisy
          while((wsk != NULL) && ( ( strcmp(wsk->branza, usbranza)!=0) ))
          {
                     poprzedni=wsk;
                     wsk=wsk->nastepny;
          }
          if(wsk == NULL )
          {
                 return 0;
                 }
          else
          {
                 if(poprzedni==NULL)
             {
             (*lista)=(*lista)->nastepny;
             free(wsk);
             }
             else
             {
                 poprzedni->nastepny=wsk->nastepny;
                 free(wsk);
                 }
               return 1;
               }
}

//usuwa po branzy
void usun_branza(Wizytowki **lista)
{
          char usbranza[30];
          int ilosc=0;

           printf("Podaj branze do usuniecia: ");
           fflush(stdin);
           fgets(usbranza, 30, stdin);



          while(usun_branza_lista(usbranza, lista)==1)
          {
              if(usun_branza_lista(usbranza, lista))
              ilosc++;

              else
              {
                  ilosc++;
                  break;
              }

          }

          if(ilosc>=1)
          printf("Usunieto wizytowki o podanej branzy");
          else
          printf("Zadna wizytowka nie zostala usunieta poniewaz branza nie istnieje");

          }

//usuwa wizytowki na podstawie pocz¹tku nazwy firmy
int usun_firmy_lista(char* usfirma, Wizytowki **lista)
     {
          Wizytowki *poprzedni=NULL;
          Wizytowki *wsk= *lista;
           //strcmp porownoje napisy
          while((wsk != NULL &&  ( strcmp(usfirma, wsk->nazwafirmy)!=0) && ( strcmp(usfirma, wsk->nazwafirmy)>0) ))
          {
                     poprzedni=wsk;
                     wsk=wsk->nastepny;
          }
          if(wsk == NULL )
          {
                 return 0;
                 }
          else
          {
                 if(poprzedni==NULL)
             {
             (*lista)=(*lista)->nastepny;
             free(wsk);
             }
             else
             {
                 poprzedni->nastepny=wsk->nastepny;
                 free(wsk);
                 }
               return 1;
               }
}

//usuwa po pocz¹tku nazwy firmy
void usun_firma(Wizytowki **lista)
{
          char usfirma[30];
          int ilosc=0;

           printf("Podaj poczatek nazwy firmy do usuniecia: ");
           fflush(stdin);
           fgets(usfirma, 30, stdin);



          while(usun_firmy_lista(usfirma, lista)==1)
          {
              if(usun_firmy_lista(usfirma, lista))
              ilosc++;

              else
              {
                  ilosc++;
                  break;
              }

          }

          if(ilosc>=1)
          printf("Usunieto wizytowki o podanym poczatku nazwy firmy");
          else
          printf("Zadna wizytowka nie zostala usunieta poniewaz firma o takim poczatku nie istnieje");

          }

//edytuje wizytowke o podanym id
void edytuj(Wizytowki **lista, int ID, char doedycji[20])
{
             Wizytowki *poprzedni = NULL;
             Wizytowki *wsk = *lista;
             Wizytowki *nowa = (Wizytowki*)malloc(sizeof(Wizytowki));

             int i=0;
             for(i = 1; i < ID; i++)
             {
                     poprzedni=wsk;
                     wsk=wsk->nastepny;

               }
for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='1' || doedycji[i]=='9')
    {
        printf("\nPodaj nowe imie: ");
        scanf("%s", wsk->imie);
        break;
    }
}

for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='2' || doedycji[i]=='9')
    {
     printf("Podaj nowe nazwisko: ");
     scanf("%s", wsk->nazwisko);
     break;
    }
}

for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='3' || doedycji[i]=='9')
    {
     printf("Podaj nowa nazwe firmy: ");
     fflush(stdin);
     fgets(wsk->nazwafirmy, sizeof wsk->nazwafirmy, stdin);
     break;
    }
}


for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='4' || doedycji[i]=='9')
    {
     printf("Podaj nowa branze: ");
     fflush(stdin);
     fgets(wsk->branza, sizeof wsk->branza, stdin);
     break;
    }
}

for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='5' || doedycji[i]=='9')
    {
     printf("Podaj nowy numer telefonu: ");
     fflush(stdin);
     fgets(wsk->telefon, sizeof wsk->telefon, stdin);
     break;
    }
}


for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='6' || doedycji[i]=='9')
    {
     printf("Podaj nowy email: ");
     scanf("%s", wsk->email);
     break;
    }
}


for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='7' || doedycji[i]=='9')
    {
     printf("Podaj nowy adres strony www: ");
     scanf("%s", wsk->www);
     break;
    }
}


for(i=0; i<20; i++)
{
    if(doedycji[i]=='\0')
    break;
    else if(doedycji[i]=='8' || doedycji[i]=='9')
    {
     printf("Podaj nowy adres zamiszkania: \n");
     printf("Ulica: ");
     fflush(stdin);
     fgets(wsk->ulica, sizeof wsk->ulica, stdin);
     char len=strlen(wsk->ulica);
      if((len)&&(wsk->ulica[len-1]=='\n')) wsk->ulica[len-1]=0;

     printf("Numer domu: ");
     scanf("%s", wsk->nrdomu);

     printf("Kod pocztowy: ");
     scanf("%s", wsk->pocztowy);

     printf("Miasto: ");
     fflush(stdin);
     fgets(wsk->miasto, sizeof wsk->miasto, stdin);
     break;
    }
}

}


//funkcja edytujaca wizytowke
void edytuj_wizytowke(Wizytowki **lista)
{

int ID;
char doedycji[20];

     printf("Podaj numer wizytowki ktora chcesz edytowac: " );
     scanf("%d", &ID);
     printf("\n1-imie, 2-nazwisko, 3-nazwa firmy, 4-branza, 5-numer telefonu, 6-adres email, 7-adres strony, 8-adres pocztowy, 9-wszystko\n");
     printf("Wpisz po przecinku wszystkie liczby w zaleznosci od tego co chcesz edytowac:\n");
     scanf("%s", doedycji);

     if((ID > dlugosc_listy(*lista)) || (ID < 1))
     {
           printf("\nNie ma takiego indeksu");

           }
     else
     {
         edytuj(lista,ID, doedycji);
         printf("\nWizytowka zmieniona");
         }
}

//porównywacz imie
int compare_imie(const void* first, const void* second)
{
    Wizytowki *a=*((Wizytowki**)first);
    Wizytowki *b=*((Wizytowki**)second);
    return strcmp(a->imie,b->imie);
}

//porównywacz nazwisko
int compare_nazwisko(const void* first, const void* second)
{
    Wizytowki *a=*((Wizytowki**)first);
    Wizytowki *b=*((Wizytowki**)second);
    return strcmp(a->nazwisko,b->nazwisko);
}

//porównywacz firma
int compare_firma(const void* first, const void* second)
{
    Wizytowki *a=*((Wizytowki**)first);
    Wizytowki *b=*((Wizytowki**)second);
    return strcmp(a->nazwafirmy,b->nazwafirmy);
}

//porównywacz email
int compare_email(const void* first, const void* second)
{
    Wizytowki *a=*((Wizytowki**)first);
    Wizytowki *b=*((Wizytowki**)second);
    return strcmp(a->email,b->email);
}

//funkcja wyswietlajaca posegregowane wizytowki
void sortuj_imie(Wizytowki *lista, int a)
{

    int d=dlugosc_listy(lista);
    Wizytowki *wsk = lista;

    Wizytowki **tm=(Wizytowki**)malloc(d*sizeof(Wizytowki*));


    int i = 0;
    while(wsk != NULL)
    {

              tm[i]=wsk;
              wsk = wsk->nastepny;
              i++;

    }
    if(a==2)
    qsort(tm, i, sizeof(tm), compare_imie);
    else if(a==3)
    qsort(tm, i, sizeof(tm), compare_nazwisko);
    else if(a==4)
    qsort(tm, i, sizeof(tm), compare_firma);
    else if(a==5)
    qsort(tm, i, sizeof(tm), compare_email);

    int j=0;

    while( j < i )
     {

            printf("%d. %s %s\n firma: %s branza: %s telefon: %s email: %s\n %s\n Adres:\n %s %s \n %s %s\n", j+1, tm[j]->imie, tm[j]->nazwisko, tm[j]->nazwafirmy, tm[j]->branza, tm[j]->telefon, tm[j]->email, tm[j]->www, tm[j]->ulica, tm[j]->nrdomu, tm[j]->pocztowy, tm[j]->miasto);
            j++;
     }


  free(tm);
}


//zapisywanie do pliku
void zapisz(Wizytowki *lista)
{
     char nazwa[30];
     Wizytowki *wsk = lista;

     printf("Podaj nazwe pliku do zapisania (koniecznie z rozszerzeniem .dat)\n");
     scanf("%s",nazwa);

     FILE *plik = fopen(nazwa,"w+b");
     while(wsk!=NULL){
                 fwrite(wsk->imie,sizeof(wsk->imie),1,plik);
                 fwrite(wsk->nazwisko,sizeof(wsk->nazwisko),1,plik);
                 fwrite(wsk->nazwafirmy,sizeof(wsk->nazwafirmy),1,plik);
                 fwrite(wsk->branza,sizeof(wsk->branza),1,plik);
                 fwrite(wsk->telefon,sizeof(wsk->telefon),1,plik);
                 fwrite(wsk->email,sizeof(wsk->email),1,plik);
                 fwrite(wsk->www,sizeof(wsk->www),1,plik);
                 fwrite(wsk->ulica,sizeof(wsk->ulica),1,plik);
                 fwrite(wsk->nrdomu,sizeof(wsk->nrdomu),1,plik);
                 fwrite(wsk->pocztowy,sizeof(wsk->pocztowy),1,plik);
                 fwrite(wsk->miasto,sizeof(wsk->miasto),1,plik);
                 wsk=wsk->nastepny;

                 }
     fclose(plik);

     printf("\nDane zostaly zapisane do pliku %s", nazwa);



     }



//wczytywanie z pliku
void wczytaj(Wizytowki **lista)
{    char line[500];
     char nazwa[30];

printf("Podaj nazwe pliku z ktorego chcesz wczytac (koniecznie z rozszerzeniem .dat)\n");
printf("Plik z przykladowymi danymi: dane.dat\n\n");
     scanf("%s",nazwa);

FILE *plik = fopen(nazwa,"r+b");

  if(plik==NULL)
  {
      printf("Nie moge otworzyc pliku %s do wczytania.\n", nazwa);
   }

   else

     while(1)
     {
     Wizytowki *nowa = (Wizytowki*)malloc(sizeof(Wizytowki));
     fread(nowa->imie,sizeof(nowa->imie),1,plik);
     fread(nowa->nazwisko,sizeof(nowa->nazwisko),1,plik);
     fread(nowa->nazwafirmy,sizeof(nowa->nazwafirmy),1,plik);
     fread(nowa->branza,sizeof(nowa->branza),1,plik);
     fread(nowa->telefon,sizeof(nowa->telefon),1,plik);
     fread(nowa->email,sizeof(nowa->email),1,plik);
     fread(nowa->www,sizeof(nowa->www),1,plik);
     fread(nowa->ulica,sizeof(nowa->ulica),1,plik);
     fread(nowa->nrdomu,sizeof(nowa->nrdomu),1,plik);
     fread(nowa->pocztowy,sizeof(nowa->pocztowy),1,plik);
     fread(nowa->miasto,sizeof(nowa->miasto),1,plik);
     if(feof(plik)) break;
     dodaj(lista, nowa);
     }

     fclose(plik);
}



int main()
{

    int wybor=1, ile, k;
    char szukaj[50];
    Wizytowki *lista = NULL;

printf("\n\nWitaj w programie WIZYTOWNIK");

    while(wybor != 8)
           {


printf("\n\nmozesz korzystac z nastepujacych polecen:\n\n");
printf("1.Dodaj | 2.Edytuj | 3.Usun | 4.Wyswietl wszystkie | 5.Szukaj | 6.Zapisz | 7.Wczytaj | 8.Wyjscie\n\n");
printf("wpisz 1,2,3,4,5 lub 6\n");
scanf("%d",&wybor);


switch(wybor)
{
    case 1:
    printf("Ile wizytowek chcesz dodac?\n");
    scanf("%d",&ile);
    if(ile==0)
    break;
    for(k=0;k<ile;k++)
    dodajWizytowke(&lista);
    break;

    case 2:
    edytuj_wizytowke(&lista);
    break;

    case 3:
    printf(" Wpisz 1 jesli chcesz usuwac na podstawie numeru wizytowki \n 2 jesli chcesz usuwac dana branze\n 3 jesli chcesz usunac na podstawie poczatku nazwy firmy\n");
    scanf("%d",&ile);
    if(ile==1)
    usun_wizytowke(&lista);
    else if(ile==2)
    usun_branza(&lista);
    else if(ile==3)
    usun_firma(&lista);
    break;

    case 4:
    printf("Wpisz 1 aby wyswietlic wizytowki posortowane wedlug indeksu\n 2 - posortowane wedlug imienia\n 3 - posortowane wedlug nazwiska\n 4 - posortowane wedlug nazwy firmy\n 5 - posortowane wedlug adresu email\n");
    scanf("%d",&ile);
    if(ile==1)
    wypisz_liste(lista);
    else if(ile==2||3||4||5)
    sortuj_imie(lista, ile);
    break;

    case 5:
    printf(" Wpisz 1 jesli chcesz szukac po imieniu\n 2 szukaj po nazwisku\n 3 szukaj po nazwie firmy\n 4 szukaj po adresie email\n");
    scanf("%d",&ile);
    if(ile==1)
    {
        printf("Wpisz imie ktore chcesz wyszukac\n");
        scanf("%s",szukaj);
        wypisz_wizytowke_imie_lista(lista, szukaj);
    }
    else if(ile==2)
    {
        printf("Wpisz nazwisko ktore chcesz wyszukac\n");
        scanf("%s",szukaj);
        wypisz_wizytowke_nazwisko_lista(lista, szukaj);
    }
    else if(ile==3)
    {
        printf("Wpisz nazwe firmy ktora chcesz wyszukac\n");
        fflush(stdin);
        fgets(szukaj, 50, stdin);
        wypisz_wizytowke_firma_lista(lista, szukaj);
    }
    else if(ile==4)
    {
        printf("Wpisz adres email ktory chcesz wyszukac\n");
        scanf("%s",szukaj);
        wypisz_wizytowke_email_lista(lista, szukaj);
    }

    break;

    case 6:
    zapisz(lista);
    break;

    case 7:
    wczytaj(&lista);
    break;

    case 8:
    break;

}
}



    return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.