SlideShare a Scribd company logo
1 of 38
LOGO
Лекц №9
Хоёр холбоост жагсаалт
Хичээлийн агуулга
Нэг холбоост ба цикл
жагсаалтын бэрхшээл
 Нэг холбоост ба цикл жагсаалтуудын хувьд
буцаж өмнөх элемэнтүүд рүүгээ дамжих
боломжгүй байдаг.
 Хэрвээ одоогийн идэвхитэй элемэнтийн яг
өмнөх элемэнтрүү хандахын тулд заавал эхний
элемэнтээс/гадаад заагч байрлаж буй
элемэнтээс эхлэн элемэнт бүрт дараалан
хандаж байж тухайн элемэнтэд очно.
 Жагсаалтын зангилаануудыг хоёр чиглэлд
холбогддог байхаар зохион байгуулж болно.
 Зангилаа бүр нь өмнө болон хойно орших
зангилааныхаа хаягийг агуулдаг элемэнтүүдийн
тогтоцыг хоёр холбоост жагсаалт /ХХЖ/ буюу
давхар жагсаалт гэнэ.
 Хоёр холбоост жагсаалт нь хэдийгээр
жагсаалтын дурын элемэнтэд хандах боломжгүй
хэдий ч хоёр чиглэлтэй учир хийгдэх
үйлдлүүдийн хувьд илүү уян хатан юм.
Хоёр холбоост жагсаалт
45634100 56
 Хоёр холбоост жагсаалтын эхний элемэнтэд
өмнөх элемэнт, төгсгөлийн элемэнтэд дараагийн
элемэнт гэж байхгүй учраас тэдгээр зангилааны
харгалзах заагч талбарууд нь хоосон буюу NULL
утгыг заавал агуулсан байх ёстой.
Хоёр холбоост жагсаалт
100 56 34 456
 Хоёр холбоост жагсаалтын зангилаа нь гурван
хэсгээс бүрдэнэ.
Хоёр холбоост
жагсаалтын зангилаа
back – өмнөх элемэнтийн санах ойн
үүрний хаягийг агуулах заагч талбар
info – өгөгдөл буюу мэдээллийг
агуулах талбар
next – дараагийн элемэнтийн санах
ойн үүрний хаягийг агуулах заагч талбар
456
 Хоёр холбоост жагсаалтын зангилааг дараах
DLNode классаар тодорхойлъё
class DLNode{
Data info;
DLNode* prev;
DLNode* next;
DLNode(Data ivalue, DLNode*pvalue=NULL,
DLNode* nvalue=NULL) {
info=ivalue;
prev=pvalue;
next=nvalue;
}
friend class DoubleLinkedList;
};
Хоёр холбоост жагсаалтын
зангилааг илэрхийлэх:
 Хоёр холбоост жагсаалтыг зохион байгуулахдаа
дараах гадаад заагчуудыг ашиглана.
 хуй
Хоёр холбоост жагсаалтыг
зохион байгуулах
head – эхлэлийн заагч
tail – төгсгөлийн заагч
curr – туслах заагч
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
ХХЖ-д
элемэнт
нэмж
оруулах
Жагсаалтын эхэнд
элемэнт нэмэх
AddFirst()
Жагсаалтын дунд
элемэнт нэмэх
Өгөгдсөн элемэнтийн
өмнө
AddBefore()
Өгөгдсөн элемэнтийн
хойно
AddAfter()
Өгөгдсөн байрлалд
AddPosition()
Жагсаалтын
төгсгөлд элемэнт
нэмэх
AddLast()
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
ХХЖ-аас
элемэнт
устгах
Жагсаалтын
эхлэлээс устггах
RemoveFirst()
Жагсаалтын
дундаас устгах
Өгөгдсөн элемэнтийн
өмнөх
RemoveBefore()
Өгөгдсөн элемэнтийн
ардах
RemoveAfter()
Өгөгдсөн байрлал
дахь
RemovePosition()
Өгөгдсөн утгатай
RemoveItem()
Жагсаалтын
төгсгөлөөс
устгах
RemoveLast()
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
ХХЖ-ыг хоослох – MakeEmpty()
ХХЖ-аас элемэнт хайх – FindItem()
ХХЖ-ын элемэнтийн тоог буцаах – Count()
ХХЖ-ын элемэнтүүдийг хэвлэх – Print()
 Дараах үйлдлүүдийг хоёр чиглэлд гүйцэтгэх
боломжтой. /Ө.х эхлэлээс төгсгөлрүү эсвэл
төгсгөлөөс эхлэлрүү/
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
ХХЖ хоосон эсэхийг шалгах – IsEmpty()
ХХЖ-ын эхний элемэнтийн утгыг буцаах –
First()
ХХЖ-ын төгсгөлийн элемэнтийн утгыг буцаах–
Last()
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);
ХХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
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();
};
ХХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
DoubleLinkedList::DoubleLinkedList()
{
head=tail=NULL;
}
Тайлбар:
DoubleLinkedList DList;
// DList нэртэй хоёр холбоост жагсаалт үүсгэж
байна.
ХХЖ-ыг үүсгэх
байгуулагч функц:
head tail
DoubleLinkedList::~DoubleLinkedList(){
MakeEmpty();
}
ХХЖ-ыг санах ойгоос
чөлөөлөх устгагч функц:
void DoubleLinkedList::MakeEmpty()
{
DLNode *curr=NULL;
while (tail!=NULL)
{
if(tail==head) head=head->prev;
curr = tail;
tail = tail->prev;
delete curr;
}
tail = NULL;
}
ХХЖ-ыг хоослох
Тайлбар:
 Устгагч функц нь MakeEmpty() функцийг
дуудна.
 MakeEmpty() функц нь үүсгэсэн цикл
жагсаалтын элемэнтүүдийг санах ойгоос чөлөөлөх
буюу цикл жагсаалтыг хоослоно.
 MakeEmpty() функц нь туслах заагч/curr/-ийг
ашиглан эхлэлийн элемэнтээс эхлэн
элемэнтүүдийг нэг нэгээр санах ойгоос чөлөөлнө.
 Бүх элемэнтүүдийг чөлөөлсний дараа хоосон
хоёр холбоост жагсаалт үлдэнэ.
ХХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
ХХЖ-ыг хоослох
100 56 34 456
curr
head tail
ХХЖ-ыг хоослох
100 56 34 456
curr
head tail
ХХЖ-ыг хоослох
100 56 34
currhead tail
ХХЖ-ыг хоослох
100 56
currhead tail
ХХЖ-ыг хоослох
100
currheadtail
ХХЖ-ыг хоослох
currheadtail
Хоёр холбоост жагсаалт
Устгагч функц:
Тайлбар:
Устгагч функц нь байгуулагч функцээр болон
тухайн хийсвэр төрлөөр санах ойд
хуваарилагсдсан хувьсагчдыг санах ойгоос
чөлөөлнө.
currheadtail
bool DoubleLinkedList::IsEmpty(){
if ( head == NULL && tail==NULL)
return true;
return false;
}
Тайлбар:
Эхлэлийн заагч /head/ болон төгсгөлийн заагч
/tail/-ууд нь хоосон/NULL/ утгатай бол хоёр
холбоост жагсаалт хоосон байна буюу true утга,
хоосон/NULL/-оос ялгаатай бол хоосон биш буюу
false утга буцаана.
ХХЖ-ыг хоосон
эсэхийг шалгах
void DoubleLinkedList::AddFirst(Data item){
DLNode *curr=new DLNode(item, NULL, head);
if(IsEmpty())
tail = curr;
else
head->prev = curr;
head = curr;
}
ХХЖ-ын эхэнд
элемэнт нэмэх
Тайлбар:
1. Шинэ элемэнтийг санах ойд хуваарилах ба уг
зангилааны өмнөх элемэнтийг заах заагч
талбараар хоосон/NULL/- ыг заалган, дараагийн
элемэнтийг заах заагч талбараар эхлэлтийг
заагчийн зааж буй утгыг заалгана.
2. ХХЖ хоосон эсэхийг шалгана.
2. А. Хэрвээ ХХЖ хоосон бол төгсгөлийн заагчийг
шинэ элемэнтэд шилжүүлнэ.
2. B. Харин ХХЖ хоосон биш бол эхний
элемэнтийн өмнөх элемэнтийг заах заагч
талбараар шинэ элемэнтийг заалгана.
3. Эхлэлийн заагчийг шинэ элемэнтэд шилжүүлнэ.
ХХЖ-ын эхэнд
элемэнт нэмэх
ХХЖ-ын эхэнд
элемэнт нэмэх
curr head tail
head tailcurr
100 56 ... 456
100
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";
}
ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
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;
}
}
ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
Тайлбар:
1. Өгөгдсөн элемэнтийн хайна. Үүний тулд
nextCurr/өгөгдсөн элемэнтийг олоход
ашиглана/, prevCurr/nextCurr заагчийн зааж
байгаа зангилааны өмнөх элемэнтийг заана/
заагчуудыг ашиглана.
2. nextCurr заагчийн утгыг шалгана.
2.А. Хэрвээ NULL-тай тэнцүү бол өгөгдсөн элемэнт
байхгүй буюу элемэнт оруулах боломжгүй.
2.B. Хэрвээ head заагчтай тэнцүү бол жагсаалтын
эхэнд элемэнт нэмэх үйлдлийг гүйцэтгэнэ.
ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
Тайлбар:
2.C. Дээрх хоёр нөхцөлийн аль нь ч биелэхгүй бол
шинэ элемэнтийг өгөгдсөн байрлалд оруулна/curr
заагчаар заалгана/. Үүний түлд:
1. Шинэ элемэнтийн өмнөх элемэнтийг заах
заагчаар prevCurr заагчийн зааж байгаа
элемэнтийг, дараагийн элемэнтийг заах заагчаар
nextCurr заагчийн зааж байгаа элемэнтийг
заалгана.
2. prevCurr заагчийн зааж байгаа элемэнтийн
дараагийн элемэнтийг заах заагч талбараар
шинэ элемэнтийг заалгана.
3. nextCurr заагчийн зааж байгаа элемэнтийн өмнөх
элемэнтийг заах заагч талбараар шинэ
элемэнтийг заалгана.
ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
ХХЖ-ын эхэнд
элемэнт нэмэх
head tail
56 12 45636 40
nextCurr
prevCurr Өгөгдсөн элемэнт: 40
Шинэ элемэнт: 100
ХХЖ-ын эхэнд
элемэнт нэмэх
head tail
56 12 45636 40
prevCurr nextCurr
Өгөгдсөн элемэнт: 40
Шинэ элемэнт: 100
ХХЖ-ын эхэнд
элемэнт нэмэх
head tail
curr
100
56 12 45636 40
prevCurr nextCurr
Өгөгдсөн элемэнт: 40
Шинэ элемэнт: 100
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";
}
ХХЖ-ын төгсгөлийн
элемэнтийг устгах
Тайлбар:
1. ХХЖагсаалт хоосон эсэхийг шалгана.
2. А. ХХЖ хоосон бол DoubleLinkedList is empty
мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2.1. Туслах заагч/curr/-ийг зарлан, түүгээр төгсгөлийн
зангилааг заалгана.
ХХЖ-ын төгсгөлийн
элемэнтийг устгах

More Related Content

What's hot (20)

Өгөгдлийн бүтэц 10
Өгөгдлийн бүтэц 10Өгөгдлийн бүтэц 10
Өгөгдлийн бүтэц 10
 
массив
массивмассив
массив
 
Datastructure algoritm
Datastructure algoritmDatastructure algoritm
Datastructure algoritm
 
U.cs101 алгоритм программчлал-1(1)
U.cs101   алгоритм программчлал-1(1)U.cs101   алгоритм программчлал-1(1)
U.cs101 алгоритм программчлал-1(1)
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд
 
U.cs101 алгоритм программчлал-10
U.cs101   алгоритм программчлал-10U.cs101   алгоритм программчлал-10
U.cs101 алгоритм программчлал-10
 
Өгөгдлийн бүтэц 2-3
Өгөгдлийн бүтэц 2-3Өгөгдлийн бүтэц 2-3
Өгөгдлийн бүтэц 2-3
 
C cons
C consC cons
C cons
 
тооллын сис 10т 2т
тооллын сис 10т 2ттооллын сис 10т 2т
тооллын сис 10т 2т
 
It101 lec6 10.06
It101 lec6 10.06It101 lec6 10.06
It101 lec6 10.06
 
Lesson 7
Lesson 7Lesson 7
Lesson 7
 
Sw203 Lecture5 Class Acess Modifiers
Sw203 Lecture5 Class Acess ModifiersSw203 Lecture5 Class Acess Modifiers
Sw203 Lecture5 Class Acess Modifiers
 
Day 1 database
Day 1   databaseDay 1   database
Day 1 database
 
U.cs101 алгоритм программчлал-3
U.cs101   алгоритм программчлал-3U.cs101   алгоритм программчлал-3
U.cs101 алгоритм программчлал-3
 
өгөгдлийн сан
өгөгдлийн санөгөгдлийн сан
өгөгдлийн сан
 
Sw203 Lecture8 Interface
Sw203 Lecture8 InterfaceSw203 Lecture8 Interface
Sw203 Lecture8 Interface
 
тооллын систем
тооллын системтооллын систем
тооллын систем
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 
U.cs101 lecture 6
U.cs101   lecture 6U.cs101   lecture 6
U.cs101 lecture 6
 
Algebr ba-geometr-n2-haritsaa
Algebr ba-geometr-n2-haritsaaAlgebr ba-geometr-n2-haritsaa
Algebr ba-geometr-n2-haritsaa
 

More from International Ulaanbaatar University (20)

Lec8
Lec8 Lec8
Lec8
 
Lec7
Lec7 Lec7
Lec7
 
Lec5 6
Lec5 6 Lec5 6
Lec5 6
 
Lec4
Lec4 Lec4
Lec4
 
Lec3
Lec3 Lec3
Lec3
 
Lec2
Lec2 Lec2
Lec2
 
Lec1
Lec1 Lec1
Lec1
 
Визуаль програмчлал бие даалт
Визуаль програмчлал бие даалтВизуаль програмчлал бие даалт
Визуаль програмчлал бие даалт
 
ОХШЗ - Бие Даалт
ОХШЗ - Бие ДаалтОХШЗ - Бие Даалт
ОХШЗ - Бие Даалт
 
Ood lesson12.1 ---------
Ood lesson12.1  ---------Ood lesson12.1  ---------
Ood lesson12.1 ---------
 
Ood lesson11 sequence
Ood lesson11 sequenceOod lesson11 sequence
Ood lesson11 sequence
 
Ood lesson10 statechart
Ood lesson10 statechartOod lesson10 statechart
Ood lesson10 statechart
 
Ood lesson9 activity
Ood lesson9 activityOod lesson9 activity
Ood lesson9 activity
 
Ood lesson7,8 class
Ood lesson7,8 classOod lesson7,8 class
Ood lesson7,8 class
 
Ood lesson6 class
Ood lesson6 classOod lesson6 class
Ood lesson6 class
 
Ood lesson5
Ood lesson5Ood lesson5
Ood lesson5
 
Ood lesson4
Ood lesson4Ood lesson4
Ood lesson4
 
Ood lesson3
Ood lesson3Ood lesson3
Ood lesson3
 
Ood lesson2
Ood lesson2Ood lesson2
Ood lesson2
 
Ood lesson1
Ood lesson1Ood lesson1
Ood lesson1
 

Өгөгдлийн бүтэц 8,9

  • 3. Нэг холбоост ба цикл жагсаалтын бэрхшээл  Нэг холбоост ба цикл жагсаалтуудын хувьд буцаж өмнөх элемэнтүүд рүүгээ дамжих боломжгүй байдаг.  Хэрвээ одоогийн идэвхитэй элемэнтийн яг өмнөх элемэнтрүү хандахын тулд заавал эхний элемэнтээс/гадаад заагч байрлаж буй элемэнтээс эхлэн элемэнт бүрт дараалан хандаж байж тухайн элемэнтэд очно.
  • 4.  Жагсаалтын зангилаануудыг хоёр чиглэлд холбогддог байхаар зохион байгуулж болно.  Зангилаа бүр нь өмнө болон хойно орших зангилааныхаа хаягийг агуулдаг элемэнтүүдийн тогтоцыг хоёр холбоост жагсаалт /ХХЖ/ буюу давхар жагсаалт гэнэ.  Хоёр холбоост жагсаалт нь хэдийгээр жагсаалтын дурын элемэнтэд хандах боломжгүй хэдий ч хоёр чиглэлтэй учир хийгдэх үйлдлүүдийн хувьд илүү уян хатан юм. Хоёр холбоост жагсаалт 45634100 56
  • 5.  Хоёр холбоост жагсаалтын эхний элемэнтэд өмнөх элемэнт, төгсгөлийн элемэнтэд дараагийн элемэнт гэж байхгүй учраас тэдгээр зангилааны харгалзах заагч талбарууд нь хоосон буюу NULL утгыг заавал агуулсан байх ёстой. Хоёр холбоост жагсаалт 100 56 34 456
  • 6.  Хоёр холбоост жагсаалтын зангилаа нь гурван хэсгээс бүрдэнэ. Хоёр холбоост жагсаалтын зангилаа back – өмнөх элемэнтийн санах ойн үүрний хаягийг агуулах заагч талбар info – өгөгдөл буюу мэдээллийг агуулах талбар next – дараагийн элемэнтийн санах ойн үүрний хаягийг агуулах заагч талбар 456
  • 7.  Хоёр холбоост жагсаалтын зангилааг дараах DLNode классаар тодорхойлъё class DLNode{ Data info; DLNode* prev; DLNode* next; DLNode(Data ivalue, DLNode*pvalue=NULL, DLNode* nvalue=NULL) { info=ivalue; prev=pvalue; next=nvalue; } friend class DoubleLinkedList; }; Хоёр холбоост жагсаалтын зангилааг илэрхийлэх:
  • 8.  Хоёр холбоост жагсаалтыг зохион байгуулахдаа дараах гадаад заагчуудыг ашиглана.  хуй Хоёр холбоост жагсаалтыг зохион байгуулах head – эхлэлийн заагч tail – төгсгөлийн заагч curr – туслах заагч
  • 9. Нэг холбоост жагсаалтад хийгдэх үйлдлүүд ХХЖ-д элемэнт нэмж оруулах Жагсаалтын эхэнд элемэнт нэмэх AddFirst() Жагсаалтын дунд элемэнт нэмэх Өгөгдсөн элемэнтийн өмнө AddBefore() Өгөгдсөн элемэнтийн хойно AddAfter() Өгөгдсөн байрлалд AddPosition() Жагсаалтын төгсгөлд элемэнт нэмэх AddLast()
  • 10. Нэг холбоост жагсаалтад хийгдэх үйлдлүүд ХХЖ-аас элемэнт устгах Жагсаалтын эхлэлээс устггах RemoveFirst() Жагсаалтын дундаас устгах Өгөгдсөн элемэнтийн өмнөх RemoveBefore() Өгөгдсөн элемэнтийн ардах RemoveAfter() Өгөгдсөн байрлал дахь RemovePosition() Өгөгдсөн утгатай RemoveItem() Жагсаалтын төгсгөлөөс устгах RemoveLast()
  • 11. Нэг холбоост жагсаалтад хийгдэх үйлдлүүд ХХЖ-ыг хоослох – MakeEmpty() ХХЖ-аас элемэнт хайх – FindItem() ХХЖ-ын элемэнтийн тоог буцаах – Count() ХХЖ-ын элемэнтүүдийг хэвлэх – Print()  Дараах үйлдлүүдийг хоёр чиглэлд гүйцэтгэх боломжтой. /Ө.х эхлэлээс төгсгөлрүү эсвэл төгсгөлөөс эхлэлрүү/
  • 12. Нэг холбоост жагсаалтад хийгдэх үйлдлүүд ХХЖ хоосон эсэхийг шалгах – IsEmpty() ХХЖ-ын эхний элемэнтийн утгыг буцаах – First() ХХЖ-ын төгсгөлийн элемэнтийн утгыг буцаах– Last()
  • 13. 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); ХХЖ-ыг илэрхийлэх хийсвэр төрлийг тодорхойлох
  • 14. 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(); }; ХХЖ-ыг илэрхийлэх хийсвэр төрлийг тодорхойлох
  • 15. DoubleLinkedList::DoubleLinkedList() { head=tail=NULL; } Тайлбар: DoubleLinkedList DList; // DList нэртэй хоёр холбоост жагсаалт үүсгэж байна. ХХЖ-ыг үүсгэх байгуулагч функц: head tail
  • 17. void DoubleLinkedList::MakeEmpty() { DLNode *curr=NULL; while (tail!=NULL) { if(tail==head) head=head->prev; curr = tail; tail = tail->prev; delete curr; } tail = NULL; } ХХЖ-ыг хоослох
  • 18. Тайлбар:  Устгагч функц нь MakeEmpty() функцийг дуудна.  MakeEmpty() функц нь үүсгэсэн цикл жагсаалтын элемэнтүүдийг санах ойгоос чөлөөлөх буюу цикл жагсаалтыг хоослоно.  MakeEmpty() функц нь туслах заагч/curr/-ийг ашиглан эхлэлийн элемэнтээс эхлэн элемэнтүүдийг нэг нэгээр санах ойгоос чөлөөлнө.  Бүх элемэнтүүдийг чөлөөлсний дараа хоосон хоёр холбоост жагсаалт үлдэнэ. ХХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц:
  • 19. ХХЖ-ыг хоослох 100 56 34 456 curr head tail
  • 20. ХХЖ-ыг хоослох 100 56 34 456 curr head tail
  • 25. Хоёр холбоост жагсаалт Устгагч функц: Тайлбар: Устгагч функц нь байгуулагч функцээр болон тухайн хийсвэр төрлөөр санах ойд хуваарилагсдсан хувьсагчдыг санах ойгоос чөлөөлнө. currheadtail
  • 26. bool DoubleLinkedList::IsEmpty(){ if ( head == NULL && tail==NULL) return true; return false; } Тайлбар: Эхлэлийн заагч /head/ болон төгсгөлийн заагч /tail/-ууд нь хоосон/NULL/ утгатай бол хоёр холбоост жагсаалт хоосон байна буюу true утга, хоосон/NULL/-оос ялгаатай бол хоосон биш буюу false утга буцаана. ХХЖ-ыг хоосон эсэхийг шалгах
  • 27. void DoubleLinkedList::AddFirst(Data item){ DLNode *curr=new DLNode(item, NULL, head); if(IsEmpty()) tail = curr; else head->prev = curr; head = curr; } ХХЖ-ын эхэнд элемэнт нэмэх
  • 28. Тайлбар: 1. Шинэ элемэнтийг санах ойд хуваарилах ба уг зангилааны өмнөх элемэнтийг заах заагч талбараар хоосон/NULL/- ыг заалган, дараагийн элемэнтийг заах заагч талбараар эхлэлтийг заагчийн зааж буй утгыг заалгана. 2. ХХЖ хоосон эсэхийг шалгана. 2. А. Хэрвээ ХХЖ хоосон бол төгсгөлийн заагчийг шинэ элемэнтэд шилжүүлнэ. 2. B. Харин ХХЖ хоосон биш бол эхний элемэнтийн өмнөх элемэнтийг заах заагч талбараар шинэ элемэнтийг заалгана. 3. Эхлэлийн заагчийг шинэ элемэнтэд шилжүүлнэ. ХХЖ-ын эхэнд элемэнт нэмэх
  • 29. ХХЖ-ын эхэнд элемэнт нэмэх curr head tail head tailcurr 100 56 ... 456 100
  • 30. 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"; } ХХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах
  • 31. 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; } } ХХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах
  • 32. Тайлбар: 1. Өгөгдсөн элемэнтийн хайна. Үүний тулд nextCurr/өгөгдсөн элемэнтийг олоход ашиглана/, prevCurr/nextCurr заагчийн зааж байгаа зангилааны өмнөх элемэнтийг заана/ заагчуудыг ашиглана. 2. nextCurr заагчийн утгыг шалгана. 2.А. Хэрвээ NULL-тай тэнцүү бол өгөгдсөн элемэнт байхгүй буюу элемэнт оруулах боломжгүй. 2.B. Хэрвээ head заагчтай тэнцүү бол жагсаалтын эхэнд элемэнт нэмэх үйлдлийг гүйцэтгэнэ. ХХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах
  • 33. Тайлбар: 2.C. Дээрх хоёр нөхцөлийн аль нь ч биелэхгүй бол шинэ элемэнтийг өгөгдсөн байрлалд оруулна/curr заагчаар заалгана/. Үүний түлд: 1. Шинэ элемэнтийн өмнөх элемэнтийг заах заагчаар prevCurr заагчийн зааж байгаа элемэнтийг, дараагийн элемэнтийг заах заагчаар nextCurr заагчийн зааж байгаа элемэнтийг заалгана. 2. prevCurr заагчийн зааж байгаа элемэнтийн дараагийн элемэнтийг заах заагч талбараар шинэ элемэнтийг заалгана. 3. nextCurr заагчийн зааж байгаа элемэнтийн өмнөх элемэнтийг заах заагч талбараар шинэ элемэнтийг заалгана. ХХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах
  • 34. ХХЖ-ын эхэнд элемэнт нэмэх head tail 56 12 45636 40 nextCurr prevCurr Өгөгдсөн элемэнт: 40 Шинэ элемэнт: 100
  • 35. ХХЖ-ын эхэнд элемэнт нэмэх head tail 56 12 45636 40 prevCurr nextCurr Өгөгдсөн элемэнт: 40 Шинэ элемэнт: 100
  • 36. ХХЖ-ын эхэнд элемэнт нэмэх head tail curr 100 56 12 45636 40 prevCurr nextCurr Өгөгдсөн элемэнт: 40 Шинэ элемэнт: 100
  • 37. 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"; } ХХЖ-ын төгсгөлийн элемэнтийг устгах
  • 38. Тайлбар: 1. ХХЖагсаалт хоосон эсэхийг шалгана. 2. А. ХХЖ хоосон бол DoubleLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2.1. Туслах заагч/curr/-ийг зарлан, түүгээр төгсгөлийн зангилааг заалгана. ХХЖ-ын төгсгөлийн элемэнтийг устгах