Dsi lec8-copy
- 3. Нэг холбоост
жагсаалтын бэрхшээл
Нэг холбоост жагсаалтын зангилаа бүр нь
өмнөх(сүүлчийн элемэнтээс бусад нь) болон
дараагийн(эхний элемэнтээс бусад нь)
зангилаатай байдаг.
Тиймээс нэг холбоост жагсаалтад нэг бэрхшээл
байдаг: Нэг холбоост жагсаалтын аль нэг
зангилаанаас түүний дараагийн бүх зангилаанд
хандаж болох боловч түүний өмнө орших нэг ч
зангилааруу хандаж чадахгүй.
Аливаа зангилаанд хандахын тулд жагсаалтын
эхлэлийн заагчийг ашиглан эхнээс нь дараалан
хандана.
Багш: В.Нямсүрэн
- 4. Цикл жагсаалт
Нэг холбоост жагсаалтын сүүлчийн элемэнтийн
заагч талбар нь NULL утгыг агуулахын оронд
буцаад эхний элемэнтийг зааж байхаар өөрчлөн
зохион байгуулж болно.
Ингэснээр нэг холбоост жагсаалтаас давуу
талтай цикл жагсаалт гэсэн бүтцийг бий болгоно.
Зангилаа бүр нь дараагийн зангилаатай байх
жагсаалтыг цикл жагсаалт /ЦЖ/ гэнэ.
100 56 34 456
Багш: В.Нямсүрэн
- 5. Цикл холбоост жагсаалтын
зангилааг илэрхийлэх:
Цикл холбоост жагсаалтын зангилааг дараах
CLNode классаар тодорхойлъё
class CLNode
{
Data element;
CLNode *next;
CLNode(Data evalue, CLNode *nvalue){
element=evalue;
next=nvalue;
}
friend class CircularLinkedList;
};
Багш: В.Нямсүрэн
- 6. Цикл жагсаалтыг
зохион байгуулах
Цикл жагсаалтын аль ч зангилаанаас эхэлсэн
тухайн жагсаалтын бүх элемэнтээр дамжих
боломжтой.
Гадаад заагчаар эхний элемэнтийг заалгаснаас
сүүлчийн элемэнтийг заалгасан нь давуу талтай.
Ингэснээр эхний болон сүүлчийн хоёр элемэнтэд
аль нь ч шууд хандах боломжтой.
100 56 34 456
Багш: В.Нямсүрэн
- 7. ЦЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
class CircularLinkedList
{
CLNode *listData;
public:
CircularLinkedList ();
~CircularLinkedList ();
bool IsEmpty() ;
void MakeEmpty();
void InsertItem (Data item);
bool FindItem(Data key);
void DeleteItem(Data item);
void Print();
};
Багш: В.Нямсүрэн
- 10. ЦЖ-ыг хоослох
void CircularLinkedList::MakeEmpty(){
CLNode *location=listData;
while (listData->next != listData){
location = listData->next;
listData->next=location->next;
delete location;
}
if(listData->next==listData){
location=listData;
listData=NULL;
delete location;
}
}
Багш: В.Нямсүрэн
- 13. ЦЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
location
listData
56 ... 34 456
Багш: В.Нямсүрэн
- 18. Цикл жагсаалтад
элемэнт нэмэх
void CircularLinkedList::InsertItem(Data item)
{
if(IsEmpty()==true){
CLNode *location=new CLNode(item,location);
location->next=location;
listData=location;
}
else{
CLNode*location=new CLNode(item,listData->next)
listData->next=location;
listData=location;
}
}
Багш: В.Нямсүрэн
- 20. ЦЖ-ын элемэнтүүдийг хэвлэх
void CircularLinkedList::Print(){
if(IsEmpty()==false){
CLNode *location=listData;
cout<<"CircularLinkedList: ";
if(location==listData){
cout<<location->element<<"->";
location=location->next;
}
while(location!=listData){
cout<<location->element<<"->";
location=location->next;
}
cout<<endl;
}else
cout<<"CircularLinkedList is empty"<<endl;
}Багш: В.Нямсүрэн
- 27. ЦЖ-аас өгөгдсөн
элемэнт хайх
bool CircularLinkedList::FindItem(Data key){
if(IsEmpty()==false){
CLNode *location = listData;
while (location->element!=key &&
location->next!=listData)
{
location=location->next;
}
if (location->element == key)
return true;
return false;
}else
return false;
}
Багш: В.Нямсүрэн
- 31. ЦЖ-аас өгөгдсөн
элемэнтийг устгах
void CircularLinkedList::DeleteItem(Data item)
{
if(IsEmpty()==false){
CLNode *predLoc=listData;
CLNode *location=listData;
while(location->element!=item &&
location->next!=listData){
predLoc=location;
location=location->next;
}
if(location->next==listData)
cout<<"Ugugdsun element bhguia bna"<<endl;
Багш: В.Нямсүрэн
- 32. ЦЖ-аас өгөгдсөн
элемэнтийг устгах
else
if(location->element==item){
if(location==listData){
while(predLoc->next!=location)
predLoc=predLoc->next;
listData=listData->next;
}
predLoc->next=location->next;
delete location;
}
}else
cout<<"CircularLinkedList is empty"<<endl;
}
Багш: В.Нямсүрэн