سؤال

أنا عالق في بعض المتاعب ، للأسف ما زلت أتعلم تفاصيل هذه اللغة.

لدي الرمز التالي

#define SIZE 5
typedef struct 
{
    int start;
    int end;
    int nElements;
    int vetor[SIZE];
} TSTACK;

وأحاول إدراج القيم في صفيفها باستخدام الوظيفة التالية:

void Push(TSTACK *s, int elementInsert)
{
    if(IsFull(s))
    {
        printf("%s\n", "# ERROR: full.");
    }
    else
    {
        s->end++;
        if(s->end == SIZE)
        {
            s->end = 0;
        }

        s->vetor[s->end] = elementInsert;
        s->nElements++;
    }
}

وأنا أستخدم الوظيفة التالية لإظهار العناصر:

void Display(TSTACK *s)
{
    int i;
    if (isEmpty(s))
    {
        printf("%s\n", "# ERROR: empty");
    }
    else
    {
        for (i = 0; i < s->nElements; i++) 
        {
            printf ("value: %d\n", s->vetor[i]);
        }
    }
}

سؤالي هو أنني لا أحصل على نفس النتيجة عندما أضيف كمية مختلفة من العناصر ، عندما أقوم بإدخال 5 عناصر ، تعرض وظيفة العرض جميع العناصر بشكل صحيح ، ولكن عندما أدخل أقل من 5 ، يبدو أن العنصر الأول هو مؤشر:

النتائج الرئيسية التالية في 4201166 ، 3 ، 5 ، 7

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);

    Display(&test);
}

النتائج الرئيسية التالية في 5 ، 3 ، 5 ، 7 ، 3

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);
    Push(&test, 5);

    Display(&test);
}

هل يمكن لأحد أن يريني أين أنا مخطئ؟

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

المحلول

عندما تقوم "بإدراج" عنصر ، فإنك تفعل ذلك في

s->vetor[s->end]

ولكن قبل أن تفعل ذلك أنت زيادة s->end, ، لذلك سيكون العنصر الأول في s->vetor[1]. منذ العنصر الأول (s->vetor[0]) لم يتم تهيئتها ، سيكون لديك قيمة عشوائية هناك. هذا هو السبب في أن لديك قيمة غريبة أولاً في إدراج القيمة الأربع.

عند إدراج قيمة خامسة ، لديك شيك s->end == SIZE حيث قمت بتعيين s->end إلى الصفر ، وبالتالي فإن القيمة الأخيرة في هذه الحالة ستنتهي في المقام الأول في الصفيف.

الحل ، الذي سيحل كلتا المشكلتين المذكورة أعلاه ، هو الزيادة s->end بعد، بعدما قمت بتعيين القيمة إلى الصفيف.

نصائح أخرى

عند طباعة المكدس:

for (i = 0; i < s->nElements; i++) 
{
    printf ("value: %d\n", s->vetor[i]);
}

أنت تبدأ في الفهرس 0 ، ولكن يبدأ تطبيق المكدس في الفهرس 1 ، لذلك عندما يكون لديك أقل من 5 عناصر ، لا يتم تهيئة العنصر الأول. ربما يمكنك إصلاح هذا عن طريق تغيير قيمة البدء إلى 0.

المشكلة الأولى: لم يتم تهيئة المتغيرات المحلية ، فهي تحتوي على القمامة إلا إذا قمت بتهيئتها.

المشكلة الثانية: تبدأ في التعيين في Array Index 1 بدلاً من 0. فقط عند إدراج خمسة عناصر ستعمل ، لأنك تحقق إذا end == SIZE وإذا كان الأمر كذلك end = 0, ، جعل إدراج الخمس تعيين العنصر الأول vetor[0].

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