Proste zadanie ze wskaźnikami

0

Witam. Od kilku dni męczę się z prostym zadankiem, które musze wykonać na poniedziałek. Niestety słabo ogarniam wskaźniki i się w nich gubię, a akurat te konkretne zadanie nie należy do zbyt prostych wg mnie. Prosiłbym o jakąkolwiek pomoc. Z góry dziękuję :)

Utwórz cztery zmienne typu wskaźnikowego o nazwach p1, p2, p3, p4, będące częścią struktury. Połącz je w cykl, tak aby pierwszy z wskaźników pokazywał strukturę z drugim, . . . , a ostatni strukturę z pierwszym. Następnie napisz i wywołaj funkcję rekurencyjną wyświetlającą wszystkie wskaźniki cyklu. Załóż, że funkcja przyjmie jako parametry dwie zmienne typu wskaźnikowego, z których pierwsza wskazuje na początek cyklu, a druga element cyklu.

0

Dział Praca + 100 złotych = zadanie OK

1

100 zł za kilkanaście linii kodu; dobre ;]

0

Skoro nie stać cię, to sam sobie napisz :P

0

Wskażniki typu strukturowego to znaczy wskażniki utworzone w struct? (klasa która domiemanie ma wszystko public)?

Cylu nie rozumiem :D

3

nieogarnięty pokaż co już zrobiłeś...Dokładnie określ jakiej pomocy oczekujesz... Jeśli to czekanie na gotowe rozwiązanie, wątke za chwilę trafi do kosza!

0

Stary, najpierw napisz poprawnie treść zadania, bo to co napisałeś jest bez sensu.

 
struct struktura {
    struct struktura *p1;
    struct struktura *p2;
    struct struktura *p3;
    struct struktura *p4;
};

int main(int argc, char* argv[]) {
    
    struktura str;
    
    str.p1=str.p2;
    str.p2=str.p3;
    str.p3=str.p4;
    str.p4=str.p1;
 
    return 0;
}

?

0

Mam identyczne zadanie . Ja zrozumiałem żeby zrobić to tak :

 #include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct Struktura{
	struct Struktura* next;
};
void wypisz(struct Struktura *src1,struct Struktura *src2){
while(src1!=src2){
	cout<<src1<<endl;
	src1=src1->next;
}
cout<<src1<<endl;
}
int main ( ) {
struct Struktura *p1,*p2,*p3,*p4;
p1 = (struct Struktura*) malloc(sizeof(struct Struktura));
p2 = (struct Struktura*) malloc(sizeof(struct Struktura));
p3 = (struct Struktura*) malloc(sizeof(struct Struktura));
p4 = (struct Struktura*) malloc(sizeof(struct Struktura));
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=p1;
cout<<p1<<endl;
cout<<p2<<endl;
cout<<p3<<endl;
wypisz(p1,p3);
return 0 ;
}

Tylko nie wiem czy to jest poprawne rozwiązanie ponieważ treść zadania jest jak dla mnie napisana niezrozumiale.
Prosiłbym kogoś o wypowiedzenie się czy to rozwiązanie będzie właściwe.
Pozdrawiam

0

Wywoływać w main musisz wypisz(p1,p1); lub wypisz(p2,p2); lub wypisz(p3,p3); lub wypisz(p4,p4);
Funkcja wg zadania ma być rekurencyjna.

0
 #include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct Struktura{
	struct Struktura* next;
};
void wypisz(struct Struktura *src1,struct Struktura *src2){
cout<<src1<<" przechodzi na "<<src1->next<<endl;
src1=src1->next;
if(src1!=src2){
wypisz(src1,src2);
}
}
int main ( ) {
struct Struktura *p1,*p2,*p3,*p4;
p1 = (struct Struktura*) malloc(sizeof(struct Struktura));
p2 = (struct Struktura*) malloc(sizeof(struct Struktura));
p3 = (struct Struktura*) malloc(sizeof(struct Struktura));
p4 = (struct Struktura*) malloc(sizeof(struct Struktura));
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=p1;
wypisz(p1,p1);
return 0 ;
}

Czy teraz jest ok ?

0

średnio ok. Ostatni wpis pokazuje bzdury. Pokazuje "p4 przechodzi na p4->next". A czym jest p4->next? No nie wiadomo czym... Przy tworzeniu obiektu wypadałoby wskaźnik next NULLować a w funkcji sprawdzać czy next nie jest nullowy (przy przypisaniu np)
skoro c++ to się powinno używać new (bo masz pewność, że utworzy obiekt [inaczej wyrzuci wyjątek])
struktura czy klasa to obojętne (chociaż sam preferuje klasy a do struktury tworzę np współrzędnych)

źle spojrzałem, jest ok (tzn działa to co było w zadaniu). Chociaż to nie jest w stylu c++ za bardzo ;)

0

A jak byloby to napisane bardzie w stylu c++?

0

W c++ masz dynamiczną alokację pamięci, która w Twoim zadaniu będzie wyglądać tak:
Struktura *p1 = new Struktura;
Oczywiście wywalasz pierwszą linię funkcji main z deklaracją wskaźników, bo robisz to w następnych liniach.

0
 #include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct Struktura{
	struct Struktura* next;
};
void wypisz(struct Struktura *src1,struct Struktura *src2){
cout<<src1<<" pokazuje strukture z "<<src1->next<<endl;
src1=src1->next;
if(src1!=src2){
wypisz(src1,src2);
}
}
int main ( ) {
Struktura* p1 = new Struktura;
Struktura* p2 = new Struktura;
Struktura* p3 = new Struktura;
Struktura* p4 = new Struktura;
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=p1;
wypisz(p1,p1);
return 0 ;
}

cos takiego ?

0

Jeżeli już chcesz doprowadzić do C++ to słowo kluczowe struct zostaw tylko w jednym miejscu (pierwsze wystąpienie). No i przydało by się zwolnić pamięć. Oraz przydałoby się jakieś formatowanie kodu.

0

Mógłbyś napisać coś wiecej o tym zwalnianiu pamięci kiedy to wykorzystać byłbym wdzięczny

0

zwalniasz kiedy przydzielony obszar przez new już nie jest potrzebny, zwalniasz przez delete.

0

Niestety nie mam pojecia gdzie moglbym tego tutaj uzyc

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