• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program z listą dwukierunkową

Object Storage Arubacloud
0 głosów
348 wizyt
pytanie zadane 1 lutego 2022 w C i C++ przez Damian Migała Nowicjusz (150 p.)

Witam, mam za zadanie stworzyć program do przechowywania danych osobowych na liście dwukierunkowej, jednak mam problem którego nie mogę rozwiązać ze strukturą lista_osob, którego nie mogę rozwiązać. Liczę na pomoc.

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

struct osoba
{
    char Nazwisko[100];
    char Imie[100];
    char Plec[10];
    int PESEL;
    int Wiek;
    
};
struct lista_osob
{
	lista_osob *s_up;
	osoba s;
	lista_osob *s_down;
		
};
void ustaw_osobe(lista_osob &st)
{
	scanf("Podaj nazwisko osoby: %s", &Nazwisko);
	scanf("Podaj imie osoby: %s", &Imie);
	scanf("Podaj plec osoby: %s", &Plec);
	scanf("Podaj PESEL: %d", &PESEL;);
	scanf("Podaj wiek: %d", &Wiek);
	
}
void dodaj_osobe(lista_osob **s)
{
	lista_osob* t = *s;
	if(*s){
		lista_osob* st = new lista_osob;
		ustaw_osobe(*st);
		while(t->s_down){
			t = t->s_down;
		}
		st->s_up = t;
		st->s_down = 0;
		t->s_down = st;
	}else{
		*s = new lista_osob;
		ustaw_osobe(**s)
		(*s)->s_up = NULL;
		(*s)->s_down = NULL;
	}
}
void usun_osobe(lista_osob **s, int index)
{
	if(*s && index > -1){
		lista_osob *indx = *s;
		for(int i = 1; i <=index; i++){
			indx = indx->s_down;
		}
		if(!indx->s_up && !indx->s_down){
			delete indx;
		}else if(index == 0){
			*s = (*s)->s_down;
			delete indx;
			indx = 0;
		}else if(indx->s_up && indx->s_down){
			indx->s_up->s_down = indx->s_down;
			indx->s_down->s_up = indx->s_up;
			delete indx;
			indx = 0;
		}else if(!indx->s_down){
			indx->s_up->s_down = 0;
			delete indx;
			indx = 0;
		}
	}	
}
void wypisz_osoby(lista_osob *s)
{
	if(s){
		printf("=========================================================\n");
		do{
			printf("Nazwisko: %s", s->s.Nazwisko);
			printf("Imie: %s", s->s.Imie);
			printf("Plec: %s", s->s.Plec);
			printf("PESEL: %d", s->s.PESEL);
			printf("Wiek: %d", s->s.Wiek);
			printf("=========================================================\n");
			s = s->s_down;
		}while(s);
	}
}
void zwolnij_pamiec(lista_osob **s)
{
	lista_osob *temp;
	while(*s){
		temp = (*s)->s_down;
		delete (*s);
		*s = temp;
	}		
}


int main() 
{
	lista_osob *s = 0;
	
	dodaj_osobe(&s);
	
	wypisz_osoby(s);
	
	
	
	
	
	return 0;
}

 

komentarz 1 lutego 2022 przez Marak123 Stary wyjadacz (11,190 p.)
A jaki jest problem dokładnie??
komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
[Error] unknown type name 'lista_osob'

[Error] unknown type name 'osoba'

[Error] unknown type name 'lista_osob'; use 'struct' keyword to refer to the type

Takie typy błędów dostaje

2 odpowiedzi

+2 głosów
odpowiedź 1 lutego 2022 przez Marak123 Stary wyjadacz (11,190 p.)
wybrane 1 lutego 2022 przez Damian Migała
 
Najlepsza

Obstawiam ze jest to język "C" a nie "C++" dodaj słowo struct przed inicjacją struktury np.

struct lista_osob
{
    struct lista_osob *s_up;
    struct osoba s;
    struct lista_osob *s_down;
         
};

Powinno pomóc

komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
A na co mam zamienić s_up i s_down?
komentarz 1 lutego 2022 przez Marak123 Stary wyjadacz (11,190 p.)
To jest nazwa. Twój program twoja nazwa.
komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
[Error] request for member 's_up' in something not a structure or union

Bo taki błąd dostaje
komentarz 1 lutego 2022 przez Marak123 Stary wyjadacz (11,190 p.)
Linijka która??
komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
35,36,38,39,40,53,55,61,62,63,66,67
komentarz 1 lutego 2022 przez Marak123 Stary wyjadacz (11,190 p.)

Ogólnie to wpisując problem w Internet można łatwo i szybko znaleźć co jest nie tak.

https://bytes.com/topic/c/answers/811235-request-member-something-not-structure-union

Ogólnie to chyba nie za bardzo rozumiesz działanie wskaźników bo jest tam tyle '&' i '*' ze nie wiem po co.

https://www.p-programowanie.pl/cpp/wskazniki

linijka 31:

lista_osob* t = *s;

tworzysz wskaźnik do zmiennej ze wskaźnikiem wskaźnika itd. można się pogubić. 

linijka 29:

void dodaj_osobe(lista_osob **s)

w parametrach pobierasz wskaźnik do zmiennej ze wskaźnikiem, za pomocą '**' pobiera się wskaźnik zmiennej ze wskaźnikiem wystarczy tam tylko jednak '*' i nie potrzeba linijki 3:

linijka 101:

 

lista_osob *s = 0;

Stworzyłeś wskaźnik do pustej struktury

wystarczy:

struct lista_osob s = 0;
dodaj_osobe(&s)

Musisz przeczytać jak stosować wskaźniki. Coś tak czuje że ten kod to było kopiuj wklej bo zapewne dużo błędów ci jeszcze wyskoczy po naprawie tych.

Chyba że się mylę i ja nie umiem wskaźników to w takim przypadku przepraszam. 

komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
Dziękuję.
Wzorowałem się po prostu na podobnym kodzie tylko, że w C++ i stąd te błędy.
+1 głos
odpowiedź 1 lutego 2022 przez Ecro Nowicjusz (220 p.)

Tak jak jest napisane w ostatnim komunikacie o błędzie, przed nazwą lista_osob w definicji struktury lista_osob brakuje słowa kluczowego struct, podobnie przed nazwą osoba. Poprawnie powinno być:

struct lista_osob
{
    struct lista_osob *s_up;
    struct osoba s;
    struct lista_osob *s_down;
         
};

 

komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
[Error] request for member 's_up' in something not a structure or union

A co mógłbym zrobić z tym?
komentarz 1 lutego 2022 przez Ecro Nowicjusz (220 p.)
a wyświetla Ci się może o którą linię kodu chodzi?
komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
35,36,38,39,40,53,55,61,62,63,66,67
komentarz 1 lutego 2022 przez Ecro Nowicjusz (220 p.)
edycja 1 lutego 2022 przez Ecro

Szczerze mówiąc, przejrzałem Twój kod i ma on trochę więcej błędów. Wiele z nich wynika między innymi z zapomnienia o słowie kluczowym struct tak jak powyżej. Np. w definicji funkcji w linii 48. U Ciebie widnieje:

void usun_osobe(lista_osob **s, int index)

a raczej powinno być:

void usun_osobe(struct lista_osob **s, int index)

To słowo struct jest bardzo ważne, bo ma ono znaczenie podobne np. do tego int przy parametrze index. Osobiście uważam, że jest ono niewygodne i zwykle definiuję struktury w taki sposób:

typedef struct lista_osob
{
    struct lista_osob *s_up;
    struct osoba s;
    struct lista_osob *s_down;
         
} lista_osob;

użycie słowa typedef sprawia, że zamiast zawsze używać struct lista_osob możesz używać tego co napiszesz po nawiasie klamrowym, czyli w tym przypadku po prostu lista_osob.

Innym dosyć istotnym błędem jest np. znajdująca się w funkcji dodaj_osobę dosyć dziwna konstrukcja:

lista_osob* st = new lista_osob;

chcąc stworzyć nową strukturę najlepiej użyć dynamicznej alokacji pamięci i  napisać to np. tak:

        lista_osob *new;
        new = (lista_osob *)malloc(sizeof(lista_osob));

Używanie list dwukierunkowych w C nie jest prostą sprawą i sam miałem z tym problemy jak zaczynałem, wydaje mi się, że raczej ciężko poprawiać te wszystkie błędy tutaj na forum, ale za to jeśli masz ochotę mogę polecić Ci kilka kanałów na YT, gdzie jest to super wytłumaczone. Po oglądnięciu kilku poradników szybko uporasz się z poprawieniem błędów w swoim programie.

komentarz 1 lutego 2022 przez Damian Migała Nowicjusz (150 p.)
Dziękuję i jak najbardziej byłbym chętny zobaczyć te filmy :)
komentarz 1 lutego 2022 przez Ecro Nowicjusz (220 p.)
Nie ma problemu, mam nadzieję, że chociaż trochę pomogłem :)

Jeśli chodzi o filmy to polecam kanały "Jacob Sorber" oraz "Portfolio Courses" na Youtube. Osobiście bardzo wiele się z nich nauczyłem, między innymi na temat właśnie list jedno i dwukierunkowych oraz dynamicznej alokacji pamięci. Na tych kanałach znajdziesz również dużo innej przydatnej wiedzy na temat języka C. Poniżej załączam linki do dwóch filmów, które mogą Cię zainteresować:

1) https://youtu.be/VOpjAHCee7c     ----> film o listach jednokierunkowych

2) https://youtu.be/KFbm6lkMhgw    -----> film o listach dwukierunkowych

a jeśli chodzi o wskaźniki to polecam początek tego filmiku:

3) https://youtu.be/iChalAKXffs    -----> wskaźniki

Mam nadzieję, że okażą się przydatne :)

Podobne pytania

0 głosów
2 odpowiedzi 177 wizyt
pytanie zadane 13 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)
+1 głos
1 odpowiedź 146 wizyt
pytanie zadane 5 czerwca 2020 w C i C++ przez kamylmeister Nowicjusz (190 p.)
0 głosów
1 odpowiedź 1,552 wizyt
pytanie zadane 14 listopada 2019 w C i C++ przez baromeister Nowicjusz (140 p.)

92,555 zapytań

141,403 odpowiedzi

319,555 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...