PDA

View Full Version : لیست پیوندی یک طرفه



Gold_cpp
پنج شنبه 27 آبان 1389, 10:59 صبح
با سلام
این برنامه قراره یک لیست پیوندی یک طرفه حلقوی باشه .
من می خوام اعداد ۱ تا ۵ رو بگیره و چاپشون کنه . منتها وقتی این برنامه رو با دیجیتال مارس کامپایل می کنم اینو چاپ میکنه

1 2 3 4
و وقتی با بورلند کامپایل می کنم اینو چاپ می کنه .

1 2 3 4 5 1
که این یک آخری اون یک اولی نیست چون به ازای ۱۰ - ۲۰ - ۳۰ - ۴۰ - ۵۰ هم یک رو چاپ می کنه .
مشکل چیه ؟‌!!




//in the name of allah
#include<iostream.h>
#include<conio.h>
class Node
{
public:
int info;
Node *first;
Node *last;
Node *next;
Node(){next = first;}
Node (int x){ info = x; next = first; last = first;}
}*Help , ob;

class List
{
public:
List(){}
~List(){};
int getlist(int );
int printlist();
};

int List::getlist(int x)
{
Node *tmp = new Node(x);
if(ob.first == ob.last)
{
ob.first = tmp;
Help = tmp;
}
else
{
Help->next = tmp;
Help = Help->next;
}
return true;
}

int List::printlist()
{
if(!ob.first)
return false;
for(Help = ob.first;Help->next != ob.last;Help = Help->next)
cout << Help->info << "\t";
return true;
}

int main ()
{
List d;
for(int i = 0;i < 5;i++)
d.getlist(i+1);
d.printlist();
getch();
return 0;
}

mohsensaghafi
پنج شنبه 27 آبان 1389, 12:26 عصر
سلام دوست عزیز.
شما در برنامه نویسی که انجام دادید مشکلی در باره نوع نگرش به لیست پیوندی وجود دارد.
دوست عزیز، در لیست پیوندی خود لیست از تعدادی نود درست شده و یک اشاره گر first و احتمالا last. پس این دو اشاره گر از خصوصیات لیست هستند و نه نود. این اولین موردی که باید درست شود.
مورد بعدی عدم توجه به wild pointer ها هست. شما مقدار اولیه ای برای آنها در نظر نگرفته اید.
در آخر سعی کنید که مفاهیم موجود در ساختماتن داده ها را به همان شکلی که تعریف شده اند پیاده سازی کنید.
برای اطلاعات بیشتر به لینک زیز مراجعه کنید.
http://en.wikipedia.org/wiki/Linked_list
موفق باشید

Gold_cpp
پنج شنبه 27 آبان 1389, 12:46 عصر
ممنون از راهنمایی شما

توی غیر حلقوی وقتی tmp رو new می کنیم یک نود ایجاد میکنه و مقدار x رو توی دیتای نود می ذاره و آخرشو NULL میکنه .(یعنی next)(کدشو پایین همین پست نوشتم)

حالا توی حلقوی برای اینکه وقتی tmp رو ایجاد می کنیم آخرش همواره به first اشاره کنه اومدم همین first رو توی Node تعریف کردم . نه توی List .(ناچارا)
حالا شما بگید آیا اگه توی first , list رو تعریف کنم می تونم توی Node ازش استفاده کنم . اگه نمی شه باید چکار کنم .

یا
به عبارت ساده تر
این یه کد غیر حلقوی هست چطوری باید حلقوی یک طرفش کنم ؟



//in the name of allah
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class Node
{
public:
int info;
Node *next;
Node(){next = NULL;}
Node (int x){ info = x; next = NULL;}
}*Help , *help , *start;

class List
{
public:
Node *first;
List(){first = NULL;}
~List(){};
int getlist (int );
int printlist();
};
int List::getlist(int x)
{
Node *tmp = new Node(x);
if (!tmp)
return 0;
if(!first)
{
first = tmp;
Help = tmp;
}
else
{
Help->next = tmp;
Help = Help->next;
}
return 1;
}
int List::printlist()
{
if(!first)
return 0;
for(Help = first;Help;Help = Help->next)
cout << Help->info << "\t";
return 1;
}
//****************************************
int main ()
{
randomize();
List d;
for(int i = 0;i < 10;i++)
d.getlist(random(100) + 1);
d.printlist();
getch();
return 0;
}

زهره صالحی
پنج شنبه 27 آبان 1389, 17:11 عصر
با سلام
فکر نکنم بشه تو نود از فرست استفاده کرد یعنی اینطوری که خواستی .
ولی اگه دو تا تغییر توی کدت بدی میشه لیست پیوندی حلقوی . اونایی که تغییر دادم رو مشخص کردم . با کامنت



//in the name of allah
class Node
{
public:
int info;
Node *next;
Node(){next = NULL;}
Node (int x){ info = x;next = NULL;}
}*Help;

class List
{
public:
Node *first;
List(){first = NULL;}
~List(){};
int getlist (int );
int printlist();
};
int List::getlist(int x)
{
Node *tmp = new Node(x);
if (!tmp)
return 0;
if(!first)
{
first = tmp;
Help = tmp;
}
else
{
Help->next = tmp;
Help = Help->next;
}
Help->next = first;/* this line */
return 1;
}
int List::printlist()
{
if(!first)
return 0;
for(Help = first;Help->next != first;Help = Help->next)/* this line */
cout << Help->info << "\t";
return 1;
}
//****************************************
int main ()
{
randomize();
List d;
for(int i = 0;i < 9;i++)
d.getlist(random(100) + 1);
d.printlist();
getch();
return 0;
}

Gold_cpp
جمعه 28 آبان 1389, 08:02 صبح
ممنون
این کد هم ایراد داره
آخرین عنصر چاپ نمیشه ؟

mohsensaghafi
جمعه 28 آبان 1389, 12:31 عصر
با سلام
فکر نکنم بشه تو نود از فرست استفاده کرد یعنی اینطوری که خواستی .
ولی اگه دو تا تغییر توی کدت بدی میشه لیست پیوندی حلقوی . اونایی که تغییر دادم رو مشخص کردم . با کامنت

[/PHP]

سلام دوست عزیز
شما همواره دارید در یکی از توابع کلاس list یک node جدید رو به لیست اصافه می کنید. پس اونجا حتما می توانید این کار رو انجام بدید. کما اینکه خودتون هم از این روش استفاده کردید.

mohsensaghafi
جمعه 28 آبان 1389, 12:49 عصر
ممنون
این کد هم ایراد داره
آخرین عنصر چاپ نمیشه ؟

سلام دوست عزیز.
برای اصلاح این مشکل می تونی حلقه for رو به یه حلقه do while تبدیل کنی. تابع print به این صورت خواهد شد.

int List::printlist()
{
if(!first)
return 0;
Help = first;
do{
cout << Help->info << "\t";
Help = Help->next;
}while(Help!=first);
return 1;
}

دوست عزیز، توجه داشته باش که می توانی برای حذف متغیر های متعدد، از یک متغیر last که به آخرین node اشاره می کند بجای Help, first استفاده کنی.
موفق باشی.