عملیات روی لیست 2 پیوندی؟

-Mitra

Member
سلام

ببخشید من یه کد نوشتم ولی فکر کنم همش اشتباه باشه
میخوام مقداری عدد از کاربر بگیره و کاربر دز انتها عدد 0 وارد کنه
بعد لیست را نمایش بده
بعد لیست را بر عکس کنه
ممون :rose:

کد:
#include<iostream.h>
#include<conio.h>
struct node{
int id;
node *left;
node *right;};
node *p,*t,*q,*start;
int main(){
int a;
cin>>a;
while(a!=0){
t=new node[1];
t->id=a;
p->right=t;
t->left=p;
p=p->right;
if(p==NULL) {
p=start;
start=t;}
else
while(p!=NULL)
cout<<p->id;
getch();}
return 0;
}
 

the_king

مدیرکل انجمن
سلام

ببخشید من یه کد نوشتم ولی فکر کنم همش اشتباه باشه
میخوام مقداری عدد از کاربر بگیره و کاربر دز انتها عدد 0 وارد کنه
بعد لیست را نمایش بده
بعد لیست را بر عکس کنه
ممون :rose:
شما باید آنقدر از کاربر مقدار a را دریافت کنید و به لیست اضافه کنید که عدد 0 دریافت شود. اما ببینید
مقدار a رو کجا از کاربر می خوانید :
کد:
int main()
{
    int a;
    cin >> a;
شما a رو بیرون حلقه while خوانده اید، نه داخل آن، به همین جهت فقط یک a از ورودی می خوانید و بس.

در ضمن مقدار اولیه متغیر ها رو هم مشخص نکردید، مقدار p وقتی عدد اول را می خوانید مشخص نیست :
کد:
p -> right = t;

در ضمن وقتی یک عضو جدید t را به لیست اضافه می کنید حتما هم t -> left و هم t -> right رو مشخص کنید،
مقدار t -> right همانقدر مهم است که t -> left ، حتی اگر قرار است NULL باشد صریحا NULL را در آن قرار دهید.
کد:
[COLOR="Gray"]        t -> left = p;[/COLOR]
        t -> right = NULL;

ایراد بعدی موقع نمایش لیست است، شما اول باید اجازه دهید که همه مقادیر خوانده شوند و حلقه while
اولیه به پایان برسد و سپس مقادیر رو نمایش دهید. این حلقه که شما نوشتید مقدار p -> id را نمایش می دهد
اما چون بعد از نمایش مقدار، p را به p -> right تغییر نمی دهید، مقدار p - > id را مجددا نمایش می دهد و
یک حلقه بی پایان است :
کد:
            while (p != NULL)
                cout << p -> id;

دو بار لیست را چاپ خواهیم کرد، یکبار قبل از برعکس کردن و دفعه دوم بعد از برعکس کردن :
کد:
#include <iostream.h>
#include <conio.h>

struct node
{
    int id;
    node *left;
    node *right;
};

node *p, *t, *start = NULL;

int main()
{
    int a = -1;
    p = start;
    while (1 == 1)
    {
        cin >> a;
        if (a == 0)
            break;
        t = new node[1];
        t -> id = a;
        t -> left = p;
        t -> right = NULL;
        if (p == NULL)
            start = t;
        else
            p -> right = t;
        p = t;
    }

    p = start;
    while (p != NULL)
    {
        cout << p -> id;
        p = p -> right;
    }
    cout << "\n";

    p = start;
    while (p != NULL)
    {
        t = p -> right;
        if (t != NULL)
            start = t;
        p -> right = p -> left;
        p -> left = t;
        p = t;
    }

    p = start;
    while (p != NULL)
    {
        cout << p -> id;
        p = p -> right;
    }
    cout << "\n";

    getch();
    return 0;
}
 

-Mitra

Member
ممنون

من اون شرط رو عوض کردم
int a = -1;
که A منفی یک باشه را 0 قرار دادم

ببخشید من 3 تا WHILE اخر رو یه کمی متوجه نشدم میشه راهنمایی کنید چیکار میکنه
 

the_king

مدیرکل انجمن
ممنون

من اون شرط رو عوض کردم
int a = -1;
که A منفی یک باشه را 0 قرار دادم

ببخشید من 3 تا WHILE اخر رو یه کمی متوجه نشدم میشه راهنمایی کنید چیکار میکنه

دو تا While که دقیقا مشابه هم بودند و از ابتدا لیست تا انتها id دونه دونه عضو ها رو نمایش می دهند یعنی
وظیفه شون نمایش لیست اعضاء بود.

یک While هم وسط شان قرار داشت که جای left و right اعضا را عوض می کرد، در نتیجه لیست معکوس می شد.
 

جدیدترین ارسال ها

بالا