PDA

View Full Version : راهنمایی در مورد ساختن لینکد لیستها



hosseinam1370
دوشنبه 13 مرداد 1393, 18:44 عصر
سلام دوستان.
linkedlist یکم برام گنگه ، و اومدم تا از شما راهنمایی بگیرم ، بنابراین من یه کد میزارم و یه عکس از درخت ، و چندتا سوال میپرسم ، و اگه برای شما دوستان زحمتی نیست،لطف کنید راهنماییم کنید تا بتون این لینکدلیستها رو بفهمم و یاد بگیرم.

این عکسی هست که میخایم لینکد لیستشو بسازیم :

http://8pic.ir/images/3iwk6kuxz5x1vdaxs13l.png


و اینم کدش :

#include "stdafx.h"
#include <iostream>
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};
int main ()
{
struct linkedlist *sar , *temp;
temp = new linkedlist;
temp->data = 14;
sar = temp;
temp = new linkedlist ;
temp->data = 23;
sar->badi = temp;
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;
system("pause");

}

1-دوستان چرا متغییر badi یه اشارگر و اونم از نوع استراکت هست؟اصلا نیاز بود از جنس استراکت باشه؟

2-چرا temp , sar به عنوان اشارگر تعریف شدن؟

3- منظور این خط چیه؟
temp->data = 14;

اگه توضیحی چیزی دارید برای درک لینکد لیستها ، خوشحال میشم بگید.در ضمن گوگل کردم ، ولی بازم نتونستم چیزه زیادی بفهمم،یکم برام نامفهومه.
بازم خیلی ممنون از لطفتون.

amirtork
دوشنبه 13 مرداد 1393, 20:00 عصر
سلام
در مورد سوال اولت که پرسیدی چرا این دو متغیر باید از نوع linkedlist باشن، علتش این هست که این دو متغیر دارن به یک بلاک کامل از اون لیست پیوندی یا همون لینک لیست ما اشاره میکنن، به همین خاطر باید جنسشون مطابق اون باشه.( درواقع نحوه ی تعریف اونها در تابع main نادرست هست! و تنها باید اسم اون ساختار یعنی linkedlist رو در ابتدای اسم این دو اشاره گر مینوشتن)
در مورد سوال بعدی شما، sar داخل این کد، همون header هست در اکثر لیست پیوندی ها، در واقع sar همون اولین بلاک از لینک لیست ما هست که شروع لینک لیست از اون هست.
temp هم یک بلاکی هست که هر دفعه که ما میخوایم مقداری رو به لینک لیستمون اضافه کنیم، اول مقادیر رو داخل این بلاک قرار میدیم، بعد میایم این بلاک رو به بلاک اصلی نسبت میدیم.
در مورد سوال آخر هم، توی این کد داریم به متغیر data مربوط به بلاک temp که داخل ساختار linkedlist تعریف شده مقدار 14 رو نسبت میدیم.
خودم که حس میکنم یک مقدار گنگ و مبهم توضیح دادم، اگر جاییش رو متوجه نشدید بفرمایید حتما اصلاح میکنم.

sa1378
دوشنبه 13 مرداد 1393, 22:25 عصر
منم فیلم ایشون رو دیدم و تمام چیزایی که گفت رو کدشو با توضیح اینجا نوشتم
ببینین بدرتون میخوره یا نه
http://uplod.ir/354aapysdlpp/linked_list.cpp.htm

sa1378
دوشنبه 13 مرداد 1393, 22:28 عصر
1-بعدی به استراکت بعدی توی لینکد لیست اشاره میکنه پس باید یه استراکت باشه
2-چون قراره به یه استراکت اشاره کنن(جور دیگه ای نمیشه تعریفشون کرد)
3-برای اشاره گر ها به یک استراکت به جای temp.data مینویسیم:temp->data

از سوالاتون معلومه اشاره گر هارو خوب یاد نگرفتید
یا دوباره فیلماشو ببینین
یا تو اینترنت سرچ کنین چند تا مطلب بخونین

hosseinam1370
سه شنبه 14 مرداد 1393, 19:03 عصر
ز سوالاتون معلومه اشاره گر هارو خوب یاد نگرفتید
حق با شما بود ، رفتم اشاره گر به ساختمان و خوندم و بیشتر چیزها رو گرفتم و فهمیدم چخبره.


حالا یجا برام عجیبه، و اون اینه که چرا تو این کد :
#include "stdafx.h"
#include <iostream>
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};
int main ()
{
struct linkedlist *sar , *temp;
temp = new linkedlist;
temp->data = 14;
sar = temp;
temp = new linkedlist ;
temp->data = 23;
sar->badi = temp;
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;
system("pause");

}

و تو این قسمت از کد بالا :
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;
system("pause");

اینجا ما فقط مقدار رو به temp دادیم ، ولی نمیدونم که چرا داخل sar هم تغییر میکنه بدونه اینکه temp که الان مقدارش فرق میکنه رو مساوی با sar قرار بدیم!!!
مثلا تو خط های بالا مساوی رو قرار دادیم و sar مقدار گرفت ف ولی اینجا اینکار رو نکردیم و sar مقدار گرفت.
برام سوال شد این.


بازم ممنون از همه دوستان که راهنمایی میکنید.

با تشکر.

sa1378
چهارشنبه 15 مرداد 1393, 00:05 صبح
تو دو تای اولی به یه نوع نوشته شده و سومی نوع نوشتنش فرق داره
اینجا منظور اینه که به این صورت هم میشه این کد رو نوشت
توی اولی و دومی میایم اول temp رو تعریف و مقدار دهی میکنیم
بعد به آخر لیست اضافه میکنیم
توی سومی همون اول میایم متغییر temp قبلی(که آخرین متغیر بود) رو میگیریم و عضو بعد از اون رو توی لیست تعریف میکنیم و اونو مقدار دهی میکنیم
یکم بد توضیح داده باشم شاید

hosseinam1370
سه شنبه 21 مرداد 1393, 19:50 عصر
سلام.
من مشکلم این بود که با اشاره گرها زیاد ور نرفته بودم ، ولی الان چند روز و کاملا برا اشارگرها گزاشتم و خیلی چیزها دستم اومد و فهمیدم لینکدلیست چی به چیه.
حالا خودم تو 5 دقیقه براش کد نوشتم:لبخند:(مثلا اینقدر حرفه ای شدم:لبخندساده:خیلی بحث جالبی بود)
حالا شما دوستان یه دید بزنید ببینید به این کد هم میشه گفت اشاره گر ،مقایسش کنید با اولین کدی که تو پست اول این تاپیک گزاشتم. اگه مشکلی دارم بگید.
f10 کردم دقیقا کار همون کد رو انجام میداد.نگاه کنید :
#include "stdafx.h"
#include <iostream>
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};
int main()
{
struct linkedlist *sar;
sar = new linkedlist;
sar->data= 14;
sar->badi = new linkedlist;
sar->badi->data = 23;
sar->badi->badi = new linkedlist;
sar->badi->badi->data = 98;
system("pause");
};

motherboard
سه شنبه 21 مرداد 1393, 21:57 عصر
سلام.چه طوری؟چه خبرا:لبخندساده:
اومدی یک جا گفتی که:


سلام.
من مشکلم این بود که با اشاره گرها زیاد ور نرفته بودم ، ولی الان چند روز و کاملا برا اشارگرها گزاشتم و خیلی چیزها دستم اومد و فهمیدم لینکدلیست چی به چیه.
حالا خودم تو 5 دقیقه براش کد نوشتم:لبخند:(مثلا اینقدر حرفه ای شدم:لبخندساده:خیلی بحث جالبی بود)
حالا شما دوستان یه دید بزنید ببینید به این کد هم میشه گفت اشاره گر ،مقایسش کنید با اولین کدی که تو پست اول این تاپیک گزاشتم. اگه مشکلی دارم بگید.
f10 کردم دقیقا کار همون کد رو انجام میداد.نگاه کنید :

با احترام ولی شما برخلاف گفته هاتون هیچی رو از اشاره گرها یاد نگرفتید.الان شما چه در کد اولی و چه در کد دومی هیچ استفاده ای از cout و یا هر دستوری که بشه یک خروجی رو تولید کرد رو استفاده نکردید.خب مسلما با توجه به استدلال شما این کدی رو که در زیر نوشتم دقیقا برابر با کد پست اول شماست!!!!!


#include <iostream>
using namespace std;
int main()
{int x;
x=2;
system("pause");}


در اینصورت کد بالا هم چون خروجی شبیه به کدی که گذاشتید رو داره پس این کدی که من گذاشتم برابر با کد شماست!!!!!!
توصیه من اینه که چند بار دیگه اشاره گر ها رو بخونید.این کدی رو هم که گذاشتید هیچ چیز خاصی رو نداره الا اینکه یک استراکچر درست کردید و چند تا اشاره گر تعریف کردید و به همدیگه پاس دادید!!!! توصیه من اینه که یکبار دیگه اشاره گر ها رو بخونید.:لبخند:

hosseinam1370
سه شنبه 21 مرداد 1393, 23:38 عصر
:لبخند::لبخند:جدی؟!
الان این کار لینکد لیستها رو میکنه دیگه ، داره به خونه های بعد از خود اشاره میکنه که دارای یه مقدار هست دیگه،
الان من نمیدونم مشکل باز کجاست که بخام اشاره گرها رو دوباره بخونم که، دقیق طبق کدی که پست اول هست و از استاد کیارش بازرگان گرفته بودم و با f10 همون کد ، نتایج به همین صورتی که من نوشته بودم به دست اومد دیگه.باز مشکل کجاست؟لینکد لیست یعنی همین دیگه.
یکم واضح تر بگی که مشکلم کجاست خیلی ممنون میشم، قاطی کردم دیگه:گیج:

اینم f10 :
http://upload7.ir/imgs/2014-08/64271494932787640262.png

الان اگه نگاه کنید به عکس ، میبینید خونه های بعدی به اول وصل هست، و وابسته به خونه ی اول.
دیگه اشاره گرها نه:گریه:

:لبخند:

sa1378
چهارشنبه 22 مرداد 1393, 08:08 صبح
سلام.چه طوری؟چه خبرا:لبخندساده:
اومدی یک جا گفتی که:

با احترام ولی شما برخلاف گفته هاتون هیچی رو از اشاره گرها یاد نگرفتید.الان شما چه در کد اولی و چه در کد دومی هیچ استفاده ای از cout و یا هر دستوری که بشه یک خروجی رو تولید کرد رو استفاده نکردید.خب مسلما با توجه به استدلال شما این کدی رو که در زیر نوشتم دقیقا برابر با کد پست اول شماست!!!!!


#include <iostream>
using namespace std;
int main()
{int x;
x=2;
system("pause");}


در اینصورت کد بالا هم چون خروجی شبیه به کدی که گذاشتید رو داره پس این کدی که من گذاشتم برابر با کد شماست!!!!!!
توصیه من اینه که چند بار دیگه اشاره گر ها رو بخونید.این کدی رو هم که گذاشتید هیچ چیز خاصی رو نداره الا اینکه یک استراکچر درست کردید و چند تا اشاره گر تعریف کردید و به همدیگه پاس دادید!!!! توصیه من اینه که یکبار دیگه اشاره گر ها رو بخونید.:لبخند:

مگه همیشه قراره خروجی رو ببینیم؟؟
با debug کردن خیلی چیزایی بیشتری از کد میفهمید

a.r.khoshghalb
چهارشنبه 22 مرداد 1393, 10:09 صبح
بدترین کار ممکن برای یاد گرفتن یک الگوریتم یا داده ساختار، اینه که قبل از این که کاملا مسلط بشی، شروع کنی کد بزنی، کد زدن دقیقا مرحله آخره، و از اون بدتر اینه که کدی که منبع آموزشت زده رو کپی کنی.
اون بنده خدایی که به ما لینکد لیست رو یاد داد اینطوری مثال زد. (مثالش یکمی عجیبه و همین باعث میشه تو ذهن بمونه).
فرض کن علی دایی یه سری انبار مواد مخدر داره (n تا). و آدرسشون رو هم داره ولی یادش نمی مونه و باید یه جایی بنویسه.
میاد برای اینکه احتمال لو رفتنش کمتر باشه، تو انبار شماره 1، آدرس انبار شماره 2 رو می نویسه، تو انبار شماره 2، آدرس انبار شماره 3 و الی آخر... و فقط آدرس انبار شماره 1 رو یادش میمونه.
اینطوری اگر پلیس هر کدوم از انبار ها رو پیدا کنه، فقط انبار های بعد اون رو می تونه پیدا کنه و قبلی هاش رو نمی تونه پیدا کنه.

حالا خود علی دایی هم برای اینکه بتونه بره به انبار شماره i، باید به تمام i-1 انبار قبلی بره و یکی یکی بیاد جلو
و این که اگر بخواد انبار i اوم رو خراب کنه، علاوه بر اینکه باید بره به انبار i اوم، باید آدرسی که تو انبار i اوم هست رو برداره، و جایگزین آدرسی که تو انبار i-1 هست بکنه.
و اگر بخواد یک انبار جدید بسازه، هم می تونه انبار رو بسازه و آدرس انبار شماره 1 رو بذاره توش و از این به بعد آدرس این انبار رو یادش باشه، ولی اگر ترتیب انبار هاش براش مهمه، انبار رو میسازه و آدرسش رو می ذاره تو انبار آخر.

لینکد لیستی تر:
برای پیدا کردن یک خونه توی لینکد لیست، باید n تا خونه رو بگردیم. find --> O(n)
برای پاک کردن یک خونه توی لینکد لیست، باید پیداش کنیم و پاکش کنیم که برای پیدا کردن، باید n تا خونه رو بگردیم. delete --> O(n)
برای اضافه کردن، یا آدرس خونه آخر رو نداریم که باید n تا خونه بریم جلو و برسیم به خونه آخر، یا آدرس خونه آخر رو هم نگه می داریم، که در این صورت برای اضافه کردن، فقط کافیه یک خونه جدید بسازیم، و آدرسش رو بریزیم تو خونه آخر. insert --> O(1)

در رابطه با کد شما:

#include "stdafx.h"
#include <iostream>
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};
int main()
{
struct linkedlist *sar;
sar = new linkedlist;
sar->data= 14;
sar->badi = new linkedlist;
sar->badi->data = 23;
sar->badi->badi = new linkedlist;
sar->badi->badi->data = 98;
system("pause");
};




این روند اضافه کردن رو تا کی میتونی ادامه بدی؟ بهتر نیست یه تابع واسه این کار بنویسی؟
استراکتی که نوشتی درسته! ولی به نظرم بشین کد هر 3 تابع پیدا کردن، وارد کردن و پاک کردن رو بزن.
از جایی هم کمک نگیر! وقتی نوشتی کدت رو همینجا قرار بده.

sa1378
چهارشنبه 22 مرداد 1393, 10:20 صبح
این روند اضافه کردن رو تا کی میتونی ادامه بدی؟ بهتر نیست یه تابع واسه این کار بنویسی؟
استراکتی که نوشتی درسته! ولی به نظرم بشین کد هر 3 تابع پیدا کردن، وارد کردن و پاک کردن رو بزن.
از جایی هم کمک نگیر! وقتی نوشتی کدت رو همینجا قرار بده.

کدش رو من تو پستای قبلی توی یه فایل بهشون دادم
احتمالا اونارو خوندن

motherboard
چهارشنبه 22 مرداد 1393, 14:04 عصر
:لبخند::لبخند:جدی؟!
الان این کار لینکد لیستها رو میکنه دیگه ، داره به خونه های بعد از خود اشاره میکنه که دارای یه مقدار هست دیگه،
الان من نمیدونم مشکل باز کجاست که بخام اشاره گرها رو دوباره بخونم که، دقیق طبق کدی که پست اول هست و از استاد کیارش بازرگان گرفته بودم و با f10 همون کد ، نتایج به همین صورتی که من نوشته بودم به دست اومد دیگه.باز مشکل کجاست؟لینکد لیست یعنی همین دیگه.
یکم واضح تر بگی که مشکلم کجاست خیلی ممنون میشم، قاطی کردم دیگه:گیج:

اینم f10 :
http://upload7.ir/imgs/2014-08/64271494932787640262.png

الان اگه نگاه کنید به عکس ، میبینید خونه های بعدی به اول وصل هست، و وابسته به خونه ی اول.
دیگه اشاره گرها نه:گریه:

:لبخند:
بالا بری پایین بیای از نظر من هنوز نمی دونی اشاره گر چی هست :لبخند: زمانی که به خودت زحمت نمیدی و واسه 4 خط کد میای کلید فلان رو میزنی و بعد برای خودت نتیجه گیری می کنی(چه درست و چه غلط) خب مشخصه از کدها سر در نمیاری.

مگه همیشه قراره خروجی رو ببینیم؟؟
با debug کردن خیلی چیزایی بیشتری از کد میفهمید
بر منکرش لعنت.debug چیز خوبیه!!!! ولی توصیه من به اقا حسین اینه که این سوسول بازی ها رو واسه 4 خط کد بذارن کنار.من اصلا با لینکد لیست و از این جور حرف ها کاری ندارم.ایشون میگن که اشاره گر ها رو یاد گرفتند. ولی من میگم که نه هیچی از اشاره گر ها رو نمیدونند.البته غرض از این صحبت ها پامنبری نیست.بلکه اقا حیسن داره سر خودش رو شیره می ماله.:لبخند:
خب اقا حسین پایه هستی فارق از لینکد لیست و از این حرف ها در مورد کد با هم و البته دوستان دیگه تبادل نظر بکنیم؟

hosseinam1370
چهارشنبه 22 مرداد 1393, 16:08 عصر
با سلام
ممنون از توضیحاتتون جناب a.r.khoshqalb و بقیه دوستان که وقت گزاشتید.
مثال علی دایی همجالب بود ، ولی فک نکنم کسی بهش گیر بده :لبخند: ولی نکات جالبی رو با این مثال فهموندین.



این روند اضافه کردن رو تا کی میتونی ادامه بدی؟ بهتر نیست یه تابع واسه این کار بنویسی؟
استراکتی که نوشتی درسته! ولی به نظرم بشین کد هر 3 تابع پیدا کردن، وارد کردن و پاک کردن رو بزن.
از جایی هم کمک نگیر! وقتی نوشتی کدت رو همینجا قرار بده.


راستش منم دنبال همینم که برنامه خودش بیاد تصمیم بگیره و اگه لینکدلیستس نیاز داشت ،خودش بنویسه برا خودش ، ولی خوب هنوز نمیتونم بفهمم چجوری میخاد اینکار و کنه ، ولی تابعشو مینویسم و کدش و اینجا میزارم.
ولی این تابع من باید چیکار کنه الان؟



کدش رو من تو پستای قبلی توی یه فایل بهشون دادم
احتمالا اونارو خوندن

آره شما زحمتشو کشیدین و منم بازش کردم و دیدم (البته قبل از اینکه رو اشارگرها کار کنم )ولی هیچی نفهمیده بودم ، ولی الان که اوضاع فرق کرد یکمی ، رفتم خونه کدتون رو دوباره میبینم حتما.




بالا بری پایین بیای از نظر من هنوز نمی دونی اشاره گر چی هست
:لبخند:
زمانی که به خودت زحمت نمیدی و واسه 4 خط کد میای کلید فلان رو میزنی و بعد برای خودت نتیجه گیری می کنی(چه درست و چه غلط) خب مشخصه از کدها سر در نمیاری.

آها حالا منظورتونو فهمیدم، شما میگید f10 نکنم و تو ذهنم کد و آنالیز کنم، خوب منم همین کار رو اول انجام میدم و بعدش که کد و نوشتم میرم ببینم نتیجه گیریم درسته یا نه.یعنی اول کدم رو رو تخته مینویسم و بعد میرم تایپ میکنم.



ولی من میگم که نه هیچی از اشاره گر ها رو نمیدونند.البته غرض از این صحبت ها پامنبری نیست.بلکه اقا حیسن داره سر خودش رو شیره می ماله.
:لبخند:
:لبخند: باور کن یاد گرفتم:افسرده:
اگه باور نمیکنی میتونی یه سوال بپرسی و سطح منو ببینی . منم قول میدم خودم و با ذهن خودم حلش کنم.تازه خوشحال هم میشم اشکالاتمو بهم بگی تا رفعش کنم.


خب اقا حسین پایه هستی فارق از لینکد لیست و از این حرف ها در مورد کد با هم و البته دوستان دیگه تبادل نظر بکنیم؟


من که ذوق میکنم بحث کنیم تا یاد بگیرم ، البته اگه برا شما و دوستان ممکن باشه.


با تشکر.

motherboard
چهارشنبه 22 مرداد 1393, 16:36 عصر
همین کدی رو که در اول گذاشتی خط به خط توضیح بده ببینم:چشمک: استفاده از ماشین حساب جایز نیست!!!!

a.r.khoshghalb
چهارشنبه 22 مرداد 1393, 16:38 عصر
راستش منم دنبال همینم که برنامه خودش بیاد تصمیم بگیره و اگه لینکدلیستس نیاز داشت ،خودش بنویسه برا خودش ، ولی خوب هنوز نمیتونم بفهمم چجوری میخاد اینکار و کنه ، ولی تابعشو مینویسم و کدش و اینجا میزارم.
ولی این تابع من باید چیکار کنه الان؟

بعد از اینکه مطمئن شدی به صورت تئوری به مبحث لینکدلیست مسلط شدی و به قول رضاس1000 (http://barnamenevis.org/member.php?320555-%D8%B1%D8%B6%D8%A7%D8%B31000) به پوینتر ها، یه استراکت لینکد لیست (که نوشتی) و 3 تا تابع:
تابع search:
یک data بگیره و برو تو خونه های لینکد لیست ببینه اطلاعات کدومشون برابر data ورودی هست؟ شماره خونشو خروجی بده.

تابع delete:
ورودیش یک data است که باید خونه ای با این data رو پاک کنیم، یا یک شماره خونه است که باید پاک بشه.
با کمک تابع search که قبلا نوشتی، خونه رو پیدا می کنی و پاکش می کنی. چه جوری پاک کنیش رو اگر مسلط شده باشی به لینکدلیست خودت میدونی.

تابع insert:
یک شماره خونه میگیره و بعد از اون یک خونه به لینکدلیست اضافه می کنه. چه جوریش رو هم اگر مسلط شده باشی خودت میدونی.

hosseinam1370
چهارشنبه 22 مرداد 1393, 19:09 عصر
همین کدی رو که در اول گذاشتی خط به خط توضیح بده ببینم
http://barnamenevis.org/images/smilies/yahoo/108.gif
استفاده از ماشین حساب جایز نیست!!!!

کد پست اول :لبخند::
struct linkedlist *sar , *temp;

ما اینجا اومدیم sar o temp رو از جنس لینکد لیست و به صورت اشاره گر معرفی کردیم . که هیچکدوم هیچ حافظه ایی رو از سیستم عامل نمیگیرند.

temp = newlinkedlist;

بعد اینجا اومدیم به سیستم عامل گفتیم ، آقا بیا به ما یه حافظه ای به اندازه استراکت لینکدلیست بده ، از اونجایی که خود لینک لیست هم دارای یه int هست و یه اشاره گر ،پس سیستم عامل میاد دوتا حافظه به ما میده که تو یکیش باید int ذخیره کنیم و تو یکیش باید آدرس ذخیره کنیم، حالا این دوتا خونه خودشون جدا یه آدرسی دارند دیگه ، حالا ما میآیم میگیم temp جان هروقت صدات کردیم ،تو بیا این این دوتا خونه رو بهم نشون بده (یعنی مساوی با temp قرار میدیم)،حالا یا تغییر میدم یا حذف میکنم.

temp->data = 14;
اینجا میگیم temp من بهت قبلا بهت حافظه داده بودم !!!! temp میگه خوب بعد ما میگیم :برو تو خونه ایی که اسمش data هست ،بعد 14 رو بگیر اونجا بزار.

sar = temp;

حالا اینجا temp به sar میگه :
جناب sar آقا حسین قبلا یه حافظه ایی از سیستم عامل گرفته بود ، و آدرس اون دوتا حافظه رو داد به من ، حالا آقا حسین میخاد آدرس این دوتا حافظه رو بده به تو تا تو نگهش داری.
بعد sar میگه : باشه بده آدرس هارو به من ، بعد ادامه میده میگه تو data یه 14 داری و تو badi هم یه آدرس.

پس الان sar که یه اشاره گر بود داره اشاره میکنه به حافظه ایی که اون مقدار توش هست.
temp = newlinkedlist ;
temp->data = 23;
اینجا که گفتم.

sar->badi = temp;

اینجا هم چون badi هم یه اشاره گر هست و دارای همون متغییر ها ، پس میشه باهاش مثله یه مرحله قبله خودش برخورد کرد. یعنی ایندفه temp میآد با badi که به سر وصل هست حرف میزنه و داده هاشو میده به badi .
البته اون حافظه ایی که مرحله قبل برای ذخیره آدرس بود ،چون مساوی با یه استراکتی قرار میگیره که اولش یه int data داره ، خودش آدرس دیتا رو میگیره نگه میداره ، و همین منوال میره تا آخر.


temp->badi = new linkedlist; temp->badi->data=98;
temp->badi->badi = NULL;
راستش هنوز نرسیدم به این قسمت کدش فکر کنم تا بفهمم این چجوری داده های sar رو تغییر میده، در صورتی که هیچ جایی نیومده به sar بگه تو تو این مرحله بیا به این قسمت از حافظه اشاره کن.
یعنی sar مساوی با هیچی قرار نگرفته ، ولی مقدار میگیره ، یا اشاره میکنه به همین جایی که temp اشاره میکنه.
برام سوال شده.از دوستان کسی میدونه بگه چی رو من اینجا جا گزاشتم؟؟؟

جناب رضا1000 دوست دارم بگید آیا خوب فهمیدم اشاره گر هارو یا متوسط یا خیلی ضعیفم .خوشحال میشم نظرتون رو بگید تا بهتر شم. اگه جایی رو اشتباه گفتم لطفا تصحیحش کنید. ممنون.




عد از اینکه مطمئن شدی به صورت تئوری به مبحث لینکدلیست مسلط شدی و به قول
رضاس1000 (http://barnamenevis.org/member.php?320555-%D8%B1%D8%B6%D8%A7%D8%B31000)
به پوینتر ها، یه استراکت لینکد لیست (که نوشتی) و 3 تا تابع:
تابع search:
یک data بگیره و برو تو خونه های لینکد لیست ببینه اطلاعات کدومشون برابر data ورودی هست؟ شماره خونشو خروجی بده.

تابع delete:
ورودیش یک data است که باید خونه ای با این data رو پاک کنیم، یا یک شماره خونه است که باید پاک بشه.
با کمک تابع search که قبلا نوشتی، خونه رو پیدا می کنی و پاکش می کنی. چه جوری پاک کنیش رو اگر مسلط شده باشی به لینکدلیست خودت میدونی.

تابع insert:
یک شماره خونه میگیره و بعد از اون یک خونه به لینکدلیست اضافه می کنه. چه جوریش رو هم اگر مسلط شده باشی خودت میدونی.


حتما رفتم خونه روش فکر مبکنم ،و تا جایی که بتونم خودم مینویسم.
شما دوستان هم در نظر بگیرید من الان دانشجوی کارشناسی برق قدرت هستم ، کسی رو ندارم که سی ++ و نکاتشو بهم بگه، فقط خودم هستمو شما دوستان.


با تشکر.

hosseinam1370
جمعه 24 مرداد 1393, 09:02 صبح
#include "stdafx.h"
#include <iostream>
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};
int main ()
{
struct linkedlist *sar , *temp;
temp = new linkedlist;
temp->data = 14;
sar = temp;
temp = new linkedlist ;
temp->data = 23;
sar->badi = temp;
//qesmate 3
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;
//payane qesmate 3
cout << sar->badi ->badi -> data<< endl;
system("pause");

}

سلام.
دوستان می دونید چرا و چجوری و به چه دلیل تو قسمت سوم ، با اونکه اصلا sar مساوی با هیچی قرار نگرفت ، ولی بازم مقدارش تغییر میکنه؟
میدونم کار اشاره گرهاست، ولی sar چجوری میفهمه و تغییر میکنه یکم گیج کنندست.

با تشکر.

sa1378
جمعه 24 مرداد 1393, 09:14 صبح
تا آخر قسمت دوم temp آخرین استراکت هست که مقدارش 23 هست و همینطور:
sar->badi=temp
پس بجای اینکه دوباره temp رو تعریف کنیم و مساوی با sar->badi->badi قرارش بدیم،
میایم temp->badi رو تعریف میکنیم
در واقع انگار temp->badi=sar->badi->badi
اوکی؟

sa1378
جمعه 24 مرداد 1393, 09:15 صبح
هرچی سوال هم براتون پیش میاد اینجا بپرسین
بقیه رو نمیدونم ولی برای من که خیلی عالیه
چون سریع اینارو یادم میره
یه مروری بکنم خیلی بهتره

hosseinam1370
جمعه 24 مرداد 1393, 09:31 صبح
تا آخر قسمت دوم temp آخرین استراکت هست که مقدارش 23 هست و همینطور:
sar->badi=temp
پس بجای اینکه دوباره temp رو تعریف کنیم و مساوی با sar->badi->badi قرارش بدیم،
میایم temp->badi رو تعریف میکنیم
در واقع انگار temp->badi=sar->badi->badi
اوکی؟

دوسته عزیز این معادل کاری هست که داره انجام میده ،
ولی من دنبال اینم که چرا و چجوری همچین معادلی به دست می آد.
اصلا اینجا چجوری sar داره به این حافظه ای که new شده ، اشاره میکنه ، در صورتی که اصلا ما به sar نگفتیم تو بیا به این حافظه اشاره کن؟

این گیجم کرده.

با تشکر.

sa1378
جمعه 24 مرداد 1393, 09:34 صبح
دوسته عزیز این معادل کاری هست که داره انجام میده ،
ولی من دنبال اینم که چرا و چجوری همچین معادلی به دست می آد.
اصلا اینجا چجوری sar داره به این حافظه ای که new شده ، اشاره میکنه ، در صورتی که اصلا ما به sar نگفتیم تو بیا به این حافظه اشاره کن؟

این گیجم کرده.

با تشکر.
توی خط 17 قبل از قسمت سوم گفتیم:
sar->badi=temp
و دوباره اون پستمو بخون

hosseinam1370
سه شنبه 28 مرداد 1393, 15:25 عصر
#include "stdafx.h"
#include <iostream>
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};

int main ()
{
struct linkedlist *sar , *temp ,*temp1 , *temp2;

temp = new linkedlist;
temp->data = 14;
sar = temp;
temp = new linkedlist ;
temp->data = 23;
sar->badi = temp;
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;

while(sar)
{
if (sar->data == 23)
{
temp2 = sar->badi;
break;
}
temp1 = sar;
sar = sar->badi;
}

temp1->badi = temp2;
system("pause");

}


دوستان من میخام لیست 23 رو حذف کنم ، برای همین با temp1 که لیست قبل از 23 رو در خودش ذخیره کرد و temp2 که لیست بعد از لیست 23 رو در خودش ذخیره کرد ، حالا میخام این دوتا (temp1 va temp2) رو با استفاده از این کد:
temp1->badi = temp2;
بهم وصل کنم ، ولی خطا میده،

چرا؟
با تشکر.

sa1378
سه شنبه 28 مرداد 1393, 16:26 عصر
نمیدونم چرا خطا میده ولی مثلا بنویسین
sar->badi=sar->badi->badi

hosseinam1370
سه شنبه 28 مرداد 1393, 16:59 عصر
این خطا رو میداد:
potentially uninitialized local pointer variable 'temp1' used

به این معنی بود که متغییر temp1 که یه اشاره گر پنهانی هست ،مقدار دهی نشده ولی استفاده شده.
برای همین من موقع تعریف این متغییر رو مساوی با NULL قرار دادم و مشکل حل شد.ببین:
struct linkedlist *sar , *temp ,*temp1=NULL , *temp2=NULL;

حالا کسی از دوستان میدونه که چرا باید بهش مقدار بدم یا NULL بدم تا کارم راه بیاوفته؟

با تشکر.

hosseinam1370
سه شنبه 28 مرداد 1393, 18:54 عصر
ببخشید اینقدر سوال میپرسم حوصله ام سر رفت .
من یه تابع نوشتم که با فراخانی این تابع ، لیستی را از لینکد لیست حذف میکنه ، ولی مشکل اینجاست که وقتی من تابع رو فراخانی میکنم ، و میرم داخل تابع ، همه چی درسته و تابع به درستی کارشو انجام میده ، ولی وقتی تابع تموم میشه و برمیگرده به main ، لیست اصلی هیچ تغییری نمیکنه ، انگار هیچ اتفاقی نیوفتاد ، یعنی تغییرات تابع ثبت نمیشه.
باید چیکار کنم ؟
اینم کد:
#include "stdafx.h"
#include <iostream>
void hazf (struct linkedlist *sar , int adadeList);
using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};

int main ()
{
struct linkedlist *sar , *temp ;

temp = new linkedlist;
temp->data = 14;
sar = temp;
temp = new linkedlist ;
temp->data = 23;
sar->badi = temp;
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;
hazf(sar , 14);
system("pause");

}
void hazf (struct linkedlist *sar , int adadeList)
{
struct linkedlist *temp1= NULL , *temp2 = NULL;
int flag=0;
while(sar)
{
if (sar->data == adadeList)
{
temp2 = sar->badi;
break;
}
flag = 1;
temp1 = sar;
sar = sar->badi;
}
delete sar;
if (flag == 1)
{
temp1->badi = temp2;
sar = temp1;
}
sar = temp2;

}

hosseinam1370
جمعه 31 مرداد 1393, 11:39 صبح
دوستان چرا نمیتونم آدرس اشاره گر sar رو بگیرم؟
مگه sar یه اشاره گر نیست؟!! و خود sar هم یه حافظه داره که آدرس متغییر دیتا رو تو خودش نگه میداره.
خوب حالا من آدرس خونه ی sar رو میخام بگیرم و توش این حافظه یه آدرس دیگه قرار بدم.چرا نمیتونم اون آدرس و بگیرم؟
ولی آدرس اون cout میشه.
#include "stdafx.h"
#include <iostream>

using namespace std;
struct linkedlist
{
int data;
struct linkedlist *badi;
};

int main ()
{
struct linkedlist *sar , *temp ;

temp = new linkedlist;
temp->data = 14;
sar = temp;
temp = new linkedlist ;
temp->data = 23;
sar->badi = temp;
temp->badi = new linkedlist;
temp->badi->data=98;
temp->badi->badi = NULL;
//injast

int **a = &sar;// chera nemitonam adres o begiram?

//////////
cout << &sar;
system("pause");

}