-
لیست پیوندی از اشیا
سلام بر همه
مشکلی دارم گر تو بگشایی بکنم آنچه تو می فرمایی
لطفا به من بگید چرا این کدی که نوشتم درست جواب نمیده آخرشم از c++ میاد بیرون
تا اینجا میدونم که مشکلش اشاره گرایی هست که به جاهای نا مربوط اشاره میکنند و احتمالا نا خداگاه وارد محدوده غیر مجاز رم میشند
فقط نمیدونم کجای کارم اشتباه بوده که این لیست پیوندی از محدوده heap خارج میشه و اینکه جواب صحیح نمیده !؟!:2::2::2:
کد:
#include<iostream.h>
#include <conio.h>
/********************************* Class Word *******************************/
class Word
{
public:
char *English;
char *Farsi;
Word *Next;
};
/****************************** Class ArrayList *******************************/
class ArrayList
{
public:
ArrayList() {Head.Farsi="";Head.English="";Head.Next=NULL;}
void Add(char *,char *);
void Del(char ,char *);
int Search(char ,char *);
void Show();
private:
Word Head;
Word *Address1;
Word *Address2;
};
///////////////////////////// ArrayList::Add /////////////////////////////////
void ArrayList::Add(char *en,char *fa)
{
Word Temp;
Temp.English=en;
Temp.Farsi=fa;
Temp.Next=Head.Next;
Head.Next=&Temp;
}
///////////////////////////// ArrayList::Del /////////////////////////////////
void ArrayList::Del(char ef,char *word)
{
if( Search(ef,word)==1 )
{
Word *Temp;
Temp=Address1;
Address2->Next=Address1->Next;
}// if search was not found
}
///////////////////////////// ArrayList::Search /////////////////////////////////
int ArrayList::Search(char ef,char *word)
{
Word *Temp;
Temp=Head.Next;
if(ef=='e')
{
while(Temp!=NULL)
{
if( Temp->English==word )
{
cout<<"\n\n Finding word is success !!! \n\n";
cout<<"The Emglish word : "<<Temp->English;
cout<<"The Farsi word :"<<Temp->Farsi;
Address1=Temp;
return 1;
} // if find
Address2=Temp;
Temp=Temp->Next;
} // while
cout<<"The word was not found !!! ";
return 0;
} // if English search
if(ef=='f')
{
while(Temp!=NULL)
{
if( Temp->Farsi==word )
{
cout<<"\n\n Finding word is success !!! \n\n";
cout<<"The Emglish word : "<<Temp->English;
cout<<"The Farsi word :"<<Temp->Farsi;
Address1=Temp;
return 1;
} // if find
Address2=Temp;
Temp=Temp->Next;
} // while
cout<<"The word was not found !!! ";
return 0;
}// if Farsi search
cout<<"\n\n Determin if the word is English or Farsi OR Dictionary is not empty !!! \n\n";
return 0;
}
///////////////////////////// ArrayList::Show /////////////////////////////////
void ArrayList::Show()
{
Word *Temp;
Temp=Head.Next;
cout<<"\n\n =========================== ";
while( Temp!=NULL )
{
cout<<"\n English: "<<Temp->English;
cout<<" Farsi:"<<Temp->Farsi;
cout<<"\n --------------------------";
Temp=Temp->Next;
}
cout<<"\n\n =========================== ";
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char Detect()
{
int i;
do{
clrscr();
cout<<"\n 1) English ";
cout<<"\n 2) Farsi";
cout<<"Make your chice: ";
cin>>i;
switch(i)
{
case 1: return 'e';
case 2:return 'f';
}
}while(1);
}
//////////////////////////////////// Main() ///////////////////////////////////
void main()
{
int i;
char *en;
char *fa;
ArrayList Dic;
do{
clrscr();
cout<<"\n 1) Add Item ";
cout<<"\n 2) Delete Item";
cout<<"\n 3) Search";
cout<<"\n 4) Show All";
cout<<"\n 5) Exit";
cout<<"\n\n Make Your Choice: ";
cin>>i;
switch(i)
{
case 1:
clrscr();
cout<<"\n\n Please enter an English word: ";
cin>>en;
cout<<"\n\n Please enter its Farsi meaning: ";
cin>>fa;
cin>>fa;
Dic.Add(en,fa);
break;
case 2:
clrscr();
cout<<"\n\n Please enter the word you want to delete :";
cin>>en;
Dic.Del(Detect(),en);
break;
case 3:
clrscr();
cout<<"\n\n Please enter the word you want to search :";
cin>>en;
Dic.Search(Detect(),en);
break;
case 4:
clrscr();
Dic.Show();
break;
}// switch
}while(i!=5);
}
-
شما برای گرفتن رشته (مثلا en و fa) و شاید جاهای دیگه, اصلا حافظه ای اختصاص ندادین و فقط با پونتری که به هیچ جا اشاره نمیکنه کار کردین که واسه مشکل پیش میاد.
لیست پیوندی بدون استفاده از new عجبیه :D
-
ممنون کمی بهتر شد ! حالا کدم به شکل زیر دراومده ولی هنوز مشکل داره . مشکلشم اینه که مثلا اگه این لیست چهارتا گره داشته باشه وقتی که میخام اطلاعاتم توسط متد show از کلاس ArrayList نمایش داده بشه چهار بار اطلاعات گره آخر ا برام نمایش میده . متدای Delete و Search رو فعلا روش بحثی ندارم مشکلم Add و Show هستش اگه این دوتا درست شه بقیش مشکل نداره . ازتون خاهش میکنم یه نمونه از کار با لیست پیوندی برام بفرستید یا رو همین برنامه بگید من چه کار کنم :11::11::11::10:
در ضمن چاکریماااااااااااااااا
کد:
#include<iostream.h>
#include <conio.h>
/********************************* Class Word *******************************/
class Word
{
public:
Word() { English=new char; Farsi=new char; Next=NULL; }
char *English;
char *Farsi;
Word *Next;
};
/****************************** Class ArrayList *******************************/
class ArrayList
{
public:
ArrayList()
{
Head=new(Word);
Head=NULL;
}
void Add(char *,char *);
void Del(char ,char *);
int Search(char ,char *);
void Show();
private:
Word *Head;
Word *Address1;
Word *Address2;
};
-
کد:
#include<iostream.h>
#include <conio.h>
/********************************* Class Word *******************************/
class Word
{
public:
Word() { English=new char; Farsi=new char; Next=NULL; }
char *English;
char *Farsi;
Word *Next;
};
/****************************** Class ArrayList *******************************/
class ArrayList
{
public:
ArrayList()
{
Head=new(Word);
Head=NULL;
}
void Add(char *,char *);
void Del(char ,char *);
int Search(char ,char *);
void Show();
private:
Word *Head;
Word *Address1;
Word *Address2;
};
///////////////////////////// ArrayList::Add /////////////////////////////////
void ArrayList::Add(char *en,char *fa)
{
Word *Temp;
Temp=new(Word);
Temp->English=en;
Temp->Farsi=fa;
Temp->Next=Head;
Head=Temp;
}
///////////////////////////// ArrayList::Del /////////////////////////////////
void ArrayList::Del(char ef,char *word)
{
if( Search(ef,word)==1 )
{
Word *Temp;
Temp=new(Word);
Temp=Address1;
Address2->Next=Address1->Next;
delete Temp;
}// if search was not found
}
///////////////////////////// ArrayList::Search /////////////////////////////////
int ArrayList::Search(char ef,char *word)
{
Word *Temp;
Temp=new(Word);
Temp=Head;
if(ef=='e')
{
while(Temp!=NULL)
{
if( Temp->English==word )
{
cout<<"\n\n Finding word is success !!! \n\n";
cout<<"The English word : "<<Temp->English;
cout<<" The Farsi word :"<<Temp->Farsi;
Address1=Temp;
delete Temp;
getch();
return 1;
} // if find
Address2=Temp;
Temp=Temp->Next;
} // while
cout<<"The word was not found !!! ";
getch();
delete Temp;
return 0;
} // if English search
if(ef=='f')
{
while(Temp!=NULL)
{
if( Temp->Farsi==word )
{
cout<<"\n\n Finding word is success !!! \n\n";
cout<<"The Emglish word : "<<Temp->English;
cout<<"The Farsi word :"<<Temp->Farsi;
Address1=Temp;
delete Temp;
getch();
return 1;
} // if find
Address2=Temp;
Temp=Temp->Next;
} // while
cout<<"The word was not found !!! ";
delete Temp;
getch();
return 0;
}// if Farsi search
cout<<"\n\n Determin if the word is English or Farsi OR Dictionary is not empty !!! \n\n";
delete Temp;
getch();
return 0;
}
///////////////////////////// ArrayList::Show /////////////////////////////////
void ArrayList::Show()
{
Word *Temp;
Temp=new(Word);
Temp=Head;
cout<<"\n\n =========================== ";
while( Temp!=NULL )
{
cout<<"\n English: "<<Temp->English;
cout<<" Farsi:"<<Temp->Farsi;
cout<<"\n --------------------------";
Temp=Temp->Next;
}
cout<<"\n\n =========================== ";
delete Temp;
getch();
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char Detect()
{
int i;
do{
clrscr();
cout<<"\n 1) English ";
cout<<"\n 2) Farsi";
cout<<"Make your chice: ";
cin>>i;
switch(i)
{
case 1: return 'e';
case 2:return 'f';
}
}while(1);
}
//////////////////////////////////// Main() ///////////////////////////////////
void main()
{
int i;
char *en;
char *fa;
en=new char;
fa=new char;
ArrayList Dic;
do{
clrscr();
cout<<"\n 1) Add Item ";
cout<<"\n 2) Delete Item";
cout<<"\n 3) Search";
cout<<"\n 4) Show All";
cout<<"\n 5) Exit";
cout<<"\n\n Make Your Choice: ";
cin>>i;
switch(i)
{
case 1:
clrscr();
cout<<"\n\n Please enter an English word: ";
cin>>en;
cout<<"\n\n Please enter its Farsi meaning: ";
cin>>fa;
Dic.Add(en,fa);
break;
case 2:
clrscr();
cout<<"\n\n Please enter the word you want to delete :";
cin>>en;
Dic.Del(Detect(),en);
break;
case 3:
clrscr();
cout<<"\n\n Please enter the word you want to search :";
cin>>en;
Dic.Search(Detect(),en);
break;
case 4:
clrscr();
Dic.Show();
break;
}// switch
}while(i!=5);
}
-
من یه linklist دو بعدی دارم .....به دردتون می خوره ؟
(یعنی به جای اینکه مثلا توی کلاس یه data داشته باشید یه linklist دیگه دارید...)
-
اگه برام بذارید لطف بزرگی کردید
ممنون
-
توی این linklist ما سه تا کلاس داریم nod1,nod2,linklist که به ترتیب بعد اول (که توش یه رشته قرار می گیره)وبعد دوم(که توش یه عدده) و کلاس سوم که header لینک لیست را نگه می داره و تابع ها هم توی اونه.....
برنامه از یه فایل به اسم in می خونه....که توی اون فایل اینها قرار دارند:
addlist ali : یعنی یه نود بزرگ درست کن ( مثلا به اسم ali )
addh ali 3: یعنی به نود ali عدد 3 را اضافه کن
dellist ali: یعنی لیست ali رو پاک کن (به همراهه اون نود ها ی کوچیک هم باید پاک شند )
del ali 3:یعنی عدد 3 را از لیست ali پاک کن (البته همه اینها در صورته وجود داشتنه )
rev ali: یعنی لیست عددهای ali رو برعکس کن
print ali: یعنی لیست عدد های ali رو چاپ کن(مثلا اگه قبلش ali رو برعکس کرده باشیدمسلما بر عکسش چاپ میشه)
end:یعنی پایان برنامه....
-
کد:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <iostream>
#include <cstdlib>
#include <string.h>
#pragma warning (disable:4996)
using namespace std;
FILE *f;
//*********************
class nod2
{
friend class linklist;
long number;
nod2* next2;
public:
nod2()
{
next2=NULL;
number=0;
}
};
//*********************
class nod1
{
friend class linklist;
char name[30];
nod1 *next1;
nod2 *first2;
nod2 *last2;
long cnt;
public:
nod1()
{
next1=NULL;
cnt=0;
first2=NULL;
last2=NULL;
}
};
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class linklist
{
public:
linklist();
~linklist();
void addlist(void);
void dellist(void);
nod1* search1(char *);
void addh(void);
nod2 * search2(long int,nod1*);
void print(void);
void del(void);
void rev(void);
private:
nod1 *first1;
nod1 *last1;
};
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
linklist::linklist()
{
first1=NULL;
last1=NULL;
}
linklist list1;
//**********************
linklist::~linklist()
{
while ( first1 )
{
nod2 * t = first1->first2 ;
while ( t )
{
nod2 * tmp = t->next2 ;
delete t ;
t = tmp ;
}
nod1 * tmp = first1->next1 ;
delete first1 ;
first1 = tmp ;
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
nod1* linklist::search1(char *str)
{
nod1 *tmp1=first1;
if(tmp1==NULL)
return NULL;
while(tmp1)
{
if(strcmp(tmp1->name,str)==0)
return tmp1;
else
tmp1=tmp1->next1;
}
return NULL;
}
//*******************
nod2* linklist::search2(long int adad,nod1* tmp)
{
nod2 *tmp2=tmp->first2;
if(tmp2==NULL)
return NULL;
while(tmp2)
{
if(tmp2->number==adad)
return tmp2;
else
tmp2=tmp2->next2;
}
return NULL;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void linklist::addlist()
{
char str[30];
nod1 *ptr1=new nod1;
fscanf(f,"%s",str);
for(int i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
nod1 *tmp1=search1(str);
if(!tmp1)
{
ptr1->next1=NULL;
strcpy(ptr1->name,str);
if(first1==NULL)
{
first1=ptr1;
last1=ptr1;
}
else
{
ptr1->next1=first1;
first1=ptr1;
}
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void linklist::addh()
{
char str[20];
long adad;
nod1 *a1;
nod2 *a2=new nod2;
fscanf(f,"%s%d",str,&adad);
for(int i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
nod1 *tmp1=search1(str);
if(tmp1!=NULL)
{
nod2 *tmp2;
tmp2=search2(adad,tmp1);
if(tmp2==NULL)
{
a1=tmp1;
a2->number=adad;
if(tmp1->first2==NULL)
{
tmp1->first2=a2;
tmp1->last2=a2;
}
else
{
a2->next2=tmp1->first2;
tmp1->first2=a2;
}
a1->cnt++;
}
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void linklist::dellist()
{
char str[20];
nod1 *tmp3=first1;
nod1 *tmp1=first1;
fscanf(f,"%s",str);
for(int i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
while(tmp3)
{
if(strcmp(tmp3->name,str)==0)
if(tmp3==first1)
{
first1=first1->next1;
if(tmp3->first2 )
{
nod2 *tmp2=tmp3->first2 ;
while(tmp2)
{
nod2 *tmp4=tmp2->next2 ;
delete tmp2;
tmp2=tmp4;
}
}
delete tmp3;
break;
}
else
{
if(tmp3==last1)
last1=tmp1;
tmp1->next1=tmp3->next1;
if(tmp3->first2 )
{
nod2 *tmp2=tmp3->first2 ;
while(tmp2)
{
nod2 *tmp4=tmp2->next2 ;
delete tmp2;
tmp2=tmp4;
}
}
delete tmp3;
break;
}
else
{
tmp1=tmp3;
tmp3=tmp3->next1;
}
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void linklist::del()
{
char str[20];
long adad;
fscanf(f,"%s%d",str,&adad);
for(int i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
nod1* tmp1=search1(str);
if(tmp1!=NULL)
{
nod2* tmp4=tmp1->first2;
nod2 *tmp2=tmp1->first2;
while(tmp4)
{
if(tmp4->number==adad)
if(tmp4==tmp1->first2)
{
tmp1->first2=tmp1->first2->next2;
delete tmp4;
tmp1->cnt--;
break;
}
else
{
if(tmp4==tmp1->last2)
tmp1->last2=tmp2;
tmp2->next2=tmp4->next2;
delete tmp4;
tmp1->cnt--;
break;
}
else
{
tmp2=tmp4;
tmp4=tmp4->next2;
}
}
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void linklist::print()
{
char str[20];
fscanf(f,"%s",str);
for(int i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
nod1 *tmp1=search1(str);
if(tmp1!=NULL)
{
nod2 *tmp2=tmp1->first2;
while(tmp2)
{
printf("%d\n",tmp2->number);
tmp2=tmp2->next2;
}
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void linklist::rev()
{
char str[20];
long i=0;
fscanf(f,"%s",str);
nod1 *tmp1=search1(str);
for(i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
if(tmp1)
{
nod2 *tmp2=tmp1->first2;
nod2 *tmp4=tmp1->first2;
long *ary=new long [tmp1->cnt];
while(tmp2)
{
ary[i]=tmp2->number;
tmp2=tmp2->next2;
++i;
}
i--;
while(tmp4)
{
tmp4->number=ary[i];
tmp4=tmp4->next2;
--i;
}
delete[]ary;
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
int main(void)
{
int i=0;
char str [20];
f=fopen("in.txt","r");
if(f==NULL)
{
printf("cant open file");
return 0;
}
while(fscanf(f,"%s",strlwr(str))!=-1)
{
for(i=0;i<=strlen(str);++i)
str[i]=tolower(str[i]);
if(strcmp(str,"addlist")==0)
list1.addlist();
if(strcmp(str,"addh")==0)
list1.addh();
if(strcmp(str,"dellist")==0)
list1.dellist();
if(strcmp(str,"del")==0)
list1.del();
if(strcmp(str,"print")==0)
list1.print();
if(strcmp(str,"rev")==0)
list1.rev();
if(strcmp(str,"end")==0)
{
fclose(f);
return 0;
}
}
return 0;
}
-
ممنون از راهنماییتون برم ببینم چی نوشته D:
-
ممنون اشکالم اینجا بود که از تابع strcpy استفاده نمی کردم فکر کردم مثل vb هستش یادم نبود اینجه ++c هست