تالار گفتمان مانشت
کمک فوری در لیست های پیوندی یک طرفه - نسخه‌ی قابل چاپ

صفحه‌ها: ۱ ۲ ۳
کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 27 اردیبهشت ۱۳۹۱ ۱۰:۲۰ ق.ظ

سلام-دوستان من تابع اضافه کردن به لیست پیوندی یک طرفه را در زبان سی پلاس پلاس به این صورت میخوام۱
الف)اضافه کردن به ابتدا لیست
ب)اضافه کردن به انتهای لیست
ج)اضافه کردن به وسط لیست
فرض میکنیم ابتدای لیستsنام دارد و انتها ان q
استاد ما یه جور میگه که من متوجه نمیشم اگه امکان داره اینا رو با توضیح کامل به من بدید ممنون از راهنماییتان

کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 27 اردیبهشت ۱۳۹۱ ۱۱:۱۲ ق.ظ

ببین من خودم متوجه نمیشدم اما کتاب ساختمان داده جعفر نژاد از لحاظ کد نویسی مطالب بهتر گفته و خوب هم توضیح داده فقط کامل مطالب رو بیان نکرده حالا دقت کن ...من با کمی توضیح برات قرار میدم
فرض کن گره ای مثل d را به ابتدای لیست می خواهیم اضافه کنیم حالا فیلد آدرس آن باید به ابتدای لیست اشاره کند و سپس اشاره گری که قبلا به ابتدای لیست اشاهره میکرد به گره جدید اشهره نماید دستورات این عمل به صورت زیر در کتاب مذکور بیان شده است
کد:
d= new node;
d->info=400;
d->next=p;
p=d;
توضیح کد خط ها :
خط اول : این کد خط توسط تابع new گره ای به نام d را ایجاد میکند
خط دوم : قسمت info در این گره مقدار ۴۰۰ را به خود میگیرد
خط سوم : اشاره گر p به ابتدای لیست اشاره دارد حال فیلد آدرس d به اشاره گر اول لیست اشاره می کند
خط چهارم : حال جایی که p اشاره می کند d هم اشاره می کند

اگه این قسمت رو فهمیدی بگو تا ادامه بدم

کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 27 اردیبهشت ۱۳۹۱ ۱۱:۲۵ ق.ظ

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

اگه میشه تابع ان هم بنویسید و توضیح بدید شرمنده

شرمنده من خط اخرو متوجه نمیشم p=d یعنی چی جای که Dاشاره میکنه Pهم اشاره میکنه مگهDگره نیست اما Pاشاره گره؟میشه با رسم شکل توضیح بدید!من گره و اشاره گر ها رو قاطی کردم شرمنده!

RE: کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 27 اردیبهشت ۱۳۹۱ ۱۱:۵۲ ق.ظ

(۲۷ اردیبهشت ۱۳۹۱ ۱۱:۲۵ ق.ظ)sajad2020 نوشته شده توسط:  شرمنده من خط اخرو متوجه نمیشم p=d یعنی چی جای که Dاشاره میکنه Pهم اشاره میکنه مگهDگره نیست اما Pاشاره گره؟میشه با رسم شکل توضیح بدید!من گره و اشاره گر ها رو قاطی کردم شرمنده!
شرمنده فعلا باید برم شرکت سر کار امشب کامل با شکل برات میگم
موفق باشی

کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 27 اردیبهشت ۱۳۹۱ ۰۶:۵۳ ب.ظ

ببین دوست من

با کد ;p= new node میشه شکل اول یعنی گره جدید ایجاد میشه که اشاره گر p به اون اشاره میکنه(شکل ۱)

با کد ;p->info=5 مقدار ۵ در قسمت data گره قرار میگیرد

اما کد ;p->next=first این یعنی اشاره گر گره یعنی p->next به همون جایی اشاره کند که اشاره گر first اشاره می کند (شکل ۲)

فهم این کد ; first=p سخت نیست یعنی اینکه اشاره گر p به هر جا اشاره دارد اشاره گر first به همون جا اشاره کند (شکل ۳)

حالا تابع میشه این (یادم نمیاد از کدوم کتاب یا سایت یادداشت کردم):

کد:
void InsertFirst( ItemType Item)
{
   NodePtr Current;
   Current = new Node;
   if (current == NULL)
      {
      cerr << "Memory allocation error!" << endl;
      exit(1);
      }
   current->Next = Front;
   current->Info = item;
   Front = current;
   if (Count == 0)
      Rear = current;
   Count++;
}

اگه کامل فهمیدی بگو تا ادامه بدم

RE: کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 29 اردیبهشت ۱۳۹۱ ۰۱:۳۸ ب.ظ

سلام دوست عزیز-اضافه کردن به وسط و انتهای لیست چطوریه؟

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

RE: کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 29 اردیبهشت ۱۳۹۱ ۰۲:۱۴ ب.ظ

کد:
newp=new node;
newp -> info=22;
newp -> next =p -> next;
p -> next =newp;
newp=new node : این کد خط گره جدید ایجاد می کند که newp به آن اشاره میکند

newp -> info=22 : قسمت داده در گره مقدار ۲۲ را میگیرد

بقیه کد ها را روی شکل برات تعریف کردم .
کد هایی که استادت بهت داده رو برام پیام بزن تا برا تحلیل کنم .
اینو فهمیدی بریم سراغ آخری Smile

RE: کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 29 اردیبهشت ۱۳۹۱ ۰۲:۱۹ ب.ظ

ممنون-بریم سراغ اخری؟کدهای استادمو فردا شب برات پیام میدم

کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 29 اردیبهشت ۱۳۹۱ ۰۲:۲۷ ب.ظ

رو شکل برات دارم قرار میدم چند دقیقه صبر کن

کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 29 اردیبهشت ۱۳۹۱ ۰۲:۳۲ ب.ظ

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

RE: کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 29 اردیبهشت ۱۳۹۱ ۰۲:۴۶ ب.ظ

(۲۹ اردیبهشت ۱۳۹۱ ۰۲:۳۲ ب.ظ)sajad2020 نوشته شده توسط:  ببین نمیخواد تا پیدا کردن گره قبل از ان گره جدید و جستجو کنیم؟
چرا باید این کار رو حتما بکنی تا اشتره گر رو به قبل اون گره جدید برسونی از طریق کد زیر :
ptr=ptr -> next این کد را ادامه می دهیم تا اشاره گر ptr را به محل درست برسانیم :

راستی این کد پیمایش لیست هستش :

کد:
ptr=first;
while (ptr!=null)
{
process(ptr -> info)
ptr=ptr -> next ;
{
این کد پیمایش لیست هست تا به null که آخر لیست رو نشون میده

این کد ها بیشتر فکر کنم از روی کتاب داده جعفر نژاد برداشتم

کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 29 اردیبهشت ۱۳۹۱ ۰۲:۵۴ ب.ظ

این کدprocess(ptr -> info)چیه/بدیش اینه استاد ما جعفر نژاد رو قبول نداره اصلا کد هاش فرق دارن!

RE: کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 29 اردیبهشت ۱۳۹۱ ۰۳:۰۲ ب.ظ

(۲۹ اردیبهشت ۱۳۹۱ ۰۲:۵۴ ب.ظ)sajad2020 نوشته شده توسط:  این کدprocess(ptr -> info)چیه/بدیش اینه استاد ما جعفر نژاد رو قبول نداره اصلا کد هاش فرق دارن!
ببین این کد پردازش گره هستش منم خیلی کتاباش خوشم نمیاد حالا بخشی از بعضی کتاباش خوبه قانع نشدی دکمه قانع نیست رو بزن

RE: کمک فوری در لیست های پیوندی یک طرفه - yaser_ilam_com - 29 اردیبهشت ۱۳۹۱ ۰۴:۴۹ ب.ظ

(۲۹ اردیبهشت ۱۳۹۱ ۰۳:۰۲ ب.ظ)yaser_ilam_com نوشته شده توسط:  
(29 اردیبهشت ۱۳۹۱ ۰۲:۵۴ ب.ظ)sajad2020 نوشته شده توسط:  این کدprocess(ptr -> info)چیه/بدیش اینه استاد ما جعفر نژاد رو قبول نداره اصلا کد هاش فرق دارن!
ببین این کد پردازش گره هستش منم خیلی کتاباش خوشم نمیاد حالا بخشی از بعضی کتاباش خوبه قانع نشدی دکمه قانع نیست رو بزن
ببین دوست من به زبان ساده process ، یه تابع هستش که قسمت داده (info) گره رو پردازش میکنه یعنی شما میتونی تابع process رو جداگانه بنویسی و هر عملی که خواستی روی داده موجود در گره انجام بدی مثلا شاید بخوای مقدار ۵ رو به هر کدام از گره ها اضافه کنی حال با استفاده از تابع process می تونی اینکار رو بصورت زیر انجام بدی .
کد:
int process(int x)
{
int t=5,y;
y=t+x;
return y;
}


کمک فوری در لیست های پیوندی یک طرفه - sajad2020 - 30 اردیبهشت ۱۳۹۱ ۱۰:۳۲ ب.ظ

سلام-دوست عزیز اینم تابع حذف یک گره از انتهای لیست که استاد ما گفته منم میخوام شما اضافه کردن را اینطوری بنویسید!

void delete (node*s)
{if(s==null)cout<<"invalid delete";return;}
if(s->next==null){delet(s);s=null;}
else
{
node*p=s;
while(p->next->next!=null)
p=p->next;
delet(p->next);
p->next=null;
}

در مورد سوال قبل sابتدای لیست, pانتهای لیست میباشد