lista dwukierunkowa w C

0

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;
}
0

zrob w pojedynczym wezle wskaznik dajmy na to: prev, i przy tworzeniu nowego wezla ustawiaj go na wezel poprzedni (w pierwszym na NULL)..

0

możesz pokazac w których miejscach kodu programu

0
speeder napisał(a)

//DODANIE OSOBY NA KONIEC LISTY
void dodaj_osobe(ListaPierwszy,ListaOstatni,Osoba O)
{
Lista*pomoc;

pomoc=(Lista)malloc(sizeof(Lista));
pomoc->dane=O;
pomoc->next=NULL;
pomoc->prev=Ostatni;
if(
Pierwszy==NULL){
Pierwszy=pomoc;
(
Pierwszy)->prev=NULL; // nie wiem dokladnie jak tam masz z tym ostatnim w kodzie ale na wszelki wypadek
}
else(Ostatni)->next=pomoc;
Ostatni=pomoc;
}
//USUWANIE PODANEJ OSOBY Z LISTY
short usun_osobe(Lista*Pierwszy,charnaz)
{ ... }w tej funkcji masz na zadanie domowe zmodyfikowac ;)

poczytaj troche o tym, to wcale nie jest trudne (zwlaszcza jesli wiesz co to jest lista jednokierunkowa, a zakladajac ze powyzszy kod napisales sam to raczej wiesz), troche myslenia...

0

Sporo po czasie ale muszę to napisać. Jeśli ktoś wie jak zrobić listę jednokierunkową i potrafi ją obsłużyć to jakim cudem nie potrafi przerobić jej na dwukierunkową? Jedyne co mi się nasuwa na myśl to to, że kompletnie nie rozumie kodu który wkleił. Czyżby nie jego kod? Nie lubię czegoś takiego...

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