PDA

View Full Version : سوال: لیست های پیوندی



feri_sharp
جمعه 27 آبان 1390, 09:32 صبح
سلام دوستان
من یه تکه از کلاس Linked List (لیست های پیوندی) رو براتوی میذارم. اگر میشه برام بگین که من تابع insert رو چجوری باید فراخونی کنم. جای پارامتر اولش برای فراخونی چی باید بذارم.
اینم کد کلاس.
#include<iostream.h>
#include<conio.h>
class listNode
{
friend class list;
private:
int data;
listNode *link;
public:
listNode(int element){data=element;link=0;}
};
class list
{
private:
listNode *first;
public:
list(){first=0;}
void create2();
void insert(listNode *x,int item);
void display();
void invert();
void concatenate(list b);
void deleted(listNode *x,listNode *y);
};
void list::create2()
{
listNode *p=new listNode(10);
first=p;
first->link=new listNode(20);
}
void list::insert(listNode *x,int item) //x points to previous node
{
listNode *p=new listNode(item);
if(!first)
first=p;
else
{
p->link=x->link;
x->link=p;
}
}
بعد اگر ممنکه بهم بگین که پارامتر اولش(از تابع insert) که (listNode *x) چه کاری انجام میده ؟ نوشته که به گره ی قبلی اشاره می کنه ، ولی اخه چجوری؟
ممنون.
موفق باشید.

_hamid
جمعه 27 آبان 1390, 14:10 عصر
با لینکد لیست ها که آشنایی؟
فکر می کنم این ساختار یه جورایی گیجت می کنه.
پیوندی دو طرفه رو یاد بگیری شاید بیشتر کمکت کنه ولی خوب بریم سر اصل مطلب:

همونطور که می بینی دیتا های ما اینجا از نوع int با یک pointer خط 8 به هم وصل می شن.
به نظرم insert نباید listNode بگیره بهتره که خودش دیتاش رو مدیریت کنه ولی خوب مثل اینکه تو باید بهش بگی که می خوای دیتایی که وارد می کنی کجا قرار بگیره. پس اینجوریه:
خط ۳۳ از دیتایی که تو بهش میدی ( آرگومان دوم ) یک listNode درست می کنه.
چک می کنه که اگر اولین دیتای وارد شده است نیاز نباشه که چیزی رو به چیزی وصل کنه! چون اولینه!
پس اینجا یعنی در شرط اولت خط ۳۴ اصلا براش مهم نیست که آرگومان اولت چیه!

ودر قسمت دوم شرط اگر اولین دیتا نبود تو باید بهش بگی که دیتایی که می خوای وارد کنی به کدوم دیتای از قبل وارد شده وصل شه.

feri_sharp
جمعه 27 آبان 1390, 18:41 عصر
با لینکد لیست ها که آشنایی؟
فکر می کنم این ساختار یه جورایی گیجت می کنه.
پیوندی دو طرفه رو یاد بگیری شاید بیشتر کمکت کنه ولی خوب بریم سر اصل مطلب:

همونطور که می بینی دیتا های ما اینجا از نوع int با یک pointer خط 8 به هم وصل می شن.
به نظرم insert نباید listNode بگیره بهتره که خودش دیتاش رو مدیریت کنه ولی خوب مثل اینکه تو باید بهش بگی که می خوای دیتایی که وارد می کنی کجا قرار بگیره. پس اینجوریه:
خط ۳۳ از دیتایی که تو بهش میدی ( آرگومان دوم ) یک listNode درست می کنه.
چک می کنه که اگر اولین دیتای وارد شده است نیاز نباشه که چیزی رو به چیزی وصل کنه! چون اولینه!
پس اینجا یعنی در شرط اولت خط ۳۴ اصلا براش مهم نیست که آرگومان اولت چیه!

ودر قسمت دوم شرط اگر اولین دیتا نبود تو باید بهش بگی که دیتایی که می خوای وارد کنی به کدوم دیتای از قبل وارد شده وصل شه.



سلام دوست عزیز.
ممنون از جوابتون.
من در واقع چیزی که می خوام بدونم اینه که (من از نظر دستورات زبان ++C ضعیفم) نمیدونم باید توی تابع Main برای آرگومان اول تابع insert چی بنوسم از لحاظ دستوری . یعنی این رو می دونم که باید براش یه گره ای رو بفرستم که می خوام اونجا یه داده ی جدید (گره ی جدید) اصافه کنم.
اگر میشه برای این کلاس یه تابع Main که فقط insert رو فراخونی کنه بذارین.
ممنون.
موفق باشید.

_hamid
جمعه 27 آبان 1390, 20:08 عصر
فری شارپ عزیز به رو در واسی من از کد خوشم نیومد نشستم خودم نوشتمش ;)
اول با template نشوتم ولی اونا رو حذف کردم که برات قابل هضم باشه.
تقریبا یک ساختار کامله که می تونی تو یک کامپایل استاندارد و جدید امتحانش کنی مثل vs10 یا vs08 یا g++ هر ورژنیش!
دیگه خود دانی :

/* hamidr
GPL'ed code!
NO f8cking patent there!
and capitalism sucks */

#include<iostream>
using std::cout;
using std::endl;

struct Node {
Node(){}
Node(int &val) {
next = NULL;
data = val;
}

int data;

Node *next;
};

class linkedList
{
public:
linkedList() { first = list = NULL ; }
~linkedList() {
Node *n = first;
Node *tmp = NULL;

while ( n ) {
tmp = n->next;
delete n;
n = tmp;
}
}

void insert(int val) {

if (!list) {
list = new Node(val);
first = list;
} else {
Node *n = new Node(val);
list->next = n;
list = list->next;
}
}
void showList() {
Node *n = first;
while ( n ) {
cout << n->data << '\t';
n = n->next;
}
cout << '\n';
}
private:
Node *list;
Node *first;

};

int main()
{
linkedList list;

int k=0;
while( k < 100 )
{
list.insert(k);
k+= 10;
}

list.showList();
return 0;
}

feri_sharp
جمعه 27 آبان 1390, 20:55 عصر
سلام دوست عزیز.
اول اینکه این کد رو من نزدم.
دوم اینکه من این کد مربوط میشه به درس ساختمان دادمون که فردا من ازش امتحان دارمو اگر میشه روی همون کد یه تابع main پیاده کنید. ممنون میشم.
موفق باشید.

_hamid
جمعه 27 آبان 1390, 21:09 عصر
خوب اصولا تو روح استادت که بلد نیست درست کد بزنه! خوب این مشکل داره :دی
ولی خوب واسه اینکه امتحان رو خراب نکنی. چشم بفرما:
int main()
{
list link;

link.insert(NULL, 10);
listNode x(10);

link.insert(&x, 11);
link.insert(&x, 12);
link.insert(&x, 13);
return 0;
}

خب آخه این چیه؟! :دی

feri_sharp
جمعه 27 آبان 1390, 21:18 عصر
ممنون دوست عزیز.
آره تو روح استادمون :قهقهه:
راستش ایشون از کتاب Horowitz دارن درس میدن سر کلاس برا اینکه بچه ها بهتر متوجه بشن، اومد کد رو انجوری تغییر داد. بعد از امتحانم مطمئن باش وقتی روی ++C هم مسلط شدم، یه کد میزنم هم با Basic هم با ++C میذارم اینجا.
ممنون دوست عزیز.
موفق باشی.