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

إضافة عنصر في Binery Search Tree

مغلقمُجاب
بدأه نادين01 في 14 ديسمبر 2013 · 8 رد · 883 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

اريد مساعدة بخصوص اضافة عنصر الى arbre binaire de recherche

 

لكن في التمرين لا يمكن التعديل في programme principal ولا اضافة    variables globales  (التمرين بالمرفقات)

 

يعني كيف يمكنني قراءة القيمة التي أدخلها

 

هذا المثال عند وجود القيمة x من programme principal

void *cree(Noeud*Tete ,int x){
     Noeud * nelement;

     
      nelement = malloc(sizeof(Noeud));
    
        nelement->info = x;
        nelement-> gauche = NULL;
        nelement->droit= NULL;
      Tete=nelement;
     }   

  
void *InsererElement( Noeud *Tete , int x ){
     Noeud * nelement;
     
       if ( Tete == NULL )cree( Tete,x) ;
    else
    {
      
      if ( Tete->info > nelement->info  )
        if ( Tete->gauche == NULL ) cree(Tete->gauche,x);
        else InsererElement(Tete->gauche,x );
     
      if ( Tete->info < nelement->info  )
        if ( Tete->droit == NULL )   cree (Tete->droit,x);
        else InsererElement( Tete->droit,x);
    }
    
}

TP.doc

تم تعديل هذه المشاركة بواسطة نادين01 في 14 ديسمبر 2013 في 00:39

#2

أختي ألم تقولي أنه غير مسموح أن تغيري في الـ program principal :)

في الدالة الرئيسية main تم استدعاء دالة الإدخال كما يلي InsererElement();

وعليك الالتزام بهذا التوقيع ( أقصد الـprototype) ..

المهم ..

عليك كتابة الدالة InsererElement();  بدون وسطاء .. وفي داخلها يمكنك الطلب من المستخدم إدخال القيمة المطلوبة

بالتوفيق

#3

شكرا لك اخي الكريم على الرد

 

لكن كيف يمكن طلب الادخال من المستخدم داخل الدالة InsererElement()

 

بحيث تكون هذه الدالة récursive ؟

#4

يمكنك أن تكتبي عبارة : هل تريد إدخال عنصر جديد ؟

وإذا أدخل المستخدم oui مثلاً .. تقومين باستدعاء الدالة مرة أخرى ( بداخل الدالة ) وإلا return

مثلاً

printf("Insert another element?");
if(getchar()=='o')
InsererElement();
else
return;

بالتوفيق

#5

نفرض ان arbre بها عناصر

 

المستخدم يريد ادخال عنصر مع العلم ان الدالة  InsererElement()    

recursive

كم من مرة سيجيب على السؤال ؟ ب N

اذا ادخل o

 

القيمة المدخلة في الاول سوف تحذف قبل ادخالها

#6

كم مرة سيجيب عن السؤال ؟

بقدر ما يريد هو أن يضيف عناصر .. وعندما يريد التوقف عن الإدخال يدخل أي حرف غير 'o'

يكفي أن يدخل n مرة واحدة فقط ليتوقف عن الإدخال ..

(هل ظننت أنه يجب أن يدخل n ثم n  ثم n ... بنفس عدد المرات التي أدخل فيها o .. :) )

 

لماذا ستحذف القيمة المدخلة في الأول ؟ إذا كان حلّك صحيحاً فأي قيمة ندخلها ستجد مكانها الصحيح دون أن تحذف شيئاً

 

بالتوفيق

#7

 انا قصدي بالحل recursive

void *cree(Noeud*Tete ,int x){
     Noeud * nelement;

     
      nelement = malloc(sizeof(Noeud));
    
        nelement->info = x;
        nelement-> gauche = NULL;
        nelement->droit= NULL;
      Tete=nelement;
     }   

  
void *InsererElement( Noeud *Tete , int x ){
     Noeud * nelement;
     
       if ( Tete == NULL )cree( Tete,x) ;
    else
    {
      
      if ( Tete->info > nelement->info  )
        if ( Tete->gauche == NULL ) cree(Tete->gauche,x);
        else InsererElement(Tete->gauche,x );
     
      if ( Tete->info < nelement->info  )
        if ( Tete->droit == NULL )   cree (Tete->droit,x);
        else InsererElement( Tete->droit,x);
    }
    
}

 اذا اضفت طلب ادخال القيمة داخل الدالةInsererElement

مثلا عند  استدعاء الدالة

( InsererElement(Tete->gauche,x

فسيتم استدعائها قبل ادخال القيمة السابقة  ويطلب منك مرة اخرى ادخال قيمة اخرى ، أليس كذلك؟

 

 

آسفة اخي الكريم على أسئلتي الكثيرة

أنا مبتدئة في البرمجة :)

تم تعديل هذه المشاركة بواسطة نادين01 في 14 ديسمبر 2013 في 23:45

#8 أفضل إجابة

هذا يعتمد على المكان الذي تضعين فيه شرط الـrecursive

كما قلت سابقاً الاستدعاء التالي

( InsererElement(Tete->gauche,x

خاطئ

لأن المطلوب منك كتابة الدالة بدون وسطاء .. وأنت تطلبين من المستخدم إدخالها

اقرئي السؤال

   Noeud* Tete;      /* la tête de l’arbre ABR*/
 
   /* Procédure 1 : Insérer un nouvel élément dans l’arbre ABR*/
   void InsererElement(){
        /*********  A COMPLETER ************/
   }

الرأس معرّف فلا داعي لتمريره في الوسطاء

والقيمة عليك طلبها من المستخدم بشكل يشبه ما يلي:

int value;
cout << "Please Enter a Value";
 
cin >> value;
 
هنا يمكنك لصق الدالة التي قمت بكتابتها
 
وهنا شرط العودية
هل تريد ادخال عنصر آخر ؟
إذا نعم ..
InsererElement();
إذا لا
return

والباقي عليك تحويل الفهم إلى كود

بالتوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 14 ديسمبر 2013 في 23:52

#9

بارك الله فيك أخي الكريم على المساعدة

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

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