[C][C++] Lista jedno/dwukierunkowa

nezekan
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 11 sty 2015, o 16:54
Płeć: Mężczyzna
Lokalizacja: Kraków

[C][C++] Lista jedno/dwukierunkowa

Post autor: nezekan »

Witam.
Jestem początkujący w dziedzinie programowania c/c++ i potrzebuje pewnego nakierowania na rozwiązanie problemu ,który napotkałem.
Problem dotyczy listy i wyświetlania wprowadzonych danych.
Poniższy kod reprezentuje definicje struktury oraz dwie funkcje.
Problem się pojawia gdy chce odczytać wprowadzone dane program się crashuje. I nie mogę za bardzo znaleźć rozwiązania. .Prawdę mówiąc nie rozumiem za bardzo list i nie wiem czy poniższy kod wogole się do czegoś przyda.(Narazie chciałem wpisać i odczytać zmienna tytuł nie widziałem sensu dodawać narazie reszty zmiennych skoro kod nie działa. Założeniem tez jest żeby program opierał się na strukturach i funkcjach.)

Kod: Zaznacz cały

 struct Zbior{
	
	char tytul;
	char autor;
	int isbn;
	int numer; 
	struct Zbior *nast, *pop; 							// numer katalogowy
}*ksiazka;
////////////////////////////////////////////////////
void utworz() 
{ 
   char tyt; 
   printf("podaj tytul "); 
   scanf("%s",&tyt);
   Zbior *p = new Zbior(); 
   p->tytul = tyt; 
   p->nast = NULL; 
   if(ksiazka == NULL) 
     ksiazka=p; 
   else 
   { 
      Zbior *tmp = ksiazka; 
      while(tmp->nast) 
         tmp = tmp->nast; 
      tmp->nast = p;  
   } 
}
///////////////////////////////////////////////////////////////////////////////
void wypisz() 
{ 
   Zbior *p; 
   int i=1; 
   for (Zbior *p=ksiazka;p;p=p->nast,i++) 
      printf("tytul:%s 
",p->tytul);
	  
}
Ostatnio zmieniony 11 sty 2015, o 17:27 przez Afish, łącznie zmieniany 1 raz.
Powód: Stosuj tagi code.
akermann1
Użytkownik
Użytkownik
Posty: 94
Rejestracja: 27 gru 2014, o 19:13
Płeć: Mężczyzna
Lokalizacja: Wrc
Podziękował: 15 razy
Pomógł: 5 razy

[C][C++] Lista jedno/dwukierunkowa

Post autor: akermann1 »

Kod: Zaznacz cały

void wypisz()
{
   Zbior *p;
   int i=1;
   for (Zbior *p=ksiazka;p;p=p->nast,i++)
      printf("tytul:%s 
",p->tytul);
    
}
Nie bardzo rozumiem tą pętlę... wypisuj książki na które wskazuje i teraz nie wiem o co tutaj chodzi czy tutaj nie powinien być warunek bardziej?
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C][C++] Lista jedno/dwukierunkowa

Post autor: Vardamir »

Piszesz w C czy w C++, ja bym się na coś zdecydował.

To co zrobiłeś nie jest do końca dobrym pomysłem, struktura powinna wyglądać tak:

Kod: Zaznacz cały

 struct Zbior{
	char tytul; // string jeśli C++
	char autor; // string jeśli C++
	int isbn;
	int numer; 
	Zbior *nast, *pop;
};
Teraz twój main powinien wyglądać tak (zamiast "utwórz" bardziej pasuje "dodaj"):

Kod: Zaznacz cały

 int main() {
	Zbior *ksiazka;
	ksiazka=nullptr;
	dodaj(&ksiazka);
	wypisz(ksiazka);
};
Funkcje powinny teraz odnosić się do wskaźnika jaki otrzymają w argumencie.
akermann1 pisze:i teraz nie wiem o co tutaj chodzi czy tutaj nie powinien być warunek bardziej?
To jest warunek: dopóki p na coś wskazuje;
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C][C++] Lista jedno/dwukierunkowa

Post autor: Afish »

Zapisywanie łańcuchów znaków w typie char to zły pomysł, trzeba użyć char* i ręcznie alokować pamięć (lub string w C++).
Gouranga
Użytkownik
Użytkownik
Posty: 1565
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 243 razy

[C][C++] Lista jedno/dwukierunkowa

Post autor: Gouranga »

tak na prawdę najlepiej do struktur używać składni z typedef:

Kod: Zaznacz cały

typedef struct Book {
  char *title;
  char *author;
  int isbn;
  int number;
  struct Book *next, *prev;
} Book
taka składnia pozwala w dalszej części całkowicie pomijać słówka kluczowe "struct" przy definiowaniu zmiennych tego typu czy definiowaniu funkcji z argumentami typu strukturalnego
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C][C++] Lista jedno/dwukierunkowa

Post autor: Vardamir »

Chyba, że będziemy trzymać się c++. Wtedy nie trzeba pisać typedef, jest ustawiane domyślnie.
Gouranga
Użytkownik
Użytkownik
Posty: 1565
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 243 razy

[C][C++] Lista jedno/dwukierunkowa

Post autor: Gouranga »

Vardamir, ja tam piszę w C89, stąd typedef i char*
ODPOWIEDZ