PDA

View Full Version : مشکلاتی در مورد لیست پیوندی



mamad64bit
چهارشنبه 29 مهر 1388, 16:54 عصر
سلام دوستان
ااین قسمتی از برنامه ای که لیست پیوندی از دانشجویان درست میکنه

Strcut student{
Char name[30];
Int stno;
Int unit;
Studen t *next;
};
Void enter (student **first,student **last )

چرا در اینجا student **firstبه این صورت تعریف شد ؟ یعنی اشارگری از اشاره گر؟
لطفا کمی در این مورد توضیح بدید

void enter(student **first,student **last)
{
student *node;
char numstr[30];
node->next=NULL;
if(*first==NULL)
*first=*last=node;
else
...
}
من در کد بالا منظور از


*first=*last=node;
به صورت دقیق نمیفهمم
مگه fist با last از نوع اشاره گر ** نبود پس چرا مقدار node که * هست در ان ریخته شده

tdkhakpur
چهارشنبه 29 مهر 1388, 17:07 عصر
بخش دوم كد شما اشكال داره ويا من اينطور متوجه شدم.


void enter(student **first,student **last)
{
student *node;
char numstr[30];
node->next=NULL; // هنوز اين شاختار تعريف نشده كه بتوان مقدار بهش داد
if(*first==NULL)
*first=*last=node;
else
...
}


ميتوانيد بهش حافظه جديد اختصاص بديد


node = (Strcut student*) new (Strcut student)[1];

و اما جواب سوال بعدي كه چرا مقادير به شكلي كه شما توضيح داديد جابجا شد اينه كه براي استفاده از داده ها از اشاره گر به آدرس استفاده شده تا بويسله ايندكس به ساختار ها دسترسي پيدا بشود

mamad64bit
چهارشنبه 29 مهر 1388, 18:03 عصر
باتشکر از جوابتون
لطفا در مورد این کد بیشتر توضیح بدید
student **first
من تابحال همچین چیزی ندیده بودم که دوتا اشاره گر به این شکل داشته باشیم

hosseinkhosravi
چهارشنبه 29 مهر 1388, 18:05 عصر
از اشکالات متعدد کد فوق که بگذریم، باید عرض کنم که پارامترهای ارسالی به توابع، در حالت عادی، غیر قابل تغییرند چرا که کپی آنها به تابع ارسال می شود. حال اگر بخواهیم مقدار یک پارامتر حتما توسط تابع تغییر کند باید یا به صورت ارجاع یا به صورت اشاره گر ارسالش کنیم. حال اگر پارامتری که قرار است تغییر کند خودش اشاره گر باشد، باید آدرس آن اشاره گر را ارسال کنیم (یعنی اشاره گر به اشاره گر). در اینجا چون پارامترهای first* و last* قرار است که داخل تابع تغییر کنند به صورت ** ارسال شده اند و خط زیر کاملا منطقی است، چرا که هر سه از نوع اشاره گر به student هستند.

*first=*last=node;
امیدوارم کافی بوده باشد. در صورت نیاز به راهنمایی بیشتر در مورد اشاره گرها لینک زیر را ملاحظه فرمایید:
اشاره گرها در C++ (http://www.p30codenevis.ir/cpp-programming/92-pointers-in-cpp.html)
تخصیص دینامیک حافظه با اشاره گرها (http://www.p30codenevis.ir/cpp-programming/99-memory-assignment-using-new-and-delete.html)

Salar Ashgi
سه شنبه 05 آبان 1388, 12:18 عصر
لیست پیوندی عموما مجموعه ای از یکسری نود هاست بهمراه دو اشاره گر head , tail

که به ترتیب به انتها و ابتدای لیست اشاره میکنند !!!

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

مگر آنکه حالت خاصی از پیاده سازی مدنظر باشد :

مثلا برای اضافه کردن عنصری به لیست از کد زیر استفاده می کنیم :



class Linkedlist{
....
private:
node *head;
node *tail;
}
==================
void Linkedlist::Add(int x){
node *p = new node;
p->data = x;
if(head==null)
{
head=tail=p;
tail->next = nul;;
}
else{
tail->next = p;
tail = p;
tail->next = null;}
}


موفق باشید !