Nie działa zamiana wskaźnika z NULL

0
// BST.cpp : Defines the entry point for the console application.
//

#include <iostream>
using namespace std;

struct lista
{
	lista(int V)
	{
		value=V;
		L=R=0;
	}

	int value;
	lista* L;
	lista* R;
};

void add(lista* start, int val)
{
	if(start==NULL)
	{
		start = new lista(val);
		return;
	}

	lista* work = start;
	while(true)
	{
 		if(val > work->value)
		{
			if(work->R == NULL)
			{
				work->R = new lista(val);
				return;
			}
			else 
				work = work->R;
		}
		else
		{
			if(work->L == NULL)
			{
				work->L = new lista(val);
				return;
			}
			else 
				work = work->L;
		}

	}
}

void print(lista* start)
{
	if(start == NULL)
		return;

	print(start->L);
	
	cout<<start->value<<endl;

	print(start->R);
}

int main()
{
	lista* st = NULL;
	add(st,10);
	add(st,5);
	add(st,8);
	add(st,15);
	add(st,11);
	add(st,3);

	print(st);

	system("pause");
	return 0;
}

Jest to drzewo sortowania binarnego. Dlaczego nie działa dodawanie elementów, jeżeli wskaźnik na początku jest NULL, a poźniej jest on zastąpiony przez new lista(val)?

Pozdrawiam:)

0

Bo nie możesz modyfikować zmiennych w funkcji. Równie dobrze zamiast tego wskaźnika mógłbyś tam dać int i wyszłoby na to samo. Możesz natomiast zmodyfikować to, co jest pod wskaźnikiem. W C musiałbyś przekazać wskaźnik do wskaźnika i dodać dodatkową dereferencję w funkcji, w C++ można użyć referencję. Argument możesz zapisać tak: lista*& start.

0

Możesz zwracać wskaźnik:

lista* add(lista* start, int val)

W ciele funkcji

return start;

lub

return work;

Chociaż dzięki temu

 lista* work = start;

i tak na jedno wychodzi.

Natomiast w main

st = add(st,10);
0

ok. załapałem :) Dzięki wielki:)

0

Nie używaj zera do wskaźników:

 L=R=0;

To działa, ale od tego się odchodzi.

Zamiast tego możesz napisać:

 
// Po staremu
L = R = NULL;

lub

 
// Nowy standard C++0x
L = R = nullptr;

Tu trochę więcej na ten temat:
http://bit.ly/pdzx1r

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