Lista dwukierunkowa C++, problem z wyświetlaniem

0

Witam, mam problem z wyświetlaniem elementów listy dwukierunkowej, mianowicie wyświetla mi jedynie pierwszy element listy. Pewnie coś ze wskaźnikami źle zrobiłem, proszę o pomoc.

 
using namespace std;

struct element
{
int wartosc;
string *imie;
string *nazwisko;

element *nast;
element *pop;
};
//-------------globalny wskaznik na pierwszy i ostatni element------------------
element *pierwszy = NULL;
element *ostatni = NULL;

//--------------------------------funkcje---------------------------------------
//---------------------------dodawanie elementu---------------------------------
void dodaj(int x, string *y, string *z)
{
    if(pierwszy == NULL)
    {
    pierwszy = (element*)malloc(sizeof(element));
    pierwszy->wartosc = x; 
    pierwszy->imie = y; 
    pierwszy->nazwisko = z; 
    pierwszy->nast = NULL;
    pierwszy->pop = NULL;
    ostatni = pierwszy; 
    }
        else
        {
        element *e = (element*)malloc(sizeof(element));
        pierwszy->wartosc = x; 
        pierwszy->imie = y; 
        pierwszy->nazwisko = z; 
        ostatni->nast = e;
        e->pop = ostatni; 
        e->nast = NULL; 
        ostatni = e;
        }
}

//--------------------------------wyswietlenie listy----------------------------
void wypisz()
{
element *tmp = pierwszy; 
    while(tmp != NULL) 
    {
        printf("%d ", tmp->wartosc);
        printf("\t");
        printf("%s ", &tmp->imie);
        printf("\t");
        printf("%s ", &tmp->nazwisko);
        printf("\n\n");
        tmp = tmp->nast;}
        printf("\n\n");}

1

Zdecydowanie źle dodajesz kolejne elementy. Dlaczego podmieniasz wartości w pierwszym?

Trochę innych błędów... co to jest u Ciebie string? Jeżeli to jest std::string, a nie typedef na jakąś tablicę charów to po co te wszystkie wskaźniki?
Skoro piszesz w C++ to korzystaj z tego co to C++ oferuje, czyli np. std::string.

0

Spoko, poprawiłem :) teraz inna sprawa - problem ze stringami, przy dodawaniu nowych elementów, jeżeli wprowadzę np. imię lub nazwisko dłuższe niż 3 znaki, rozsypują mi się całkowicie :/ macie pomysł dlaczego może się tak dziać?

Wprowadzenie danych z klawiatury:

case 1:
{
        printf("Podaj numer: ");
        scanf("%d", &wartosc);
        printf("\n");
        printf("Podaj imie: ");
        scanf("%s", &imie);
        printf("\n");
        printf("Podaj nazwisko: ");
        scanf("%s", &nazwisko);
        printf("\n");
        printf("Podaj klub: ");
        scanf("%s", &klub);
        printf("\n");
        printf("Podaj cene: ");
        scanf("%d", &cena);
        printf("\n");
        dodaj(wartosc, imie, nazwisko, klub, cena);
        printf("Element zostal dodany ! \n\n");
break;
} 

Deklaracja pól i funkcja dodająca element do listy:

 using namespace std;

struct element
{
int wartosc,cena;
string *imie;
string *nazwisko;
string *klub;

element *nast;
element *pop;
};
//-------------globalny wskaznik na pierwszy i ostatni element------------------
element *pierwszy = NULL;
element *ostatni = NULL;

//--------------------------------funkcje---------------------------------------
//---------------------------dodawanie zawodnika---------------------------------
void dodaj(int x, string *y, string *z, string *k, int c)
{
    if(pierwszy == NULL)
    {
    pierwszy = (element*)malloc(sizeof(element));
    pierwszy->wartosc = x; 
    pierwszy->imie = y; 
    pierwszy->nazwisko = z; 
    pierwszy->klub = k; 
    pierwszy->cena = c; 
    pierwszy->nast = NULL;
    pierwszy->pop = NULL;
    ostatni = pierwszy; 
    }
        else
        {
        element *e = (element*)malloc(sizeof(element));
        e->wartosc=x;
        e->imie=y;
        e->nazwisko=z;
        e->klub=k;
        e->cena=c;
        ostatni->nast=e;
        e->pop=ostatni;
        e->nast=NULL;
        ostatni=e;
        }
}
0

Jeśli już piszesz w c++, to do I/O używaj strumieni cin/cout. scanf nie wczyta Ci nic do stringa, bo obiekt z c++ nie ma jak być obsługiwany przez funkcję z biblioteki standardowej c.
Wszystkie stringi jakie robisz w kodzie nie powinny być wskaźnikami, bo tylko komplikujesz sobie sprawę. Ponadto zamiast:
pierwszy = (element*)malloc(sizeof(element));
wypada dać
pierwszy = new element;

0

Ba, nie tylko scanf, ale i printf jest tu całkiem źle użyty. Korzystaj albo ze strumieni cin i cout, a jak nie chcesz to używaj c-stringów, a nie std::string, bo to co teraz robisz to gwałt na obiektach ;p

0
byku_guzio napisał(a):

Ba, nie tylko scanf, ale i printf jest tu całkiem źle użyty. Korzystaj albo ze strumieni cin i cout, a jak nie chcesz to używaj c-stringów, a nie std::string, bo to co teraz robisz to gwałt na obiektach ;p

Prawdę mówiąc do tej pory nie programowałem nic w C ani w C++, stąd moje rażące błędy. Robię tą listę dla brata i chcę żeby tylko działało i mam spokój :D nie dbam o poprawność , mimo iż to nieładnie :)

0
#define SCANFFMT(a,b,c) #a#b#c
#define SCANFSTR(size) SCANFFMT(%,size,s)
...
#define IMIESIZE 64
...

   char imie[IMIESIZE+1];
...
   scanf(SCANFSTR(IMIESIZE),imie); // SCANFSTR(IMIESIZE) magicznie zamieni się na "%64s"

Masz w tym straszną niekonsekwencję, wprowadzasz scanf'em - C, używasz string - C++
Te dwie koncepcje niezbyt do siebie pasują.

0

Próbuję użyć stringów i odszedłem od wskaźników, ale może wiecie czemu teraz się program wykrzacza? wywala się w zaznaczonej linijce:

Wczytywanie:

case 1:
{
        int wartosc,cena;
        string imie;
        string nazwisko;
        string klub;
    
        printf("Podaj numer: ");
        cin >> wartosc;
        printf("\n");
        printf("Podaj imie: ");
        cin >> imie;
        printf("\n");
        printf("Podaj nazwisko: ");
        cin >> nazwisko;
        printf("\n");
        printf("Podaj klub: ");
        cin >> klub;
        printf("\n");
        printf("Podaj cene: ");
        cin >> cena;
        printf("\n");
        dodaj(wartosc, imie, nazwisko, klub, cena);
        printf("Element zostal dodany ! \n\n");
break;
} 

Dodawanie:

 
using namespace std;

struct element
{
int wartosc,cena;
string imie;
string nazwisko;
string klub;

element *nast;
element *pop;
};
//-------------globalny wskaznik na pierwszy i ostatni element------------------
element *pierwszy = NULL;
element *ostatni = NULL;

//--------------------------------funkcje---------------------------------------
//---------------------------dodawanie zawodnika---------------------------------
void dodaj(int x, string y, string z, string k, int c)
{
    if(pierwszy == NULL)
    {
    pierwszy = (element*)malloc(sizeof(element));
    pierwszy->wartosc = x; 
    pierwszy->imie = y; //tu sie wywala
    pierwszy->nazwisko = z; 
    pierwszy->klub = k; 
    pierwszy->cena = c; 
    pierwszy->nast = NULL;
    pierwszy->pop = NULL;
    ostatni = pierwszy; 
    }
        else
        {
        element *e = (element*)malloc(sizeof(element));
        e->wartosc=x;
        e->imie=y;
        e->nazwisko=z;
        e->klub=k;
        e->cena=c;
        ostatni->nast=e;
        e->pop=ostatni;
        e->nast=NULL;
        ostatni=e;
        }
}
0
struct element
  {
   int wartosc,cena;
   string imie,nazwisko,klub;
   element *nast,*pop;
  };

struct lista
  {
   element *pierwszy,*ostatni;
  };

 
void dodaj(lista &L,int x, string y, string z, string k, int c)
  {
   element *tmp=new element;
   tmp->wartosc=x; 
   tmp->imie=y;
   tmp->nazwisko=z; 
   tmp->klub=k; 
   tmp->cena=c; 
   tmp->nast=0;
   tmp->pop=L.ostatni;
   L.ostatni=(L.ostatni?L.ostatni->nast:L.pierwszy)=tmp;
  }

int main()
  {
   lista L={0,0};
   
   //dodaj(&L,...

Zastanów się nad użyciem konstruktorów i metod, przecież piszesz w C++

0
_13th_Dragon napisał(a):

Zastanów się nad użyciem konstruktorów i metod, przecież piszesz w C++

Tak, wiem, ale jak pisałem wcześniej, kompletnie nie znam języka, nigdy nie miałem z nim do czynienia, a nie mam już ochoty się dzisiaj z tym męczyć i przerabiać program na bardziej obiektowy, dlatego jeśli macie pomysł co jest źle w kodzie, który wyżej napisałem to byłbym bardzo wdzięczny za odpowiedź...

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