Dsi lec9-copy
- 3. Нэг холбоост ба цикл
жагсаалтын бэрхшээл
Нэг холбоост ба цикл жагсаалтуудын хувьд
буцаж өмнөх элемэнтүүдрүүгээ дамжих
боломжгүй байдаг.
Хэрвээ одоогийн идэвхитэй элемэнтийн яг
өмнөх элемэнтрүү хандахын тулд заавал эхний
элемэнтээс/гадаад заагч байрлаж буй
элемэнтээс эхлэн элемэнт бүрт дараалан
хандаж байж тухайн элемэнтэд очно.
Багш: В.Нямсүрэн
- 4. Хоёр холбоост жагсаалт
Жагсаалтын зангилаануудыг хоѐр чиглэлд
холбогддог байхаар зохион байгуулж болно.
Зангилаа бүр нь өмнө болон хойно орших
зангилааныхаа хаягийг агуулдаг элемэнтүүдийн
тогтоцыг хоёр холбоост жагсаалт /ХХЖ/ буюу
давхар жагсаалт гэнэ.
100 56 34 456
Хоѐр холбоост жагсаалт нь хэдийгээр
жагсаалтын дурын элемэнтэд хандах боломжгүй
хэдий ч хоѐр чиглэлтэй учир хийгдэх
үйлдлүүдийн хувьд илүү уян хатан юм.
Багш: В.Нямсүрэн
- 5. Хоёр холбоост жагсаалт
Хоѐр холбоост жагсаалтын эхний элемэнтэд
өмнөх элемэнт, төгсгөлийн элемэнтэд дараагийн
элемэнт гэж байхгүй учраас тэдгээр зангилааны
харгалзах заагч талбарууд нь хоосон буюу NULL
утгыг заавал агуулсан байх ѐстой.
100 56 34 456
Багш: В.Нямсүрэн
- 6. Хоёр холбоост
жагсаалтын зангилаа
Хоѐр холбоост жагсаалтын зангилаа нь гурван
хэсгээс бүрдэнэ.
back – өмнөх элемэнтийн санах ойн
үүрний хаягийг агуулах заагч талбар
456 info – өгөгдөл буюу мэдээллийг
агуулах талбар
next – дараагийн элемэнтийн санах
ойн үүрний хаягийг агуулах заагч талбар
Багш: В.Нямсүрэн
- 7. Хоёр холбоост жагсаалтын
зангилааг илэрхийлэх:
Хоѐр холбоост жагсаалтын зангилааг дараах
DLNode классаар тодорхойлъѐ
class DLNode{
Data info;
DLNode* prev;
DLNode* next;
DLNode(Data ivalue, DLNode*pvalue,
DLNode* nvalue) {
info=ivalue;
prev=pvalue;
next=nvalue;
}
friend class DoubleLinkedList;
};
Багш: В.Нямсүрэн
- 8. Хоёр холбоост жагсаалтыг
зохион байгуулах
Хоѐр холбоост жагсаалтыг зохион байгуулахдаа
дараах гадаад заагчуудыг ашиглана.
хуй
head – эхлэлийн заагч
tail – төгсгөлийн заагч
curr – туслах заагч
Багш: В.Нямсүрэн
- 9. Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
Дараах үйлдлүүдийг хоѐр чиглэлд гүйцэтгэх
боломжтой. /Ө.х эхлэлээс төгсгөлрүү эсвэл
төгсгөлөөс эхлэлрүү/
ХХЖ-ыг хоослох – MakeEmpty()
ХХЖ-аас элемэнт хайх – FindItem()
ХХЖ-ын элемэнтийн тоог буцаах – Count()
ХХЖ-ын элемэнтүүдийг хэвлэх – Print()
Багш: В.Нямсүрэн
- 10. ХХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
class DoubleLinkedList{
DLNode *head;
DLNode *tail;
public:
DoubleLinkedList ();
~DoubleLinkedList ();
bool IsEmpty();
void MakeEmpty();
Data First();
Data Last();
void AddFirst(Data item);
void AddLast (Data item);
void AddAfter(Data key, Data item);
void AddBefore(Data key, Data item);
Багш: В.Нямсүрэн
- 11. ХХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
void AddPosition( int pos, Data item);
void RemoveFirst();
void RemoveLast ();
void RemoveItem(Data key);
void RemoveBefore(Data key);
void RemoveAfter(Data key);
void RemovePosition(int key);
bool FindForward();
bool FindBackward();
int CountForward();
int CountBackward();
void PrintForward();
void PrintBackward();
};
Багш: В.Нямсүрэн
- 21. ХХЖ-ын эхэнд
элемэнт нэмэх
void DoubleLinkedList::AddFirst(Data item){
DLNode *curr=new DLNode(item, NULL, head);
if(IsEmpty())
tail = curr;
else
head->prev = curr;
head = curr;
}
Багш: В.Нямсүрэн
- 23. ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
void DoubleLinkedList::AddBefore(Data key,
Data item){
DLNode *prevCurr = NULL;
DLNode *nextCurr=head;
while(nextCurr->info != key){
prevCurr = nextCurr;
nextCurr=nextCurr->next;
if(nextCurr == NULL)
cout<<"element oldsongui";
}
Багш: В.Нямсүрэн
- 24. ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
if(nextCurr==head){
DLNode* curr = new
DLNode(item,NULL,nextCurr);
nextCurr->prev = curr;
head = curr;
}
else{
DLNode* curr = new
DLNode(item,prevCurr,nextCurr);
prevCurr->next = curr;
nextCurr->prev=curr;
}
}
Багш: В.Нямсүрэн
- 25. ХХЖ-ын эхэнд
элемэнт нэмэх
prevCurr Өгөгдсөн элемэнт: 40
Шинэ элемэнт: 100
nextCurr
head tail
56 36 40 12 456
Багш: В.Нямсүрэн
- 26. ХХЖ-ын эхэнд
элемэнт нэмэх
Өгөгдсөн элемэнт: 40
Шинэ элемэнт: 100
prevCurr nextCurr
head tail
56 36 40 12 456
Багш: В.Нямсүрэн
- 27. ХХЖ-ын эхэнд
элемэнт нэмэх
curr Өгөгдсөн элемэнт: 40
Шинэ элемэнт: 100
100
prevCurr nextCurr
head tail
56 36 40 12 456
Багш: В.Нямсүрэн
- 28. ХХЖ-ын төгсгөлийн
элемэнтийг устгах
void DoubleLinkedList::RemoveLast(){
if(!IsEmpty()){
DLNode* curr = tail;
if(head->next == NULL)
head = NULL;
else{
tail->prev->next = NULL;
tail = tail->prev;
}
delete curr;
}
else cout<<"DoubleLinkedList is empty";
}
Багш: В.Нямсүрэн