الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج بالاشجار (Tree) ...<< مشكله مو عارفه حلها

مغلق
بدأه jorey في 13 مايو 2006 · 20 رد · 1,429 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كتبت برنامج بسي ++

بالاشجار tree

وطلع اوكيه ما فيه اخطأ او اي شي

بس ما يتطبق بالشاشه السوداء يقولي (الويندوز واجهه مشكله وخطأ) ومو عارفه ايش المشكله ..

وهذا البرنامج:

#include<iostream.h>
struct B_S_Tree_node
{
int data;
B_S_Tree_node *left;
B_S_Tree_node *right;
};
B_S_Tree_node *t;

//--------------------------------

void create ()
{
 t=NULL;
}

//------------------------------

void insert(int element ,B_S_Tree_node *t)
{
if(t!=NULL) 
{
  if(t->data==element)
  cout<<"The element is not inserted,There is befor ano Ther";
  else
  { if (t->data<element)
	 insert(element,t->right);
	else
	 insert(element,t->left);
  }
}
else 
{t=new B_S_Tree_node;
  t->data=element;
  t->left=NULL;
  t->right=NULL;
}
}

//-----------------------------

int find_min(B_S_Tree_node *t)
{
if(t==NULL)
cout<<"Tree is empty";
else
 while(t->left !=NULL)
t=t->left;
   return t->data;

}

//--------------------------------

B_S_Tree_node *find_element(int data,B_S_Tree_node *t)

{ if(t!=NULL)
  { if (t->data==data)
	return t;
	else
	{if(t->data<data)
	 return find_element(data,t->right);
	 else
	 return find_element(data,t->left);
	}
}
   return NULL;
  }


//---------------------------------------

void remove (int data,B_S_Tree_node *t)
{
if(t==NULL)
cout<<"the tree is empty";

else if(data<t->data)
   remove(data,t->left);

else if(data>t->data)
   remove(data,t->right);

else
{
	if((t->left!=NULL)&&(t->right!=NULL))
	{
		t->data=find_min(t->right);
		remove(data,t->right);
	}
	else
	{
		B_S_Tree_node *temp=t;
		t=(t->left)?t->left:t->right;
		delete temp;
	}

}	 



}

//-----------------------------------
void print_postorder(B_S_Tree_node*t)

{if(t!=NULL)
  {cout<<"(";
   print_postorder(t->left);
   print_postorder(t->right);
   cout<<t->data;
   cout<<")";
   }
}






void main()
{int n,m;
//B_S_Tree_node *y,*r;
	create();
	for(int i=1;i<=n;i++)	
{cin>>n;

	cout<<"enter element";
cin>>m;

insert(m,t);
}


cout<<"\n minimumm element";

	find_min(t);

	cout<<"enter remove";

	remove(m,t);

	cout<<"the tree is";

	print_postorder(t);

}

بلييييزززززز ساعدوني امتحاني عليه بكرا .. وللحين مو عارفه ايش المشكله :wacko:

لا تبخلون علي بمساعدتكم

جوري

تم تعديل هذه المشاركة بواسطة jorey في 14 مايو 2006 في 00:10

#2
void main()
{int n,m;
//B_S_Tree_node *y,*r;
	create();
	for(int i=1;i<=n;i++)	
{cin>>n;

إنتى إستخدمتى ال n من غير ما تحطى فيها أى قيمة. هو دا اللى بيطلع الخطأ.

#3

أخوي بلوتوث

عدلتها بس مازالت المشكله موجوده..يطلع لي(لقد واجهه الويندوز مشكله يجب اغلاق البرنامج )

مشكور لمساعدتك

يعطيك العافيه

#4

سلام :D

قرأت الكود بسرعة بس اتوقع لأنك المتغير t استخدمتيه في الmain من غير ما تاخدي object من الstruct يعني ما بسير تستخدميه هيك

لأنه بهي الحالة لا يرجع قيمة يصبح المؤشر null

مشان هيك

اعملي

B_S_Tree_node r

r.t

و استخدميها في ال main

white-soul

;)

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#5

يبقى أكيد الغلط إنك مش بتبدئى ال pointers فى ال struct إلى NULL. و الحل إنك تعملى Constructor فى ال struct بيبدأ ال 2 pointers إلى NULL

 B_S_Tree_node(): left(NULL),right(NULL) {}
#6

بس ما يتطبق بالشاشه السوداء يقولي (الويندوز واجهه مشكله وخطأ) ومو عارفه ايش المشكله ..

your program has infint loop at funtion :

void insert(int element ,B_S_Tree_node *t)
{
if(t!=NULL) 
{
  if(t->data==element)



 ;  cout<<"The element is not inserted,There is befor ano Ther

return;
// try to write return;	after your cout


 :)

JiFvydhdnG.gif

There are two ways to live: you can live as if nothing is a miracle;

you can live as if everything is a miracle

#7

You have used recursion in the wrong direction in the function Insert

void insert(int element ,B_S_Tree_node *t)

{

if(t!=NULL)

{

if(t->data==element)

cout<<"The element is not inserted,There is befor ano Ther";

else

{ if (t->data<element)

insert(element,t->right);

else

insert(element,t->left);

}

}

else

{

t=new B_S_Tree_node;

t->data=element;

t->left=NULL;

t->right=NULL;

}

}

أنا مش قادر أتصور إزاي قدرتي تستعملي الداله insertمن غير ما تحددي للداله إزاي تعمل insert سواء من اليمين أو من الشمال

كل إللي إتحدد الشروط لكن الطريقه إللي هتتنفذبيها العمليه ما إتحددتش خالص

#8

السلام عليكم..

أختي المشكله ليست بالكود.. المشكله يمكن بالبرنامج اللي تستخدميه ما مرخص.. حاولي تسوينه على برنامج آخر..

استخدمي فجوال سي ++..

ولو تسوينه على كلاس يكون احسن من ستركجر.. او تدمجين الكلاس والستركجر..

#9
اقتباس
your program has infint loop at funtion :

void insert(int element ,B_S_Tree_node *t)
{
if(t!=NULL)
{
  if(t->data==element)



;  cout<<"The element is not inserted,There is befor ano Ther

return;
// try to write return;	after your cout

:)

لو تقصد infinite recursion لأ يا أخى لأن لو ال if دى إتنفذت مش حينفذ حاجة تانية و حيخرج.

اقتباس
أنا مش قادر أتصور إزاي قدرتي تستعملي الداله insertمن غير ما تحددي للداله إزاي تعمل insert سواء من اليمين أو من الشمال

كل إللي إتحدد الشروط لكن الطريقه إللي هتتنفذبيها العمليه ما إتحددتش خالص

أمال دا إيه يا أخى :) >>

else
{
t=new B_S_Tree_node;
t->data=element;
t->left=NULL;
t->right=NULL;
#10

مساء الفل

ده باذن الله الكود شغال و10 علي 10

محتاج منك شويه تظبيطات في اللوجيك والطباعه

ربنا يوفقك

بالنسبه للاخ الكريم الي نسب العيب للايديتور المستخدم الكلام ده مش مظبوط الخطا كان خطا كومبايلر

#include<iostream.h>

struct B_S_Tree_node

{

int data;

B_S_Tree_node *left;

B_S_Tree_node *right;

}*t;

void create()

{

t=NULL;

}

void insert(int element ,B_S_Tree_node *t)

{

if(t!=NULL)

{

if(t->data==element)

cout<<"The element is not inserted,There is befor another";

else

{

if (t->data<element)

insert(element,t->right);

else

insert(element,t->left);

}

}

else

{

t=new B_S_Tree_node;

t->data=element;

t->left=NULL;

t->right=NULL;

}

}

//-----------------------------

int find_min(B_S_Tree_node *t)

{

if(t==NULL)

cout<<"Tree is empty";

else

while(t->left !=NULL)

{

t=t->left;

return t->data;

}

}

//--------------------------------

B_S_Tree_node *find_element(int data,B_S_Tree_node *t)

{

if(t!=NULL)

{

if (t->data==data)

return t;

else

{

if(t->data<data)

return find_element(data,t->right);

else

return find_element(data,t->left);

}

}

return NULL;

}

void remove (int data,B_S_Tree_node *t)

{

if(t==NULL)

cout<<"the tree is empty";

else if(data<t->data)

remove(data,t->left);

else if(data>t->data)

remove(data,t->right);

else

{

if((t->left!=NULL)&&(t->right!=NULL))

{

t->data=find_min(t->right);

remove(data,t->right);

}

else

{

B_S_Tree_node *temp=t;

t=(t->left)?t->left:t->right;

delete temp;

}

}

}

void print_postorder(B_S_Tree_node*t)

{

if(t!=NULL)

{

cout<<"(";

print_postorder(t->left);

print_postorder(t->right);

cout<<t->data;

cout<<")";

}

}

void main()

{

int n,m;

//B_S_Tree_node *y,*r;

create();

cin>>n;

for(int i=1;i<=n;i++)

{

cout<<"enter element";

cin>>m;

insert(m,t);

}

cout<<"\n minimumm element";

find_min(t);

cout<<"enter remove";

remove(m,t);

cout<<"the tree is";

print_postorder(t);

}

test.cpp

#11

مشكورين على مساعدتكم

بالنسبه للانسرت صح..

ولازم اقدم هالبرنامج بالسي ++

ومازالت المشكله موجوده ..

اتوقع بالmain فيه شي خطأ

انتظر ارائكم

#12

ممكن تقول المشكلة دى بتتطعلك إمتى بالظبط ؟ لما بتعمل إيه يعنى ؟

#13

مبرمج مجدي الحسيني الشرقاوي

مشكوووووور طبقت البرنامج بعد تعديلك طلع اوكي راحت مشكلة الويندوز

بس ما طبق لي دالة البحث عن اصغر عنصر (find_min) ولا دالة الحذف(remove)

:s

#14

هاهاهها

ماشالله كل دي الردود عشان برنامج بسيط

المشكله هي ان هناك infint recursion

عشان كدا الخطاء بيكون بالشاشه السودا

انا كاتب الكود دا قبل سنه وكان شغال ميه بالميه

وكانت المشكله الوحيده الي واجهتني هي بالركيرجن بلوون ال delete value from binary search tree

Blueteeth

ازاي حيطلع البرنامج وهو اصلا ماتبش ريتين " انا لمن اشتغل بالسي لازم احط رتيرن "

انا اتصح الاخ كاتب الربنامج انه يعمل debug

عشان يكتشف الخطأ الفعلي و انصحه ايضا باستخدام البرنامج

dev c++

JiFvydhdnG.gif

There are two ways to live: you can live as if nothing is a miracle;

you can live as if everything is a miracle

#15
اقتباس
Blueteeth

ازاي حيطلع البرنامج وهو اصلا ماتبش ريتين " انا لمن اشتغل بالسي لازم احط رتيرن "

شوف كد البرنامج دا حيطلع ولا لأ

#include <iostream>
void x(int c)
{
if (c == 1)
std::cout << c << std::endl;
else
{
std::cout << c << std::endl;
x(--c);
}
}

void main()
{
x(4);
}

أهو مفيهوش أى ريترن خالص :).

تم تعديل هذه المشاركة بواسطة Blueteeth في 15 مايو 2006 في 14:16

#16

بالنسبه للكود كلكم عملتم قيمة ال N ومفيش واحد يوحد الله حاول يجرب البرنامج إللي

إشتغل على أكتر من قيمه أوقيمتين للN لكن كلكم إكتفيتم بإن البرنامج يطلعOutput ومفيش واحد دور ع الأخطاء المنطقيه في الكود

أرجو من الجميع أن ينتبهوا لمثل هذه الأخطاء

#17

البرنامج الى الان ما ضبط

ما يطبق الا دالة الادخال واشك فيها كمان ...

اتوقع الt معلقه على null

فما يطبق لي دالة الحذف ولا دالة الطباعه او دالة البحث يعطيني انه empty يعني t=NULL

الله يعافيكم ايش الغلط في برنامجي ..تعبت وانا اعدل فيه ومو عارفه ايش الغلط

#include<iostream.h>
struct B_S_Tree_node
{
	int data;
	B_S_Tree_node *left;
	B_S_Tree_node *right;
}

*t;
void create()
{	
	t=NULL;
}
//-----------------------

void insert(int element ,B_S_Tree_node *t)
{
if(t!=NULL) 
{
if(t->data==element)
cout<<"The element is not inserted,There is befor ano Ther";
else
{ if (t->data<element)
insert(element,t->right);
else
insert(element,t->left);
}
}
else 
{
t=new B_S_Tree_node;
t->data=element;
t->left=NULL;
t->right=NULL;
}
}
//------------------------
int find_min(B_S_Tree_node *t)
{
	if(t==NULL)
		cout<<"Tree is empty";
	else
		while(t->left!=NULL)
			t=t->left;
			return t->data;

}

//--------------------------------

B_S_Tree_node *find_element(int data,B_S_Tree_node *t)

{ 
	if(t!=NULL)
	{ 
		if (t->data==data)
			return t;
		else
		{
			if(t->data<data)
				return find_element(data,t->right);
			else
				return find_element(data,t->left);
		}
	}
   return NULL;
}
//--------------------------------

void remove (int data,B_S_Tree_node *t)
{
	if(t==NULL)
		cout<<"the tree is empty";
	else 
		if(data<t->data)
		remove(data,t->left);
	else 
		if(data>t->data)
		remove(data,t->right);
	else
	{
		if((t->left!=NULL)&&(t->right!=NULL))
		{
			t->data=find_min(t->right);
			remove(data,t->right);
		}
		else
		{
			B_S_Tree_node *temp=t;
			t=(t->left)?t->left:t->right;
			delete temp;
		}

	}	  
}

//------------------------------

void print_postorder(B_S_Tree_node*t)
{
	if(t!=NULL)
	{
		cout<<"(";
		print_postorder(t->left);
		print_postorder(t->right);
		cout<<t->data;
		cout<<")";
	}
}

//----------------------
void main()
{
	int n,m;
  create();
	cin>>n;
	for(int i=1;i<=n;i++)	
	{
		cout<<"enter element";
		cin>>m;
		insert(m,t);
	}
	cin>>m;
	find_element(m,t);
	cout<<"enter remove\n";
	remove(m,t);
	cout<<"the tree is";
	print_postorder(t);
}

ياليت تصححون لي البرنامج

امتحاني بكرا ولا طلعت بنتيجه الى الان

اختكم جوري

#18

خلاص جربت البرنامج و عرفت الخطأ الحمد لله. الخطأ أنك تمررى ال pointers إلى الدوال insert و remove بالقيمة by value و لكنك تعدلين قيمة ال pointer نفسه و لذلك يجب أن تمرريه by reference, مثل ذلك>>

void remove (int data,B_S_Tree_node*& t)
void insert(int element ,B_S_Tree_node*& t)
#19

Blueteeth

ألف شكر لك ..يعطيك العافيه

البرنامج ضبط معاي الحمدالله.. الا دالة البحث ما جربتها الى الان

يسلموووووووووووو يارب

Blueteeth

ألف شكر لك ..يعطيك العافيه

البرنامج ضبط معاي الحمدالله.. الا دالة البحث ما جربتها الى الان

يسلموووووووووووو يارب

#20

شفت يا اخ Blueteeth

الخطا ان هناك انفينيت ركيرجن لانه مش حيساوي null ابدا فحيكمل

انا بفضل لغه السي عالسي بلس بلس ومليش بالبوينتر بالسي عشان كدا ما شفتش الغلط دا :)

JiFvydhdnG.gif

There are two ways to live: you can live as if nothing is a miracle;

you can live as if everything is a miracle

#21

لأ برضه المشكلة مش إينفنت ريكرجن يا أخ تيمى :)

المشكله كانت إنه بيدخل على عنوان مش موجود أو برة ال address space بتاع البرنامج. لأن تغيير قيمة ال pointer مش حتبقى مرئية برة الدالة.

لكن كا ريكرجن مفيهوش أى خطأ و عمره ما حيعمل إينفنت.

هذا الموضوع مغلق.

مواضيع مشابهة