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

مشكلة في كود يستخدم القوائم المتصلة

مغلقمُجاب
بدأه احمد النبوي في 13 ديسمبر 2013 · 10 رد · 761 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
البرنامج يعمل بشكل سليم ولكن بعد عرض القائمه بعد الاضافه او الحذف يخرج رساله خطأ 
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
struct node
{

    int number;
    struct node *next;


};
typedef node *node_ptr;
node_ptr make_new_node(int x)
{
    node_ptr p;
    p=new node;
    p->number =x;
    p->next =NULL;
    return p;
}
void order_insert(node_ptr &first,int x)
{
    node_ptr p;
    if(first==NULL)
    {
        first=make_new_node (x);
    }
    else if(x==first->number )
    {
        cout<<" This value in node is Exist "<<"\n";
    }
    else if(x<first->number )
    {
        p=make_new_node (x);
        p->next =first;
        first=p;
    }
    else
        order_insert(first->next,x);
}
void create_nodes(node_ptr &first,int n)
{
    int x;
    cout<<" Enter the data in nodes"<<"\n";
    for(int i=1; i<=n; i++)
    {
        cout<<" Node  "<<i<<endl;
        cin>>x;
        order_insert(first,x);

    }
}
void display_list(node_ptr first,int n )
{
    node_ptr p;
    if(first==NULL)
        cout<<"NO nodes founds"<<"\n";
    else
    {
        cout<<" The Data in the nodes are "<<"\n";
        p=first;
        while(p!=NULL)
        {
            for(int i=1; i<=n; i++)
            {
                cout<<"Node"<<i<<"\n"<<p->number <<"\n";
                cout<<"\n";
                p=p->next;
            }
        }
    }
}
void insert_first(node_ptr &first)
{
    int x;
    cout<<"Enter value in new node"<<"\n";
    cin>>x;
    node_ptr p;
    p=make_new_node(x);
    p->next=first;
    first=p;
}
void insert_last(node_ptr &first)
{
    int x;
    cout<<"Entr value in new node "<<"\n";
    cin>>x;
    node_ptr p,q;
    if(first==NULL)
    {
        first=make_new_node (x);
    }
    else
    {
        p=first;
        while(p->next!=NULL)
        {
            p=p->next ;
        }
        q=make_new_node (x);
        p->next =q;
    }
}
void insert_middle(node_ptr &first,int n)
{
    int x;
    cout<<"Entr value in new node "<<"\n";
    cin>>x;
    node_ptr p,q;
    if(first==NULL)
    {
        first=make_new_node (x);
    }
    else
    {
        p=first;
        while(p->number!=n &&p->next!=NULL)
        {
            p=p->next ;
        }
        node *q =new node;
        q->number=n;
        q=make_new_node (x);
        q->next=p->next;
        p->next =q;
    }
}
void delete_first(node_ptr &first)
{
    if(first==NULL)
    {
        cout<<"NO nodes found"<<"\n";
    }
    else
    {
        node_ptr p;
        p=first;
        first=first->next;
        delete p;
    }
}
void delete_last(node_ptr &first)
{
    node_ptr p,d;
    p=first;
    if(first==NULL)
        cout<<" NO nodes found"<<"\n";
    while(p->next->next!=NULL)
    {
        p=p->next;
    }
    d=p->next;
    p->next=NULL;
    delete d;
}
void delete_middle(node_ptr&q,int m)
{
    node_ptr p,d;
    p=q;
    while(p->next->number!=m &&p->next->next!=NULL)
    {
        p=p->next;
    }
    d=p->next;
    p->next=d->next;
    delete d;
}
int main()
{
    int x;
    node_ptr first;
    first=NULL;
    do
    {
        cout<<"enter 1 to creat nodes"<<"\n";
        cout<<"enter 2 display list "<<"\n";
        cout<<"enter 3 to insert first "<<"\n";
        cout<<"enter 4 to insert last "<<"\n";
        cout<<"enter 5 to insert middle "<<"\n";
        cout<<"enter 6 to delet first "<<"\n";
        cout<<"enter 7 to delet last "<<"\n";
        cout<<"enter 8 to delet middle "<<"\n";
        cout<<"enter 9 to exit "<<"\n";
        cout<<"\n";
        cin>>x;
        cout<<"\n";
        switch(x)
        {

        case 1:
            int n;
            cout<<" Enter number of nodes to create"<<"\n";
            cin>>n;
            create_nodes(first,n);
            break;

        case 2:
            display_list (first,n);
            break;
        case 3:
            insert_first (first);
            break;
        case 4:
            insert_last (first);
        case 5:
            int y;
            cout<<"Enter position number"<<"\n";
            cin>>y;
            insert_middle(first,n);
            break;
        case 6:
            delete_first(first);
            break;
        case 7:
            delete_last(first);
            break;
        case 8:
            int s;
            cout<<"Enter value of node to delete"<<"\n";
            cin>>s;
            delete_middle(first,s);
            break;
        case 9:
            exit(0);
            break;

        default:
            cout<<"invalid"<<"\n";
            cout<<"\n";
        }
    }

    while(x!=9);
    getch();
}

تم تعديل هذه المشاركة بواسطة احمد النبوي في 13 ديسمبر 2013 في 18:24 — السبب: تنسيق السؤال

#2

وضّح السؤال ونسّق الكود .. حتى لا يتعرض للإغلاق رجاءً .

#3

ارجو ان اكون قد استطع ايصال ما اريده

#4 أفضل إجابة

:)

 مشكلتك بسيطة بعض الشيء

            int n;
            cout<<" Enter number of nodes to create"<<"\n";
            cin>>n;
            create_nodes(first,n);
            break;

        case 2:
            display_list (first,n);
            break;

لاحظ أنك تقوم بتمرير n إلى الدالة display_list ولكن أين قمت بتعريفه ؟ داخل case 1 وهذا يعني أنه قد تم تدمير قيمته عند الخروج من switch

يمكنك حل المشكلة بتعريف المتغير n قبل دخول حلقة do while ... ولكن لا تنسى إسناد 0 له في البداية , ولا تنسى أن تزيد قيمته عند إضافة عنصر وإنقاص قيمته عند حذف عنصر ..

أظن أن مكان المشكلة صار واضحاً .. ولكن هذا لا يمنع أن تعيد ترتيب main كلها .. لأن n متحول جوهري في برنامجك يدل على حجم القائمة

 

بالتوفيق :)

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

#5

قمت باضافه داله للبحث ولكنها عن البحث لا تخرج الرقم

#include <iostream>

#include <cstdlib>

#include <conio.h>

using namespace std;

struct node

{

int number;

struct node *next;

};

typedef node *node_ptr;

node_ptr make_new_node(int x)

{

node_ptr p;

p=new node;

p->number =x;

p->next =NULL;

return p;

}

void order_insert(node_ptr &first,int x)

{

node_ptr p;

if(first==NULL)

{

first=make_new_node (x);

}

else if(x==first->number )

{

cout<<" This value in node is Exist "<<"\n";

}

else if(x<first->number )

{

p=make_new_node (x);

p->next =first;

first=p;

}

else

order_insert(first->next,x);

}

void create_nodes(node_ptr &first,int n)

{

int x;

cout<<" Enter the data in nodes"<<"\n";

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

{

cout<<" Node "<<i<<endl;

cin>>x;

order_insert(first,x);

}

}

void display_list(node_ptr first,int n )

{

node_ptr p;

if(first==NULL)

cout<<"NO nodes founds"<<"\n";

else

{

cout<<" The Data in the nodes are "<<"\n";

p=first;

while(p!=NULL)

{

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

{

cout<<"Node"<<i<<"\n"<<p->number <<"\n";

cout<<"\n";

p=p->next;

}

}

}

}

void insert_first(node_ptr &first)

{

int x;

cout<<"Enter value in new node"<<"\n";

cin>>x;

node_ptr p;

p=make_new_node(x);

p->next=first;

first=p;

}

void insert_last(node_ptr &first)

{

int x;

cout<<"Entr value in new node "<<"\n";

cin>>x;

node_ptr p,q;

if(first==NULL)

{

first=make_new_node (x);

}

else

{

p=first;

while(p->next!=NULL)

{

p=p->next ;

}

q=make_new_node (x);

p->next =q;

}

}

void insert_middle(node_ptr &first,int n)

{

int x;

cout<<"Entr value in new node "<<"\n";

cin>>x;

node_ptr p,q;

if(first==NULL)

{

first=make_new_node (x);

}

else

{

p=first;

while(p->number!=n &&p->next!=NULL)

{

p=p->next ;

}

node *q =new node;

q->number=n;

q=make_new_node (x);

q->next=p->next;

p->next =q;

}

}

void delete_first(node_ptr &first)

{

if(first==NULL)

{

cout<<"NO nodes found"<<"\n";

}

else

{

node_ptr p;

p=first;

first=first->next;

delete p;

}

}

void delete_last(node_ptr &first)

{

node_ptr p,d;

p=first;

if(first==NULL)

cout<<" NO nodes found"<<"\n";

while(p->next->next!=NULL)

{

p=p->next;

}

d=p->next;

p->next=NULL;

delete d;

}

void delete_middle(node_ptr&q,int m)

{

node_ptr p,d;

p=q;

while(p->next->number!=m &&p->next->next!=NULL)

{

p=p->next;

}

d=p->next;

p->next=d->next;

delete d;

}

node_ptr search_nodes(node_ptr &first,int n)

{

node_ptr p=first;

while(p->next!=NULL)

{

if(n==p->number)

{

return p;

}

else

{

p=p->next;

}

}

return NULL;

}

int main()

{

int x;

node_ptr first;

first=NULL;

int n=0;

do

{

cout<<"enter 1 to creat nodes"<<"\n";

cout<<"enter 2 display list "<<"\n";

cout<<"enter 3 to insert first "<<"\n";

cout<<"enter 4 to insert last "<<"\n";

cout<<"enter 5 to insert middle "<<"\n";

cout<<"enter 6 to delet first "<<"\n";

cout<<"enter 7 to delet last "<<"\n";

cout<<"enter 8 to delet middle "<<"\n";

cout<<"enter 9 to search in list "<<"\n";

cout<<"enter 10 to exit "<<"\n";

cout<<"\n";

cin>>x;

cout<<"\n";

switch(x)

{

case 1:

cout<<" Enter number of nodes to create"<<"\n";

cin>>n;

create_nodes(first,n);

break;

case 2:

display_list (first,n);

break;

case 3:

n=n+1;

insert_first (first);

break;

case 4:

n=n+1;

insert_last (first);

case 5:

n=n+1;

int y;

cout<<"Enter position number"<<"\n";

cin>>y;

insert_middle(first,n);

break;

case 6:

n=n-1;

delete_first(first);

break;

case 7:

n=n-1;

delete_last(first);

break;

case 8:

n=n-1;

int s;

cout<<"Enter value of node to delete"<<"\n";

cin>>s;

delete_middle(first,s);

break;

case 9:

int v;

cout<<"enter number to search"<<"\n";

cin>>v;

search_nodes(first,v);

case 10:

exit(0);

break;

default:

cout<<"invalid"<<"\n";

cout<<"\n";

}

}

while(x!=10);

getch();

}

#6

وكيف تريدها أن تطبع الرقم , الحاسوب لا يقوم إلا بما تأمره به يا صاح

case 9:
int v;
cout<<"enter number to search"<<"\n";
cin>>v;
search_nodes(first,v);

قمت بالبحث وأعادت لك الدالةsearch_nodes العقدة المطلوبة أو أعادت NULL فأين استخدامك للقيمة المعادة ..

أو أين الشرط الي يقوم if search_nodes()!=null اعمل شيئاً ما ؟

أنت لم تكتب ذلك وهذا سبب عدم تنفيذه ..

أرجو أن تكون الفكرة وصلت :)

#7

ارجو التوضيح اكثر

#8

لم تكتب أي تعليمة تدل على القيام بعمل ما إن تم العثور على القيمة المراد البحث عنها

#9

السلام عليكم

 

الموضوع مُخالف لقوانين القسم, لا داعي لتذكيرك في كل مرة بالقوانين :

  • قم بتنسيق الكود عند طرحه في الموضوع.
  • اختر عنواناً مناسباً يُوضح سؤالك.
  • ضع رسالة الخطأ التي ظهرت لك ووضح الأمر الذي تريد المساعدة فيه.

 

هذا النوع من المواضيع يجب أن يُغلق مباشرة, لذا عليك الانتباه جيداً في المرات القادمة.

 

بالتوفيق.

تم تعديل هذه المشاركة بواسطة Snack3r في 14 ديسمبر 2013 في 20:54

#10
مصطفى 36a2 كتب:

لم تكتب أي تعليمة تدل على القيام بعمل ما إن تم العثور على القيمة المراد البحث عنها

في جميع الحالات يخرج ان القيمه موجوده في القائمه       
void search_nodes(node_ptr &first,int n){



node_ptr p=first;


if(n==p->number){

cout<<"number found "<<"\n";

}
else if (p=p->next){

cout<<"number found  " <<"\n";

}
else if(p->next==NULL){

cout<<"number not found"<<"\n";}


}



case 9:

    int v;
cout<<"enter number to search in list"<<"\n";
    cin>>v;
   search_nodes(first,v);
break;
وانا بنسق الكود عن طريق الكومبيلر ودائما يتم تبنيهي بعدم تنسيقه ولا اعرف ما اقوم به لتنسيقه بالشكل المطلوب وشكرا

تم تعديل هذه المشاركة بواسطة احمد النبوي في 14 ديسمبر 2013 في 22:09

#11

السطر التالي

else if (p=p->next){

cout<<"number found " <<"\n";

}

خاطئ .. لأنك تستخدم تعليمة المساواة =  داخل الشرط وبالتالي ستعتبر true

____________

من الناحية المنطقية .. الكود غير صحيح لأنه يجب أن يكون بداخل حلقة تختبر جميع العناصر حتى الوصول للعنصر الأخير ..

______________

من ناحية تنسيق الكود ..

لاحظ أن السؤال الذي تطرحه يظهر بداخل وسم الكود ... 

عندما تريد تنسيق الكود عليك تحديد الكود فقط وليس ctrl+a  :)

ولاحظ أيضاً أن جميع الأسطر ملتصقة باليسار وهذا يصعّب قراءة الكود

من ناحية شرح السؤال .. لا بأس بكتابة سطرين وثلاثة وأربعة تشرح فيها مشكلتك بالتفصيل .. وإن كان يظهر عندك أخطاء اكتبها .. إن امكن

القواعد التالية هي للتفاهم بين الأعضاء ليس إلا .. حتى يساعدك الجميع .. فتنسيق السؤال يؤدي إلى وجود الكثيرين ممن يرغبون بالإجابة ..

عذراً للإطالة

بالتوفيق

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

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