Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.



Podobne dokumenty
DYNAMICZNE PRZYDZIELANIE PAMIECI

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Wskaźniki. Programowanie Proceduralne 1

Podstawy programowania komputerów

Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy

ZASADY PROGRAMOWANIA KOMPUTERÓW

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Struktury czyli rekordy w C/C++

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Tablice, funkcje - wprowadzenie

Podstawy programowania w języku C++

Programowanie w języku C++

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wskaźniki w C. Anna Gogolińska

KURS C/C++ WYKŁAD 6. Wskaźniki

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Języki i metodyka programowania. Wskaźniki i tablice.

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Stałe, tablice dynamiczne i wielowymiarowe

Wstęp do programowania

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Podstawy programowania w języku C++

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Wskaźniki. Informatyka

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Zmienne i struktury dynamiczne

Lab 9 Podstawy Programowania

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Struktury. Przykład W8_1

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Podstawy programowania w języku C++

E S - uniwersum struktury stosu

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Zmienne, stałe i operatory

Dynamiczne struktury danych

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

. Podstawy Programowania 2. Dwukierunkowa lista liniowa. Arkadiusz Chrobot. 7 kwietnia 2019

Funkcje zawarte w bibliotece < io.h >

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Wykład 1: Wskaźniki i zmienne dynamiczne

Struktury, unie, formatowanie, wskaźniki

Funkcje zawarte w bibliotece < io.h >

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Argumenty wywołania programu, operacje na plikach

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Uzupełnienie dot. przekazywania argumentów

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Zasady programowania Dokumentacja

Podstawy Programowania Podstawowa składnia języka C++

Pliki. Informacje ogólne. Obsługa plików w języku C

Temat: Operacje na plikach. Pliki tekstowe i binarne. Faza otwarcia, zapisu/odczytu i zamknicia pliku.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Wstęp do programowania

ALGORYTMY I STRUKTURY DANYCH

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Podstawy programowania C. dr. Krystyna Łapin

Podstawy programowania skrót z wykładów:

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Podstawy programowania w języku C++

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Szablony klas, zastosowanie szablonów w programach

Tablice, funkcje, wskaźniki - wprowadzenie

Programowanie i struktury danych

Podstawy programowania w języku C++

Pliki. Informacje ogólne. Obsługa plików w języku C

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Wprowadzenie do programowania w języku C

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Wykład 4: Klasy i Metody

Część 4 życie programu

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Deklaracja struktury w C++

Jak Windows zarządza pamięcią?

Podstawy programowania 1

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Algorytmy i język C++

Transkrypt:

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne (zmienne lokalne funkcji - tworzone i usuwane automatycznie przez kompilator) tzw. STOS (ang. stack) dane dynamiczne (zmienne, które można tworzyć i usuwać w dowolnym momencie pracy programu) w pamięci wolnej komputera tzw. STERTA (ang. heap) Zmienne dynamiczne są to zmienne tworzone przez programistę w pamięci wolnej komputera (na stercie) dostęp do takiej zmiennej możliwy jest jedynie poprzez jej adres w pamięci (przechowywany w zmiennej wskaźnikowej). 2. Funkcje przydziału i zwalniania pamięci W języku C do dynamicznego przydzielania pamięci (tworzenia zmiennych dynamicznych) służą specjalne funkcje z biblioteki < alloc.h > albo <stdlib.h>. void malloc( size_t rozmiar ); // przydział bloku o zadanej wielkosci void calloc( size_t il_elementow, size_t rozmiar); // przydział pamięci // dla tablicy dynamicznej void free( void wskaznik); // zwolnienie wskazywanego obszaru unsigned coreleft( void ); // sprawdzenie wolnego miejsca na stercie 1

Przykład 1 // przydział i zwolnienie pamięci na stercie int main( ) int wsk; // zmienna wskaźnikowa do zapamiętania adresu liczby int int x=5; wsk = (int ) malloc( sizeof(int) ); // przydzielenie pamięci na liczbę int if( wsk == NULL ) printf( Błąd przydziału pamięci ); else wsk = 10; wsk = 2; printf( %d, wsk ); scanf( %d, wsk ); // przykładowe operacje na dynamicznej liczbie int free( wsk ); // zwolnienie pamięci // dane spod wskaźnika wsk już nie są dostępne, a // dane ze zmiennej x są w dalszym ciągu widoczne return 0; wsk x Stack (stos) 20 Heap (sterta) 2

Przykład 2 // tablica dynamiczna int rozmiar_tablicy; double T; printf( Ile liczb chcesz wprowadzić: ); scanf( %d, &rozmiar_tablicy ); if( T = (double ) calloc( rozmiar_tablicy, sizeof(double) ) ) // przydział // pamięci dla tablicy dynamicznej for( int i = 0; i < rozmiar_tablicy, i++ ); ( T+i ) = i*2; // albo T[ i ] =i*2; free(t); // zwolnienie pamięci przeznaczonej na tablicę Przykład 3 // struktura dynamiczna struct Osoba char nazwisko[30]; char imie[20]; float zarobki; ; Osoba wsk_osoby; wsk_osoby = (Osoba ) malloc( sizeof(osoba) ); // przydział pamięci dla // danych typu Osoba. Dane są dostępne przez wskaźnik wsk_osoby if( wsk_osoby ) // if( wsk_osoby!= NULL ) printf( Podaj nazwisko: ); gets(wsk_osoby > nazwisko ); printf( Podaj imie: ); gets(wsk_osoby > imie); printf( Podaj zarobki: ); scanf( %f,&(wsk_osoby > zarobki));... Wsk_osoby->zarobki+=100.50;... free( wsk_osoby ); // zwolnienie pamięci przeznaczonej dla danych // typu Osoba Jeżeli pod wskaźnikiem zapamiętana jest struktura, to dostęp do jej pól jest możliwy przez użycie operatora -> 3

Przykład 4 //dynamiczna tablica struktur int rozmiar_tablicy; Osoba T; printf( Ile liczb chcesz wprowadzić: ); scanf( %d, &rozmiar_tablicy ); T = (Osoba ) calloc( rozmiar_tablicy, sizeof(osoba)); // przydział pamięci dla tablicy dynamicznej if( T == NULL ) printf( Błąd przydziału pamięci ); else for( int i = 0; i < rozmiar_tablicy, i++ ); printf( Podaj nazwisko: ); gets(( T+i ) > nazwisko ); // gets(t[i].nazwisko); printf( Podaj imie: ); gets((t+i)->imie); // gets(t[i].imie); printf( Podaj zarobki: ); scanf( %f,&((t+i)->zarobki)); // scanf( %f,&t[i].zarobki); free( T ); dynamicznej // zwolnienie pamięci przeznaczonej dla tablicy 3. Struktura listy (jednokierunkowej) Struktura listy, to liniowa struktura dynamiczna, dla której: nie trzeba podawać maksymalnej liczby danych, można wstawiać, usuwać i wyszukiwać dane, w trakcie usuwania danych listy zwalniana jest pamięć, której zasób można ponownie wykorzystać w programie. Listę budują wskaźniki do struktury, w których zdefiniowane są dwa pole: pole danych, pole z adresem kolejnego elementu (wskaźnika) listy Listę reperezentuje adres jej pierwszego elementu. 4

Przykładowa deklaracja wskaźnika reperezentującego element listy struct Osoba nazwisko ; char nazwisko[40]; dane wiek unsigned wiek; zarobki float zarobki; next struct Lista Osoba dane; Lista *next; ; Pierwszy Kowalski,80, 1200.00 dane next Nowak, 28, 1123,5 dane next Iksinski 32, 1300.45 dane next NULL

a) Operacja dodawania nowego elemenu na koniec listy Przed Po Pierwszy Ostatni NULL Ostatni NULL Pierwszy adres pierwszego elementu listy Ostatni adres ostatniego elementu listy O struktura z danymi, które wstawiamy na koniec listy Adresy Pierwszy i Ostatni mogą się zmieniać w trakcie realizacji funkcji dodaj_osobe, dlatego są przekazywane przez adres (stąd dwie gwiazdki przed nazwą parametru) Jedno wywołanie funkcji dodaj_osobe dodaje na koniec listy jeden element. Dwa przypadki realizacji funkcji dodaj_osobe: wstawianie do pustej listy, wstawianie do niepustej listy

void dodaj_osobe(lista **Pierwszy,Lista **Ostatni,Osoba O) pomoc=(lista *)malloc(sizeof(lista)); // rezerwacja pamięci pomoc->dane=o; // kopiowanie danych ze struktury O do pola dane // wskaźnika pomoc pomoc->next=null; // ustawienie wskaźnika next w adresie pomoc na // wartości NULL if (*Pierwszy==NULL) // przypadek wstawiania do pustej listy *Pierwszy=pomoc; else (*Ostatni)->next=pomoc; // przypadek wstawiania do niepustej listy // podczepienie wskaźnika pomoc *Ostatni=pomoc; // zmiana wskaźnika Ostatni b) Operacja przeglądania listy Funkcja szukaj sprawdza, czy dane parametrem naz znajduje się na liście. Jeżeli tak, to wynikiem funckji szukaj jest wartości 1, w przeciwnym przypadku zwracana jest wartość 0. Pierwszy adres pierwszego elementu na liście naz poszukiwane nazwisko Lista * szukaj(lista *Pierwszy,char *naz) Lista* wynik=null; pomoc=pierwszy; // ustawienie wskaźnika pomoc na pierwszym elemencie // listy while (pomoc) // pętla przglądająca listę if (strcmp(pomoc->dane.nazwisko,naz)==0) wynik=pomoc;

pomoc=pomoc->next; // ustawienie wskaźnika pomoc na kolejnym // elemencie listy return wynik; int policz_bogaczy(lista *Pierwszy,float kwota) int ile=0; pomoc=pierwszy; // ustawienie wskaźnika pomoc na pierwszym elemencie // listy while (pomoc) // pętla przglądająca listę If (pomoc->dane.zarobki>kwota) ile++; pomoc=pomoc->next; // ustawienie wskaźnika pomoc na kolejnym // elemencie listy return ile; c) Operacja usuwania elementu listy Przed Po Pierwszy Pierwszy Element do usunięcia

Funkcja usun_osobe usuwa osobę o podanym nazwisku. Jeżeli na liście występuje kilka osób o podanym do usunięcia nazwisku, to usuwane są wszystkie elementy z tym nazwiskiem. Pierwszy adres pierwszego elementu listy naz nazwisko do usunięcia Funkcja zwraca wartość 1, gdy usunięcie zaszło i wartość 0 w przeciwnym przypadku. Przypadki realizacji funkcji usun_osobe: nazwiska naz nie ma na liście, nazwisko naz występuje w adresie Pierwszy nazwisko naz występuje w adresie innym niż Pierwszy int usun_osobe(lista **Pierwszy,char *naz) int byla=0; Lista *pomoc,*poprzedni; // wskaźnik poprzedni ustawiany jest na elemencie // poprzednim w stosunku do usuwanego pomoc=*pierwszy; poprzedni=null; while (pomoc!=null) if (strcmp(pomoc->dane.nazwisko,naz)==0)// nazwisko naz znajduje się w // adresie pomoc byla=1; if (pomoc==*pierwszy) // nazwisko naz występuje w adresie // Pierwszy *Pierwszy=pomoc->next; free(pomoc); pomoc=*pierwszy; else // nazwisko naz znajduje się adresie innym niż Pierwszy poprzedni->next=pomoc->next;

free(pomoc); pomoc=poprzedni->next; else // nazwiska naz nie ma w adresie pomoc i trzeba przejść // z adresami poprzedni i pomoc do następnego elementu listy poprzedni=pomoc; pomoc=pomoc->next; return byla; Przykład 5 // Program z wykładu nr 10, wktórym tablica struktur została zastąpiona // strukturą listy #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> struct Osoba char nazwisko[40]; unsigned wiek; float zarobki; ; struct Lista Osoba dane; Lista *next; ; // ---------------- wczytywanie danych z klawiatury---------------------------------- Osoba wczytaj_dane() Osoba O; printf("nazwisko:"); scanf("%s",o.nazwisko);

printf("wiek:"); scanf("%d",&o.wiek); printf("zarobki:"); scanf("%f",&o.zarobki); return O; // ---------------------------dodawanie osoby na koniec listy--------------------- void dodaj_osobe(lista **Pierwszy,Lista **Ostatni,Osoba O) pomoc=(lista *)malloc(sizeof(lista)); pomoc->dane=o; pomoc->next=null; if (*Pierwszy==NULL) *Pierwszy=pomoc; else (*Ostatni)->next=pomoc; *Ostatni=pomoc; //---------usuwanie podanej osoby z listy -------------------------------------------------- short usun_osobe(lista **Pierwszy,char *naz) short byla=0; Lista *pomoc,*poprzedni; pomoc=*pierwszy; poprzedni=null; while (pomoc!=null) if (strcmp(pomoc->dane.nazwisko,naz)==0) byla=1; if (pomoc==*pierwszy) *Pierwszy=pomoc->next; free(pomoc); pomoc=*pierwszy;

else poprzedni->next=pomoc->next; free(pomoc); pomoc=poprzedni->next; else poprzedni=pomoc; pomoc=pomoc->next; return byla; //-------------- wypisywanie danych na ekranie --------------------------------------------- void wypisz_informacje(osoba O) printf("nazwisko:%s\nwiek:%d\nzarobki:%0.2f\n",o.nazwisko, O.wiek,O.zarobki); //-----------------szukanie osoby i wypisywanie jej danych na ekranie -------------- int szukaj(lista *Pierwszy,char *naz) int byla=0; pomoc=pierwszy; while (pomoc!=null) if (strcmp(pomoc->dane.nazwisko,naz)==0) wypisz_informacje(pomoc->dane); byla=1; pomoc=pomoc->next;

return byla; // -------------- wyznaczanie liczby osób, które zarabiają powyzej zar---------------- int policz_bogaczy(lista *Pierwszy,float zar) int l=0; pomoc=pierwszy; while (pomoc!=null) if (pomoc->dane.zarobki>zar) l++; pomoc=pomoc->next; return l; // ------------ menu programu ----------------------------------------------- int menu() int z; printf("1-dodaj osobe\n"); printf("2-usun osobe\n"); printf("3-znajdz osobe\n"); printf("4-policz bogaczy\n"); printf("5-zapisz dane\n"); printf("6-wczytaj dane\n"); printf("7-drukuj w pliku\n"); printf("8-wyswietl na ekranie\n"); printf("9-koniec programu\n"); scanf("%d",&z); return z;

// ---------------zapis danych z listy do pliku binarnego ---------------------- void zapis(char *sciezka,lista *Pierwszy) FILE *f; pomoc=pierwszy; f=fopen(sciezka,"wb"); if (f!=null) while (pomoc!=null) fwrite(&(pomoc->dane),sizeof(osoba),1,f); pomoc=pomoc->next; fclose(f); // ------------- odczyt danych z pliku binarnego i wstawienie danych na listę------ void odczyt(char *sciezka,lista **Pierwszy,Lista **Ostatni) FILE *f; f=fopen(sciezka,"rb"); pomoc=*pierwszy; Osoba O; if (f!=null) while (fread(&o,sizeof(osoba),1,f)==1) dodaj_osobe(pierwszy,ostatni,o); fclose(f); //----------------zapis danych z listy w pliku tekstowym --------------------- void zapis_do_tekstowego(char *sciezka,lista *Pierwszy) FILE *f; int i=0; f=fopen(sciezka,"wt");

pomoc=pierwszy; if (f!=null) while (pomoc!=null) if (i==0) fprintf(f,"lista osob\n"); fprintf(f,"%40s %3d %10.2f\n",pomoc->dane.nazwisko, pomoc->dane.wiek,pomoc->dane.zarobki); pomoc=pomoc->next; i++; fclose(f); // ---------------------- wyświetlenie danych z listy na ekranie ---------------- void wyswietl_dane(lista *Pierwszy) Lista *pomoc=pierwszy; while (pomoc!=null) wypisz_informacje(pomoc->dane); pomoc=pomoc->next; //------------------------usuwanie całej listy------------------------------ void usun_liste(lista **Pierwszy) Lista *pomoc=*pierwszy; while (pomoc!=null) *Pierwszy=pomoc->next; free(pomoc); pomoc=*pierwszy;

// -----------------------funkcja main ----------------------------------------------- int main( ) Lista *Pierwszy,*Ostatni; Pierwszy=NULL; Ostatni=NULL; char naz[40]; int z,byla,w; float zar; Osoba O; char sciezka[100]; do z=menu(); switch(z) case 1: O=wczytaj_dane();dodaj_osobe(&Pierwszy,&Ostatni,O); case 2: printf("podaj nazwisko do usuniecia:"); scanf("%s",naz); byla=usun_osobe(&pierwszy,naz); if (!byla) printf ("Brak takiej osoby!!!\n"); case 3:printf("Podaj nazwisko osoby szukanej: "); scanf("%s",naz); byla=szukaj(pierwszy,naz); if (!byla) printf("brak osoby szukanek!!!\n"); case 4:printf("Podaj wysokosc sredniej krajowej: "); scanf("%f",&zar); printf("liczba osob zarabiajacych powyzej sredniej:%d\n",policz_bogaczy(pierwszy,zar));

case 5:printf("Podaj sciezke pliku do zapisu: "); scanf("%s",sciezka); zapis(sciezka,pierwszy); case 6:printf("Podaj sciezke pliku do odczytu: "); scanf("%s",sciezka); if (Pierwszy!=NULL) printf("zestaw danych nie jest pusty, co dalej?\n 1- dopisac dane z pliku, 2-nadpisac dane?:"); scanf("%d",&w); if (w==2) usun_liste(&pierwszy); Ostatni=NULL; odczyt(sciezka,&pierwszy,&ostatni); case 7:printf("Podaj sciezke pliku tekstowego: "); scanf("%s",sciezka); zapis_do_tekstowego(sciezka,pierwszy); case 8:wyswietl_dane(Pierwszy); while (z!=9); return 0;