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

lista dwukierunkowa błąd w kodzie

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 26 maja 2018 w C i C++ przez Roman1212 Początkujący (460 p.)
edycja 26 maja 2018 przez Roman1212

Witam

Nie chce mi się skompilować lista i nie mogę znaleźć błędu.Jak by ktos pomógł będę wdzięczny.

#include <iostream>

using namespace std;
struct dane
    {
        int data;
        dane* next;
        dane* prev;

    };
    struct kurs
    {
    dane* head;
    dane* tail;
    int ilosc;

    };
void poczatek (kurs *r)
{
    int v=22;
    dane * p=new dane;

  p->data = v;
  p->prev = NULL;
  p->next = head;
  head  = p;
  ilosc++;
  if(p->next)
  {
      p->next->prev = p;
  }
  else
    tail = p;
}
void przed(kurs *r)
{
    int poz;
    int v=10;
    cout<<"Podaj pozycje:";
    cin>>poz;
    dane * p=new dane;

  if(poz == head)
  {
      poczatek(r);
  }
  else
  {
    p = new dane;
    p->data = v;
    p->next = poz;
    p->prev = poz->prev;
    ilosc++;
    poz->prev->next = p;
    poz->prev = p;
  }
}
void wyswietl(kurs *r)
{

  dane * p=new element;


  while(p)
  {
    cout << " " << p->data;
    p = p->next;
  }

}

int main()
{
   kurs*r=new kurs;
   r=NULL;

   int w;
  do
   {
       cout<<"1.Dodawanie elementu  na poczatek listy"<<endl;
        cout<<"2.Dodanie przed element "<<endl;
        cout<<3.Wyswietl liste"<<endl;
        cout<<"Wybor:";
        cin>>w;
        switch(w)
        {
        case 1:
            poczatek(r);
            break;
        case 2:
            przed(r);
            break;
        case 3:
            wyswietl(r);
            break;
        }

   }while(w !=10);
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 26 maja 2018 przez j23 Mędrzec (194,920 p.)
edycja 26 maja 2018 przez j23

Jak nie chce się skompilować, to podaj chociaż treść błędu.

kurs *r = new kurs;
r = NULL;

Po co to new, skoro w następnej linii zerujesz wskaźnik r?

 

Odwołujesz się w funkcjach do zmiennych head i tail, choć nigdzie nie są zdefiniowane (tzn. są, ale jako pola struktury Kurs). Hint: r->head i r->tail.

Co, według Ciebie, funkcja wyswietl ma wyświetlić?

komentarz 26 maja 2018 przez Roman1212 Początkujący (460 p.)
Treść błędu. A gdzie mam wstawić r->head i r->tail.

 

main.cpp|25|error: 'head' was not declared in this scope
main.cpp|27|error: 'ilosc' was not declared in this scope
main.cpp|33|error: 'tail' was not declared in this scope
main.cpp||In function 'void przed(kurs*)':
main.cpp|43|error: 'head' was not declared in this scope
Cmain.cpp|51|error: invalid conversion from 'int' to 'dane*' [-fpermissive]
main.cpp |52|error: base operand of '->' is not a pointer
main.cpp |53|error: 'ilosc' was not declared in this scope
main.cpp|54|error: base operand of '->' is not a pointer
main.cpp|55|error: base operand of '->' is not a pointer
komentarz 26 maja 2018 przez j23 Mędrzec (194,920 p.)

Wszędzie tam, gdzie kompilator wskazuje błędy odnoszące się do head i tail. Wysil się trochę.

komentarz 26 maja 2018 przez Roman1212 Początkujący (460 p.)
edycja 26 maja 2018 przez Roman1212

Poprawiłem ale nie wiem czy o to chodziło

#include <iostream>

using namespace std;
struct dane
    {
        int data;
        dane* next;
        dane* prev;

    };
    struct kurs
    {
    dane* head;
    dane* tail;
    int ilosc;

    };
void poczatek (kurs *r)
{
    int v=22;
    dane * p=new dane;
    dane *head;
    dane *ilosc;
    dane *tail;


  p->data = v;
  p->prev = NULL;
  p->next = head;
  head  = p;
  ilosc++;
  if(p->next)
  {
      p->next->prev = p;
  }
  else
    tail = p;
}
void przed(kurs *r)
{
    dane *tail;
      dane *head;
    dane *ilosc;
    int poz;
    int v=10;
    cout<<"Podaj pozycje:";
    cin>>poz;
    dane * p=new dane;

  if(poz == head)
  {
      poczatek(r);
  }
  else
  {
    p = new dane;
    p->data = v;
    p->next = poz;
    p->prev = poz->prev;
    ilosc++;
    poz->prev->next = p;
    poz->prev = p;
  }
}
void wyswietl(kurs *r)
{

  dane *p=new dane;


  while(p)
  {
    cout << " " << p->data;
    p = p->next;
  }

}

int main()
{
   kurs*r=new kurs;


   int w;
  do
   {
       cout<<"1.Dodawanie elementu  na poczatek listy"<<endl;
        cout<<"2.Dodanie przed element "<<endl;
        cout<<"3.Wyswietl liste"<<endl;
        cout<<"Wybor:";
        cin>>w;
        switch(w)
        {
        case 1:
            poczatek(r);
            break;
        case 2:
            przed(r);
            break;
        case 3:
            wyswietl(r);
            break;
        }

   }while(w !=10);
    return 0;
}

Teraz mi wyskakują takie błędy i kompletnie nie wiem gdzie jest błąd.

Jeżeli uruchomię program bez funkcji prze(r) to się kompiluje ale za kawałek wyskakuje błąd i program się wyłącza.


main.cpp|52|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]|
main.cpp|60|error: invalid conversion from 'int' to 'dane*' [-fpermissive]|
main.cpp|61|error: base operand of '->' is not a pointer|
main.cpp|63|error: base operand of '->' is not a pointer|
main.cpp|64|error: base operand of '->' is not a pointer|
 

 

 

komentarz 27 maja 2018 przez j23 Mędrzec (194,920 p.)
void poczatek (kurs *r)
{
	int v=22;
	dane * p = new dane;

	p->data = v;
	p->prev = NULL;
	p->next = r->head;
	r->head  = p;

	if(p->next)
	{
		p->next->prev = p;
	}
	else r->tail = p;

	++r->ilosc;
}

Resztę analogicznie popraw.

Podobne pytania

0 głosów
1 odpowiedź 336 wizyt
pytanie zadane 4 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)
0 głosów
1 odpowiedź 445 wizyt
pytanie zadane 18 czerwca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 137 wizyt
pytanie zadane 27 września 2018 w C i C++ przez KaRoLiNakk Nowicjusz (160 p.)

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 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!

...