سؤال

لذلك أحاول إجراء محاولة بحث ثلاثية.الآن، أنا أعمل فقط على وظيفة الإدراج.لقد فهمت الفكرة الأساسية لمحاولة البحث الثلاثي عبر الإنترنت.أعلم أن العقدة الجذرية الواحدة بها 3 أوراق، وإذا جاء الحرف قبل الجذر، فإنه يذهب إلى اليسار، وبعده - إلى اليمين، وإذا كان يطابق الجذر، فإنه يذهب إلى الورقة الوسطى.لذا فإن هدفي الرئيسي هو إنشاء برنامج يمكنه اقتراح كلمات للكلمات التي أدخلها المستخدم بشكل خاطئ.لكن في الوقت الحالي، أعمل فقط على إجراء محاولة البحث الثلاثي.أستخدم المحاولة لإنشاء قاموس أتحقق من الكلمات التي أدخلها المستخدم لاقتراح البديل الأفضل التالي.لكن في الوقت الحالي، أعمل فقط على إدخال بعض الأحرف في المحاولة الثلاثية وعندما أعرضها، يجب أن يتم عرضها بالترتيب.لست متأكدًا بنسبة 100٪ من منطقتي فيما يتعلق بالأوراق الوسطى.الآن، عند تشغيل برنامجي، يعطيني بعض القيم غير المحدودة غير المحدودة المتعلقة بطريقة أو بأخرى بالحرف الأخير الذي تم إدخاله.لا أعرف أين أخطأت.هل يمكن لأحد أن يشير إلى أين ارتكبت خطأي؟أيضًا، هل يمكن أن تخبرني إذا كان أي من المنطق الذي كتبته خاطئًا؟أعني، ليس عليك أن تعطيني الرمز أو أي شيء لأنني أشعر أنني قادر على القيام بذلك بنفسي بمجرد أن أفهم أين أخطأت، ولكن إذا كان بإمكان شخص ما مساعدتي في العثور على أخطائي، فسوف يساعدني. كثيراً!

الكود كاملا :

#include <stdio.h>
#include <stdlib.h>  //Because usage of malloc gives warnings without this header
typedef struct tstree
{
    struct tstree *lokid;
    struct tstree *hikid;
    struct tstree *eqkid;
    char letter;
}node;
node *head = NULL;
int count = 0;
int insert(char x, node **head)
{
    if (*head==NULL)            //If it's the first element
    {
        *head = malloc(sizeof(node));   
        (*head)->letter = x;
        count++;            
        (*head)->lokid = (*head)->hikid = (*head)->eqkid = NULL;            //Assign all 3 to null initially
    }
    else if ((*head)->letter == x)          //If equal, insert below
    insert(x , &((*head)->eqkid) );
    else if ((*head)->letter > x)   //If inserted char comes before current val, insert to left
    insert(x,&(*head)->lokid);
    else
    insert(x,&(*head)->hikid);              //Else to the right
    return 0;
}
void display(node *head)
{
    if(head)
    {
        display(head->lokid);               //print in infix order
        printf("%c ",head->letter);
        display(head->hikid);
    }
    //return 0;
}
int main()
{   
    int op;
    char num;
    printf("\nWelcome Fabiz. Hope it meets your expectations!\n");
    while(1)
    {
        printf("\n1. To insert an element\n2. Display the tree\n3. Exit\nOption :");
        scanf("%d",&op);
        switch(op)
        {
            case 1:
            {
                system("clear");
                printf("\nEnter the element : ");
                scanf(" %c",&num);
                insert(num,&head);
                break;
            }
            case 2:
            {
                system("clear");
                if(count == 0)
                printf("\nEmpty tree\n");
                else
                {
                    printf("Display in order..\n");
                    display(head);
                }
                break;
            }
            default: exit(0);
        }
    }
    return 0;
}

أنا أستخدم محرر النصوص Geany وأنا أستخدم Linux Mint.لقد واجهت مشكلة حيث قام المترجم بطباعة آخر حرف قمت بإدخاله بشكل لا نهائي عندما قمت بالضغط على وظيفة العرض.أي مساعدة ستكون مفيدة للغاية!شكرًا!

هل كانت مفيدة؟

المحلول

وظيفة العرض الخاصة بك خاطئة.لا يتم تقييم حالة الحلقة أبدًا إلى خطأ:

while(&(*head)->lokid!=NULL && &(*head)->hikid!=NULL)

هذا ليس ما تريد.لا شيء من &(*head)->lokid أو &(*head)->hikid سوف تقيم من أي وقت مضى ل NULL.لو head ليس NULL, ، ثم &(*head)->lokid هو مجرد نفس العنوان *head بالإضافة إلى إزاحة lokid في struct tstree.لاحظ أن حلقتك لا تحتوي حتى على بيان تحديث قد يجعل الشرط خاطئًا، ولا تحتوي على أي بيان break - محكوم عليه بالفشل.

في الواقع، لا تحتاج حتى إلى حلقة على الإطلاق.لطباعته بالترتيب، هذا هو كل ما تحتاجه:

void display(node *head) {
    if (head) {
        display(head->lokid);
        printf("%c ", head->letter);
        display(head->hikid);
    }
}

لاحظ أنه لا يوجد أي غرض في تمرير أ node ** (لقد غيرت ذلك إلى أ node *)، ويجب أن تكون قيمة الإرجاع void.

تحديث

لك insert() الدالة صحيحة، ولكنك تستخدم المتغير الخطأ في main.هذه المهمة في قاعدة العودية من insert() يتسبب في سلوك غير مقصود:

temp = *head = malloc(sizeof(node));

لاحظ أنه في كل مرة تضغط فيها على الحالة الأساسية، تقوم بتعيين عقدة جديدة لها *head و temp, ، وبالتالي فقدان الإشارة إلى كل ما تم تخزينه فيه temp قبل.ثم تتصل display(temp).نعم، أنت تقوم ببناء المحاولة، ولكنك تقوم بطباعتها بدءًا من آخر عقدة مدرجة - وليس ما تريده.

بدلا من ذلك، يجب عليك الاتصال display مع المتغير العالمي head, ، وهو الجذر الصحيح لمحاولتك:

display(head);

يحدث الشيء نفسه عند استدعاء إدراج.لا تريد إدراج حرف جديد بدءًا من آخر عقدة تمت إضافتها، بل تريد إضافته بدءًا من الجذر. main() يجب أن يكون هذا بدلا من ذلك:

insert(num, &head);

وبينما نحن في ذلك، لاحظ ذلك temp غير ضروري على الإطلاق.أنت لا تحتاج إليها. insert يتلاعب بالرأس العالمي حسب المرجع، temp لا فائدة منه هنا (وفي الواقع لقد أدخل خطأ).

يكفي تغيير هذين الخطين بشكل رئيسي، واختبره هنا، وهو يعمل كالسحر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top