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

tree

مغلق
بدأه مبرمجة new في 18 مارس 2007 · 4 رد · 610 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

برنامجي هو الأضافة الي الشجرة بحيث استخدم الاستعادة الذاتية حاولت فيه توجد فيه مشكلة انه يضيف اول مرة ثم يتوقف البرنامج

رجاء مساعدتي في حل الخطا

وشكرا

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
struct info
{char name[20];
int no;
};
struct data
{ info d;
data *left,*right;
};
class list_dam
{private:
data *node,*Root;
int flag,flag2;
public:
	list_dam(){flag=1;Root=NULL;};
	void Show_tree(data *);
	void search();
	friend data * XXXX(list_dam); 
	void Add(data *);
	void sss(data *,data *);
};

data * XXXX(list_dam t);

void main()
{int i;
list_dam A;
cout<<endl;
cout<<"***********************************welcome**************************************\n";
cout<<endl;
do
{
cout<<"|------------------main menu---------------|"<<endl;
cout<<"|press 1 to Add node to tree			   |"<<endl;
cout<<"|press 2 to search in  node from tree	  |"<<endl; 
cout<<"|press 3 to show the tree				  |"<<endl;
cout<<"|press 4 to exit						   |"<<endl;
cout<<"|now please chose						  |"<<endl;
cout<<"|------------------------------------------|"<<endl;
cin>>i;
switch(i)
{
case 1:
	{A.Add(XXXX(A));
	break;}
case 2:
	{
	A.search();
		break;}
case 3:
	{A.Show_tree(XXXX(A));
	break;}

case 4:
	cout<<"now you will exit form program\n";
}}while(i!=4);
}



/* function for show tree*/
void list_dam:: Show_tree(data *t )
{
	if(t!=NULL)
	{
		//cout<<t->d.name<<"\t"<<t->d.no<<endl;;
		Show_tree(t->left);
		//cout<<t->d.name<<"\t"<<t->d.no<<endl;
		Show_tree(t->right);
		cout<<t->d.name<<"\t"<<t->d.no<<endl;
	}

}


data * XXXX(list_dam t)
{
	return t.Root;
}

/* function for search  in tree*/
void  list_dam::search()
{data *search;
	int no,f=0;
	cout<<"Please enter your number for search"<<endl;
  cin>>no;
  cout<<endl;
search=Root;
while(search!=NULL)
{if(no==search->d.no)
{f=1;
break;}
else
if(no>(search->d.no))
search=search->right;
else
search=search->left;}
if(flag==0)
cout<<"Sorry no data"<<endl;
else 
cout<<"found it"<<endl;
}



/*function for add to tree*/
void list_dam::Add (data *a)
{data *node;
	node=new data;
	 gets(node->d.name);
	  cin>>node->d.no;
	   node->left=node->right =NULL;
	if(a==NULL)
	{
		Root=node;
		Root->left=Root->right =NULL;
	}
	else 
	while(a!=NULL)
	{sss( a,node);

	}
}

void list_dam::sss(data *a,data *node)
{
if(a->d.no<node->d.no)
{if(a->right==NULL)
{a->right=node;
}
else
a=a->right;}
else
{if(a->left==NULL)
{a->left=node;
}
else
a=a->left;
}}
#2

المشكلة التي تواجهك هو دخولها في infinite loop

و السبب نسخ pointer فأنت كما تعلم بأنه عند إرسالك ل a في function sss يقوم الكومبيوتر بنسخ pointer a

while(a!=NULL){
			sss( a,node);
}

أي pass by value لل Pointer و لهذا السبب عند عمل هذا الكود

a=a->right;

فإنك تقوم بتغيير ما بداخل pointer a النسخة و ليست الأصلية التي أرسلتها و الحل بإرسالها عن طريق pass by reference

كي تتغير a الأصلية التي أرسلتها

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#3

شكرا أخي على تعاونك بس ياريت توضح أكثر

#4

عند إرسالك لأي شئ ل function فهو يرسل pass by value أي ترسل نسخة من الشئ المرسل

فأنت تقوم بإرسال a و عند حدوث هذا فإنك تقوم بإرسال نسخة من a تؤشر على ذات node أو tree

لذا عندما كتبت في function ssss و التي تأخذ Pointer a و التي هي في الحقيقة نسخة من a التي أرسلتها

a=a->right

فإن a التي تغيرت هي النسخة التي أرسلت إلى function أما a الأصلية التي أرسلت نسخة منها إلى ssss

لم تتغير

و إن لم تتوضح الصورة أخبرني

تم تعديل هذه المشاركة بواسطة Final Heaven في 19 مارس 2007 في 17:29

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#5

كنت سأضع التعديل بإستخدام pass by reference و لكني وجدت هذا أسهل لك:

/*function for add to tree*/
void list_dam::Add (data *a){
	data *node;
	node=new data;
	gets(node->d.name);
	cin>>node->d.no;
	node->left=node->right =NULL;
	if(a==NULL){
		Root=node;
		Root->left=Root->right =NULL;
	}
	else{
		sss( a,node);
	}
}

void list_dam::sss(data *a,data *node){
	while(a!=NULL){
		if(a->d.no < node->d.no){
			if(a->right==NULL){
				a->right=node;
				break;
			}
			else{
				a=a->right;
			}
		}
		else{
			if(a->left==NULL){
				a->left=node;
				break;
			}
			else{
				a=a->left;
			}
		}
	}
}

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

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

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