PDA

View Full Version : حذف عنصر از لیست



Gold_cpp
چهارشنبه 03 آذر 1389, 17:26 عصر
سلام

آیا می توان همانطور که یک لیست را از اول به اخر پیمایش می کنیم .


tmp = tmp->next

لیست را از آخر به اول پیمایش کرد .


tmp = tmp->prev

با این طرز فکر که می توان این کار را انجام داد (یعنی پیمایش از اخر به اول) برای حذف عنصر آخر این کار را انجام داده ام.

ابتدا از اول تا آخر لیست را پیمایش کردم


for(help = first;help->next;help = help->next);

الان help روی اخرین عنصر اشاره میکند
چون با چاپ دستور


cout << help->info;

آخرین عنصر چاپ میشود .
دستورات زیر را برای حذف انجام دادم .


help = help->prev;
Help->prev = NULL;
help->next = NULL;
delete(Help);


و این هم تمام برنامه ای که برای این منظور نوشتم.

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

class List
{
public:
Node *first;
List(){first = NULL;}
~List(){};
int getlist(int );
int dellast();
int printlist();
};

int List::getlist(int x)
{
Node *tmp = new Node(x);
if (!tmp)
return 0;//false
if(!first)
{
first = tmp;
Help = tmp;
}
else
{
Help->next = tmp;
Help = Help->next;
tmp->prev = Help->next;
}
return 1;//true
}

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

int List::dellast()
{
if(!first)
return 0;//false
for(help = first;help->next;help = help->next);
//cout << help->info;//print last namber
Help = help;
help = help->prev;
Help->prev = NULL;
help->next = NULL;
delete(Help);
return 1;//true
}

//****************************************
int main ()
{
List d;
for(int i = 0;i < 7;i++)
d.getlist(i+1);
d.printlist();

d.dellast();
cout << "\n\n";

d.printlist();

getch();
return 0;
}
}

توجه :

برای حذف آخرین عنصر در تابع می خواهم حتما این خط
این خط از تابع dellast هیچ تغییری نکند .


for(help = first;help->next;help = help->next);

یعنی اول لیست تا اخر برود و بعد یکی به عقب برگردد .

tdkhakpur
چهارشنبه 03 آذر 1389, 21:54 عصر
اگر داخل حذف از لیست مشکل دارید باید به شکل زیر کدی را که قبلا نوشتید اصلاح کنید.


int List::dellast()
{
if(!first)
return 0;//false
for(help = first;help->next;help = help->next);
//cout << help->info;//print last namber
Help = help;
help = help->prev;
delete(help->next);
help->next = NULL;
return 1;//true
}

Gold_cpp
پنج شنبه 04 آذر 1389, 15:49 عصر
ممنون از شما

ولی متاسفانه این کد هم جواب نمی ده !
چرا !؟

tdkhakpur
پنج شنبه 04 آذر 1389, 22:14 عصر
ولی متاسفانه این کد هم جواب نمی ده !
چرا !؟
مشکلی در داخل حذف در تابع dellast نیست به نظرم در قسمت add گره به لیست اشکال ثبتی داشته باشد.
داخل کدهای بالا اگر از constructor جهت اضافه کرده عنصر استفاده میکنید فکر کنم باید گره قبلی و همچنین گره رو هم در نظر بگیرید تا به همدیگه اشاره ای داشته باشن.

زهره صالحی
جمعه 05 آذر 1389, 07:13 صبح
اگر فرض بر این باشه که نخواسته باشیم چیزی رو حذف کنیم و به جای تابع dellast این کد رو بذاریم باز هم برنامه تون مشکل داره !:متفکر:


int List::dellast()
{
if(!first)
return 0;//false
for(help = first;help->next;help = help->next);
cout << help->info;//print last namber
Help = help;
help = help->prev;
cout << help->info;//ERROR !
return 1;//true
}


داخل کدهای بالا اگر از constructor جهت اضافه کرده عنصر استفاده میکنید فکر کنم باید گره قبلی و همچنین گره رو هم در نظر بگیرید تا به همدیگه اشاره ای داشته باشن.
؟!
برای این که Node ها به همدگر اشاره کنند هر بار که Node میسازیم باید اشاره بدیم به قبلی نه تو constractor .
فکر کنم .

Gold_cpp
چهارشنبه 10 آذر 1389, 12:47 عصر
ضمن تشکر از راهنمایی دوستان :لبخند:
در تابع dellast هیچ گونه اشتباهی رخ نداده اشتباه اصلی در تابع getlist بوده است . یعنی اگر getlist را به صورت زیر بنویسیم برنامه درست اجرا می شود .


int List::getlist(int x)
{
Node *tmp = new Node(x);
if (!tmp)
return 0;//false
if(!first)
{
first = tmp;
Help = tmp;
}
else
{
Help->next = tmp;
tmp->prev = Help;
Help = Help->next;

}
return 1;//true
}