PDA

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



adine2020
چهارشنبه 15 اردیبهشت 1389, 22:33 عصر
سلام
میشه این الگوریتم حذف رو برای من توضیح بدین؟
void linkedList::delNode()
{
node *h, *p;
int stnum ;
if(!first)
{
cout << "List is empty.";
getch();
return;
}
cout << "Enter student number for delete:";
cin >> stnum ;
h = p = first ;
while (h != NULL)
{
if (h -> stno != stnum)
{
p = h ;
h = h -> next ;
continue ;
}
else { //remove from start
if (h == first) {
first = h -> next ;
delete h ;
delete p ;
break ;
}//end of if
else {
if(h == last)
last = p;
p -> next = h -> next;
delete h ;
break ;
}//end of else
}//end of else
}//end of while
}

یه سوال دیگه
می خوام جمع چند جمله ای رو با لیست پیوندی پیاده سازی کنم می خوام گره ها رو با هم از ورودی بگیرم نه یکی یکی
برنامه اش چیه؟ اینو نوشتم ولی درست عمل نمی کنه
void link::enter()
{
node *help;
node *temp;
help=new node;
help->next=NULL;
if(first==NULL)
first=last=help;
else
{
while(1)
{
help=new node;
help->next=NULL;
last->next=help;
last=help;

cout<<"\n enter Data:";
cin>>last->data;
if((last->data)==NULL)
break;
}

}

mortezamsp
پنج شنبه 16 اردیبهشت 1389, 01:18 صبح
حذف یک گره از لیست :

1 - اگر لیست خالی باشد ، از تابع خارج شو
2 - گره موردنظر را دریافت کن
3 - دواشاره گر p و h تعریف میکنیم که به ابتدای لیست اشاره میکنند . این دو اشاره گر لیشت را پیمایش میکنند و همیشه p به جای قبل از h اشاره میکند(بجز بار اول) .
4 - تا وقتی به انتهای لیست نرسیدی ،
اگر روی گره مورد نظر نیستی ، h را جلو ببر و p را پشت سر آن حرکت بده
اگر روی گره مورد نظر هستی به این ترتیب آنرا پاک کن :
اگر آن گره ابتدایی است ، اول اشاره گر first را یکی جلو ببر ،بعد آن گره را پاک کن
اگر آن گره انتهایی است ، اشاره گر last را یکی به عقب برگردان
درغیر اینصورت ، اشاره گر next گره قبلی را به گره بعدی بده . در اینصورت گره فعلی دیگر
قابل دستیابی نخواهد بود
برگرد به 4



سوال دوم : last->data برابر NULL نمشه . NULL مال اشاره گرهاست .باید یه عدد قراردادی بذاری .مثلا -1.

samandani
پنج شنبه 16 اردیبهشت 1389, 18:51 عصر
به نام خدا
سلام کسی می تونه این برنامه را بنویسد یا توضیحی در مورد آن بدهد؟البته ببخشید این را این جا پست می کنم جایی برایش پیدا نکردم

برنامه ای بنویسید که:
- یک چند جمله ای دلخواه مانند 6 + 7X^2 – 5Y^2Z + 6X^2 را از یک فایل متنی بخواند.(عملگرهای + و – جملات را از هم جدا می کنند. هر جمله ترکیبی از چند متغیر ساده و یک ضریب و عملگرهای * و / می تواند بین متغیرهای ساده باشد)
- متغیر های ساده و مرکب هر جمله را تشخیص دهد.
در عبارت بالا متغیرهای ساده عبارتند از: X، Y، Z و متغیرهای مرکب عبارتند از 6X^2، -5Y^2Z
- عبارت جبری در حافظه به کمک ساختمان داده لیست پیوندی نگهداری شود. (ساحتمان داده ای که برای نود های لیست در نظر گرفته می شود در یک فایل متنی جداگانه شرح داده شود)
دقت داشته باشید که هر متغیر ساده از هر جمله باید در یک گره نگهداری شود. هر جمله را در یک گره لیست نگذارید.
- در صورت امکان ساده سازی شود.
عبارتی که در بند اول آورده شده می تواند به صورت 6 + 13X^2 – 5Y^2Z ساده شود
- در پایان با تعیین مقادیری برای متغیرهای ساده (از طریق کاربر) عبارت محاسبه شده و جواب نهایی چاپ شود.
با در نظر گرفتن X=2 و Y=1 و Z=1 نتیجه نهایی برابر است با 6 + 52 -5 = 53

adine2020
پنج شنبه 16 اردیبهشت 1389, 18:52 عصر
tAnKs
متوجه شدم که چه طوری اگه گره موردنظر در اول یا آخر بود رو چه جوری حذف کنه اما حذف از وسط رو متوجه نشدم
این قسمتشو متوجه نمیشم:
if (h -> stno != stnum)
{
p = h ;
h = h -> next ;
continue ;
}
این جمله ای گفتین دستورش کدومه :"اگر روی گره مورد نظر هستی به این ترتیب آنرا پاک کن :"


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

giootin_tiz
سه شنبه 21 اردیبهشت 1389, 22:22 عصر
به نام خدا

سلام کسی می تونه این برنامه را بنویسد یا توضیحی در مورد آن بدهد؟البته ببخشید این را این جا پست می کنم جایی برایش پیدا نکردم

برنامه ای بنویسید که:
- یک چند جمله ای دلخواه مانند 6 + 7X^2 – 5Y^2Z + 6X^2 را از یک فایل متنی بخواند.(عملگرهای + و – جملات را از هم جدا می کنند. هر جمله ترکیبی از چند متغیر ساده و یک ضریب و عملگرهای * و / می تواند بین متغیرهای ساده باشد)
- متغیر های ساده و مرکب هر جمله را تشخیص دهد.
در عبارت بالا متغیرهای ساده عبارتند از: X، Y، Z و متغیرهای مرکب عبارتند از 6X^2، -5Y^2Z
- عبارت جبری در حافظه به کمک ساختمان داده لیست پیوندی نگهداری شود. (ساحتمان داده ای که برای نود های لیست در نظر گرفته می شود در یک فایل متنی جداگانه شرح داده شود)
دقت داشته باشید که هر متغیر ساده از هر جمله باید در یک گره نگهداری شود. هر جمله را در یک گره لیست نگذارید.
- در صورت امکان ساده سازی شود.
عبارتی که در بند اول آورده شده می تواند به صورت 6 + 13X^2 – 5Y^2Z ساده شود
- در پایان با تعیین مقادیری برای متغیرهای ساده (از طریق کاربر) عبارت محاسبه شده و جواب نهایی چاپ شود.
با در نظر گرفتن X=2 و Y=1 و Z=1 نتیجه نهایی برابر است با 6 + 52 -5 = 53





من اینو نوشتم شاید به دردت بخوره دو تا چند جمله ای میگیره 4 عمل اصلی رو روش انجام میده



include<conio.h>
#include<iostream.h>
#define Max 20
class Poly;
class PolyNode
{
friend Poly;
float Coef;
int Pow;
};
class Poly
{
int n;
PolyNode Data[Max];
public:
void Poly::SortPoly(void);
void ReadPoly(void);
void WritePoly(void);
void AddPoly(Poly a,Poly b);
void SubtractPoly(Poly a,Poly b);
void MulPoly(Poly a,Poly b);
void Poly::ItemPoly(float Coef,int Pow,Poly b);
void Poly::TaghsimPoly(int k,Poly a,Poly b);
};
void Poly::SortPoly(void)
{
int i,j;
PolyNode item;
for(i=n-1;i>0;i--)
for(j=0;j<i;j++)
if(Data[j].Pow<Data[j+1].Pow)
{
item=Data[j];
Data[j]=Data[j+1];
Data[j+1]=item;
}
while(i<n-1)
if(Data[i].Pow==Data[i+1].Pow)
{
Data[i].Coef+=Data[i+1].Coef;
for(j=i+1;j<n-1;j++)Data[j]=Data[j+1];
n--;
}else i++;
}
void Poly::ReadPoly(void)
{
int i;
cout<<"\nPlease enter parts of poly : ";
cin>>n;
cout<<"\nPlease enter Polynomial : \n\n";
for(i=0;i<n;i++)
{
cin>>Data[i].Coef;
cout<<" x^"<<endl;
cin>>Data[i].Pow;
cout<<" +"<<endl;
}
}
void Poly::WritePoly(void)
{
int i;
cout<<"\n";
for(i=0;i<n;i++)cout<<Data[i].Coef<<"X^"<<Data[i].Pow<<" + ";
}
void Poly::AddPoly(Poly a,Poly b)
{
int i,j,k;
i=j=k=0;
while(i<a.n&&j<b.n)
{
if(a.Data[i].Pow>b.Data[j].Pow)
{
Data[k].Coef=a.Data[i].Coef;
Data[k++].Pow=a.Data[i++].Pow;
}
else if(a.Data[i].Pow<b.Data[j].Pow)
{
Data[k].Coef=b.Data[j].Coef;
Data[k++].Pow=b.Data[j++].Pow;
}
else if(a.Data[i].Coef+b.Data[j].Coef)
{
Data[k].Coef=a.Data[i].Coef+b.Data[j].Coef;
Data[k++].Pow=a.Data[i++].Pow;
j++;
}
else
{
i++;
j++;
}
}
while(i<a.n)
{
Data[k].Coef=a.Data[i].Coef;
Data[k++].Pow=a.Data[i++].Pow;
}
while(j<b.n)
{
Data[k].Coef=b.Data[j].Coef;
Data[k++].Pow=b.Data[j++].Pow;
}
n=k;
}
void Poly::SubtractPoly(Poly a,Poly b)
{
int i,j,k;
i=j=k=0;
while(i<a.n&&j<b.n)
{
if(a.Data[i].Pow>b.Data[j].Pow)
{
Data[k].Coef=a.Data[i].Coef;
Data[k++].Pow=a.Data[i++].Pow;
}
else if(a.Data[i].Pow<b.Data[j].Pow)
{
Data[k].Coef=b.Data[j].Coef;
Data[k++].Pow=b.Data[j++].Pow;
}
else if(a.Data[i].Coef-b.Data[j].Coef)
{
Data[k].Coef=a.Data[i].Coef-b.Data[j].Coef;
Data[k++].Pow=a.Data[i++].Pow;
j++;
}
else
{
i++;
j++;
}
}
while(i<a.n)
{
Data[k].Coef=a.Data[i].Coef;
Data[k++].Pow=a.Data[i++].Pow;
}
while(j<b.n)
{
Data[k].Coef=b.Data[j].Coef;
Data[k++].Pow=b.Data[j++].Pow;
}
n=k;
}
void Poly::MulPoly(Poly a,Poly b)
{
int i,j,k;
i=j=k=0;
while(i<a.n)
{
j=0;
while(j<b.n)
{
Data[k].Coef=a.Data[i].Coef*b.Data[j].Coef;
Data[k++].Pow=a.Data[i].Pow+b.Data[j++].Pow;
}
i++;
}
n=k;
}
void Poly::ItemPoly(float Coef,int Pow,Poly b)
{
int j,t;
j=t=0;
while(j<b.n)
{
Data[t].Coef=Coef*b.Data[j].Coef;
Data[t++].Pow=Pow+b.Data[j++].Pow;
}
n=t;
}
void Poly::TaghsimPoly(int k,Poly a,Poly b)
{
Poly d,e;
p:
if(a.Data[0].Pow>=b.Data[0].Pow)
{
Data[k].Pow=a.Data[0].Pow-b.Data[0].Pow;
Data[k].Coef=a.Data[0].Coef/b.Data[0].Coef;
d.ItemPoly(Data[k].Coef,Data[k].Pow,b);
e.SubtractPoly(a,d);
k++;
}
n=k;
if(e.Data[0].Pow>=b.Data[0].Pow)TaghsimPoly(k,e,b);
else
{
cout<<"\nMod Is : \n";
e.WritePoly();
}
}
void main(void)
{
Poly a,b,c;
char Sign;
a.ReadPoly();
a.SortPoly();
cout<<"\nPlease enter sign(+,-,*,/) : ";
cin>>Sign;
b.ReadPoly();
b.SortPoly();
switch(Sign)
{
case'+':
c.AddPoly(a,b);
break;
case'-':
c.SubtractPoly(a,b);
break;
case'*':
c.MulPoly(a,b);
c.SortPoly();
break;
case'/':
c.TaghsimPoly(0,a,b);
break;
}
cout<<"\n\nAnswer Is : \n";
c.WritePoly();
getche();

adine2020
دوشنبه 27 اردیبهشت 1389, 00:39 صبح
خودم فهمیدم مشکل این یکی چیه
این درستشه

node *help;
node *temp;
help=new node;
help->next=NULL;
while(1)
{
if(first==NULL)
{
first=last=help;
cout<<"\n Enter Data:";
cin>>help->data;
}
else
{
temp=new node;
last->next=temp;
last=temp;
temp->next=NULL;

cout<<"\n Enter Data:";
cin>>last->data;
if((last->data)==NULL)
break;
}
}