Mam listę jednokierunkową co zrobić aby była dwukierunkowa listą. Poniżej kod programu:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct Osoba{
char nazwisko[20];
unsigned wiek;
float zarobki;
};
struct Lista{
Lista*next;
Osoba dane;
};
//WCZYTYWNIE DANYCH Z KLAWIATURY
Osoba wczytaj_dane(){
Osoba O;
printf("Nazwisko:");
scanf("%s",O.nazwisko);
printf("Wiek:");
scanf("%f",&O.zarobki);
return O;
}
//DODANIE OSOBY NA KONIEC LISTY
void dodaj_osobe(Lista**Pierwszy,Lista**Ostatni,Osoba O)
{
Lista*pomoc;
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;
}
break;
}
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)
{
Lista*pomoc;
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Ą POWYŻEJ ZERA
int policz_bogaczy(Lista*Pierwszy,float zar)
{
int l=0;
Lista*pomoc;
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-wyswietl na ekranie\n");
printf("5-koniec programu\n");
scanf("%d",&z);
return z;
}
//WYSWIETLANIE 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[20];
int z,byla,w;
Osoba O;
char sciezka[100];
do{
z=menu();
switch(z)
{
case 1:O=wczytaj_dane();dodaj_osobe(&Pierwszy,&Ostatni,O);break;
case 2:printf("Podaj nazwisko do usuniecia:");
scanf("%s",naz);
byla=usun_osobe(&Pierwszy,naz);
if(!byla)printf("Brak takiej osoby!!!\n");
break;
case 3:printf("Podaj nazwisko osoby szukanej:");
scanf("%s",naz);
byla=szukaj(Pierwszy,naz);
if(!byla)printf("Brak osoby szukanej!!!\n");
break;
case 4:wyswietl_dane(Pierwszy);
break;
}
}while (z!=5);
return 0;
}