sposób odczytu pamieci alokowanej dynamicznie

0
#include <cstdlib>
#include <iostream>

using namespace std;
bool jak=0;
int znajdzi;
struct node {
       int key;
       node *left, *right, *top;
};

void dodaj_wezel(int z, node *n){
    node *x=new node;
    x->left=x->right=NULL;
    x->key=z;

while(1){
    if(z<n->key){
     if(n->left==NULL){
                      n->left=x;
                      break;
     }
     else
     n=n->left;
    }
    else{
         if(n->right==NULL){
             n->right=x;
             break;
         }
         else
         n=n->right;
   }
}
};

bool maxy(node *n)
{
    bool j=0;
if(n!=NULL||(n->key)>znajdzi){
j=maxy(n->right);
if(j==1&&jak==0){
cout<<n->key<<endl;
jak=1;
}
}
else return 1;
}

int main(){
    node *n=new node;
    n->left=n->right=n->top=NULL;
    n->key=0;

 int p,m;
 cin>>p>>znajdzi;
 for(int x=0;x<p;x++){
 cin>>m;
 dodaj_wezel(m,n);
 }
    maxy(n);
}

 

oto mój kod wczytuje on liczby i zapisuje je w formie drzewa i z tym nie ma najmniejszego problemu problem pojawia się gdy chce pobrać wartość jakiegoś węzła tzn zapisać a nie tylko wyświetlić

 
bool maxy(node *n)
{
    bool j=0;
if(n!=NULL||(n->key)>znajdzi){
j=maxy(n->right);
if(j==1&&jak==0){
cout<<n->key<<endl;
jak=1;
}
}
else return 1;
}

czemu gdy wyświetlam n->key za pomaca cout wszystko jest ok a gdy chce to zapisać np. int d=n->key wyskakuje błąd wiem że powinienem to znaleźć w google poszukać czegoś o dynamicznym alokowaniu pamięci i o strukturach ale naprawdę uwierzcie mi próbowałem
i jeszcze jedno w strukturze jest to *top niby nigdzie w programie nie używane a jak wykasuje to jest błąd

0

Taa, szukałeś... Nie chce mi się analizować całego postu, ale daj:
int d=*(n->key)

int d=n->key - jeśli n jest wskaźnikiem to próbujesz intowi przypisać adres. Za pomocą "*" "wyciągasz" wartość ze wskaźnika.

Pewnie ktoś mnie zaraz z czymś poprawi, nie znam się na teorii... ;]

0

Jaki błąd? a to top jest w kodzie wykorzystywane

0

byku_guzio w czasie kompilacji nie ma błędu ale gdy podczas działania dochodzi do tego momentu wyskakuje błąd pamięci
Szuwar_Jr
nt d=*(n->key);
nie działa
error: invalid type argument of ‘unary *’|
i tak szukałem! przede wszystkim key jest zwykłym int wiec nie wiem dlaczego w ogóle nie działa np int d=n.key

0

Nie chciało mi się przeglądać dokładniej tego kodu, bo jest tragicznie sformatowany, ale tak na pierwszy rzut oka to może dlatego, że jak n będzie null w tej funkcji to wykona się n->key>znajdzi. Konkretnie o ten if chodzi

if(n!=NULL||(n->key)>znajdzi)
0

"czemu gdy wyświetlam n->key za pomaca cout wszystko jest ok a gdy chce to zapisać np. int d=n->key wyskakuje błąd"

Piszesz te dwie instrukcje w jednym miejscu i wyskakuje błąd?

Ja obstawiam błąd logiczny w programie...

"bool maxy(node *n)
{
bool j=0;
if(n!=NULL||(n->key)>znajdzi){
j=maxy(n->right);
if(j==1&&jak==0){
cout<<n->key<<endl;
jak=1;
}
}
else return 1;
}"

Nie brakuje tu jakiegoś returna?!

0

nie doszukujcie się błędów w kodzie bo jest dobry a jak mi nie wierzycie

 
#include <iostream>
using namespace std;

struct node {
       int key;
};
int main(){
    node *n=new node;
    n->key=0;
    int l=*(n->key);
}

i tu w miejscu int l=*(n->key); też pojawia się błąd error: invalid type argument of ‘unary *’|

0

int l=*(n->key);

No, bo to jest niepoprawnie, nie możesz tak dać... Byłem w błędzie, czytaj komentarze... ;]

0

tu autor ma kod w którym pisze int k=n->key; i wszystko działa
http://edu.i-lo.tarnow.pl/inf/utils/002_roz/mp001.php

0

To na pewno nie jest poprawne

if(n!=NULL||(n->key)>znajdzi)

Jeżeli n będzie równe null to sprawdzi czy n->key jest większe od znajdzi.
Skoro kod jest wg. Ciebie dobry to o co pytasz? Kod jest dobry ale nie działa...

//edit1: puściłem przez debugger i wywala się dokładnie na tej linii
//edit2: po przyjrzeniu się funkcji maxy (co ona w sumie ma robić?)

bool maxy(node *n)
{
	bool j=0;
	if(n!=NULL||(n->key)>znajdzi){ //TU SIĘ WYWALA
		j=maxy(n->right);
		if(j==1&&jak==0){ //TO NIGDY NIE BĘDZIE SPEŁNIONE (bo niby kiedy jak j będzie równe 1 czy 0?)
			cout<<n->key<<endl;
			jak=1;
		}
	}
	else return 1;
}
0

Ale już prosiłem żebyście się nie doszukiwali błędów, w wcześniejszym poście wkleiłem krotki prosty kod i on tez nie działa od początku pisze dokładnie o co mi chodzi a wy szukacie wszędzie gdzie nie trzeba i jeszcze dostaje za to bana :(

0

Bez kitu... nie mam siły... Przecież ta funkcja maxy, którą tu wrzuciłeś jest po prostu błędna, źle napisana, powodująca segfault'a. Nie rozumiesz? Jeżeli masz wskaźnik pokazujący na NULL i próbujesz nim dostać się do jakiegoś pola struktury, której tam nie ma to dostajesz error?
Nie wiem skąd wziąłeś tą funkcję maxy ale jest po prostu zła i się z tym pogódź...

BTW. sprawdzanie czy zmienna typu bool równa się jeden też nie jest najlepszym pomysłem. Fałsz to jest zawsze 0, ale prawda może być wszystkim oprócz 0.

Nadal nie powiedziałeś co ma robić ta funkcja maxy... zakładając, że ma znaleźć node z podanym w znajdzi kluczem to powinna wyglądać tak:

node* maxy(node *n)
{
	bool j=0;
	if(n!=NULL)
	{
		if((n->key) < znajdzi)
		{
			return maxy(n->right);			
		}
		else if(n->key > znajdzi)
		{
			return maxy(n->left);
		}
		
		if(n->key == znajdzi)
		{
			cout<<n->key<<endl;
                        int d = n->key; //jakoś nie widzę, żeby to nie działało...
			return n;
		}
	}
	else
	{
		return NULL;
	}
}

Jak napiszesz konkretnie co ta funkcja ma robić to może w wolnej chwili (takiej jak ta) pomogę Ci ją napisać... tylko zrozum gdyby w kodzie było wszystko ok to by działało, ale skoro przyszedłeś na forum, bo coś Ci nie działa tzn., że w kodzie jest błąd. Nie ma innej możliwości(przynajmniej przy tak prostych programach).

1
bool maxy(node *n)
{
    bool j=0;
if(n!=NULL&&(n->key)>znajdzi){
j=maxy(n->right);
if(j==1&&jak==0){
cout<<n->key<<endl;
jak=1;
}
return 0;
}
else return 1;
}
 
int main(){
    node *n=new node;
    n->left=n->right=n->top=NULL;
    n->key=0;
 
 int p,m;
 cin>>p>>znajdzi;
 for(int x=0;x<p;x++){
 cin>>m;
 dodaj_wezel(m,n);
 }
    maxy(n);
}
 

teraz już jest poprawnie praktycznie wystarczyło zmienić || na && a funkcja ma znajdować największą liczbę w przedziale
i tak na początku wczytujemy p - liczba liczb potem znajdzi liczba określająca przedział zakładam ze przedział zawsze zaczyna się od 0 i potem wczytuje m i dodaje ja do drzewa potem maxy ma znaleźć przedział i tu pojawia się problem bo funkcja cały czas idzie w prawo a dla danych np znajdzi=7 i liczb 3 5 8 9 6
idzie tak 3 -prawo 5-prawo 8 jest wieksze koniec a powinien isc jeszcze wtedy w lewo i wziąć 6

0

No nareszcie napisane ocb ;) Skoro robisz tu rekurencyjnie to może to wyglądać tak (z góry zaznaczam, że kod nie jest porządnie przetestowany - ot tak dla 3 przypadków działa). Prawie na pewno można to napisać lepiej.

node* maxy(node *n, int znajdzi)
{
	node *tmp;
	if(n!=NULL)
	{
		if(n->key < znajdzi)
		{
			if(n->right == NULL)
			{
				return n;
			}
			else
			{
				tmp = maxy(n->right, znajdzi);
				if(tmp == NULL)
				{
					return n;
				}
				else
				{
					return tmp;
				}
			}
		}
		else if(n->key > znajdzi)
		{
			if(n->left == NULL)
			{
				return NULL;
			}
			else
			{
				tmp = maxy(n->left, znajdzi);
				if(tmp == NULL)
				{
					return n;
				}
				else
				{
					return tmp;
				}
			}
		}
		else
		{
			return n;
		}
	}
	else
	{
		return NULL;
	}
}
0

ok dzięki za pomoc teraz jakoś sobie poradzę

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