PDA

View Full Version : چاپ عناصر لیست



زهره صالحی
جمعه 21 آبان 1389, 20:26 عصر
با سلام
برنامه ای بنویسید که تعدادی عدد را گرفته آنها را لیست دیگری (بصورت بر عکس) کپی کند .

یا

برنامه ای بنویسید عناصر یک لیست را قبل از عنصر اول درج کند .

این اون برنامه ایی که نوشتم منتها جواب نمی ده :گریه:



#include<iostream.h>
struct Node
{
int info;
Node *next;
}*first , *tmp , *start;
void nodes ()
{
tmp = new Node;
first = tmp;
int x;
tmp->info = x;
do
{
cin >> x;
tmp->next = new Node;
tmp = tmp->next ;
tmp->next = NULL;
}while(x > 0);

}

void fanction()
{
Node *help = new Node;
start = help;
tmp = first;
start->info = first->info;
start->next = NULL;
tmp = tmp->next;
while(tmp)
{
help = new Node;
help->info = tmp->info;
help->next = start;
start = help;
tmp = tmp->next;
}
}
void print ()
{
tmp = start;
cout << "Answer :: \n";
while (tmp->next)
{
cout << tmp->info << endl;
tmp = tmp->next;
}
}

void main ()
{
nodes();
fanction();
print();
}

کجا رو اشتباه توشتم ؟:متفکر:

sh4mid
شنبه 22 آبان 1389, 00:05 صبح
سلام
اول بریم سر وقت زیربرنامه nodes

tmp = new Node;
first = tmp;
int x;
tmp->info = x;
do
{
cin >> x;
tmp->next = new Node;
tmp = tmp->next ;
tmp->next = NULL;
}while(x > 0);

اول اینکه در خط چهارم متغیر X مقدار نمی گیرد و بدون مقدار دهی به tmp->info منتسب میشود
دوم اینکه شرط حلقه طوری است که با وارد نمودن عدد منفی از حلقه خارج می شود ولی در نظر داشته باشید که این عدد منفی هم در زنجیره شما قرار می گیرد ، در حالیکه احتمالا شما نمی خواهید عدد آخر جزو این زنجیره باشد؟:متفکر::متفکر:
خب این تابع را می شود به صورت زیر تغییر داد(این روش الزاما بهترین روش نیست)


tmp = new Node;

first = tmp;
int x=0;
do
{
cin >> x;
if(x<0) break;
tmp->info = x;
tmp->next = new Node;
tmp = tmp->next ;
tmp->next = NULL;
if(!bHasOneElement) bHasOneElement=true;
}
while(true);


شرط حلقه تغییر یافته و در صورتیکه عدد منفی وارد شود از حلقه بیرون می پرد، در ضمن متغیری اضافه شده از نوع bool برای اینکه بفهمیم آیا اساسا این زنجیره دارای عنصری هست یا نه؟(یکی از حالتهای ورود داده می تواند اینگونه باشد که کاربر اولین عدد را منفی وارد کند یعنی اصولا نخواهد زنجیره ای ایجاد شود) از این متغیر در توابع بعدی استفاده می شود

در تابع بعدی نوشته اید
tmp = tmp->next;
while(tmp)


اگر کاربر تنها یک عدد وارد کند در خط دوم tmp معنی ندارد
وباید به صورت زیر باشد



//tmp = tmp->next;


while(tmp->next)


برای اینکه مطمئن شویم زنجیره حتما شامل حد اقل یک عنصر هست به ابتدای تابع خط زیر را اضافه می کنیم


if(bHasOneElement)

در در کل تابع به صورت زیر تغییر می کند


if(bHasOneElement)

{
Node *help = new Node;
start = help;
tmp = first;
start->info = first->info;
start->next = NULL;
//tmp = tmp->next;

while(tmp->next)
{
help = new Node;
help->info = tmp->info;
help->next = start;
start = help;
tmp = tmp->next;
}
}

در تابع بعدی هم بررسی میکنیم که حداقل یک عنصر وارد شده باشد
در کل برنامه اینگونه میشود

struct Node
{
int info;
Node *next;
}*first , *tmp , *start;

bool bHasOneElement=false;
void nodes ()
{
tmp = new Node;

first = tmp;
int x=0;
do
{
cin >> x;
if(x<0) break;
tmp->info = x;
tmp->next = new Node;
tmp = tmp->next ;
tmp->next = NULL;
if(!bHasOneElement) bHasOneElement=true;
}
while(true);

}

void fanction()
{
if(bHasOneElement)
{
Node *help = new Node;
start = help;
tmp = first;
start->info = first->info;
start->next = NULL;
//tmp = tmp->next;

while(tmp->next)
{
help = new Node;
help->info = tmp->info;
help->next = start;
start = help;
tmp = tmp->next;
}
}



}


void print ()
{
tmp = start;
if(bHasOneElement)
{
cout << "Answer :: \n";
while (tmp->next)
{
cout << tmp->info << endl;
tmp = tmp->next;
}
}

}


int main()
{

nodes();
fanction();
print();
}

همانطور که در بالا گفتم این روش لزوما بهترین روش نیست فقط کار شما را راه می اندازد(در ضمن بهتر است فکری هم به حال آزاد کردن حافظه گرفته شده کنید)