• 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

VPS Starter Arubacloud
0 głosów
226 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 (195,220 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 (195,220 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 (195,220 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ź 381 wizyt
pytanie zadane 4 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)
0 głosów
1 odpowiedź 491 wizyt
pytanie zadane 18 czerwca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 141 wizyt
pytanie zadane 27 września 2018 w C i C++ przez KaRoLiNakk Nowicjusz (160 p.)

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,309 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...