SlideShare a Scribd company logo
1 of 143
LOGO
Лекц №6,7
Нэг холбоост жагсаалт
Хичээлийн агуулга
Жагсаалт
 Элемэнтүүд нь санах ойд дэс дараалан байрлах
албагүй бөгөөд элемэнтүүд нь санах ойд
динамикаар үүсдэг шугаман зохион
байгуулалттай элемэнтүүдийн олонлогийг
жагсаалт гэнэ.
 Динамикаар үүссэн элемэнтүүдийн дарааллыг
холбоос буюу заагчаар тодорхойлдог.
Жагсаалтын ангилал
Жагсаалтыг холбоосоор нь дараах
байдлаар ангилдаг:
Нэг холбоост жагсаалт
/Singly Linked List/
Цикл жагсаалт /Circular
Linked List
Давхар холбоост жагсаалт
/Doubly Linked List/
Өгөгдөл
Нэг холбоост жагсаалт
 Нэг холбоост жагсаалтын элемэнт буюу
зангилаа нь өгөгдөл ба холбоос/заагч/ гэсэн
хоёр хэсгээс тогтоно.
100
100
 Зангилаа бүрийн заагч нь дараачийн зангилааг
заадаг өгөгдлүүдийн цэгцлэгдсэн тогтоцыг нэг
холбоост жагсаалт /НХЖ/ буюу шугаман
жагсаалт гэнэ.
 Өөрөөр хэлбэл дэс дараалан ар араасаа
холбогдсон элемэнтүүдийн тогтоц юм.
Нэг холбоост жагсаалт
100 56 34 456
 Жагсаалтын зангилааны өгөгдөл нь өгөгдөл
буюу утгыг агуулах бөгөөд тухайн утгын төрөл
бүхэл тоо, бодит тоо, тэмдэгт мөр зэрэг үндсэн
өгөгдлийн төрлүүдээс гадна хэрэглэгийн
тодорхойлсон ямар ч төрөлтэй байж болно.
 typedef int Data;
 typedef char Data;
Нэг холбоост жагсаалт
100 56 34 456
c k a d
 Жагсаалтын зангилааны холбоос буюу заагч нь
дараачийн зангилааг заах буюу санах ойн
үүрний хаягийг агуулах учраас заах зангилааны
төрөлтэй ижил төрлийнх байна.
 Жагсаалтын хамгийн сүүлийн зангилааны заагч
нь NULL гэсэн утгыг заавал агуулсан байх ёстой
Нэг холбоост жагсаалт
100 56 34 456
 Нэг холбоост жагсаалтын зангилааг дараах
SLNode классаар тодорхойлъё
class SLNode{
Data element;
SLNode *next;
SLNode(Data evalue;SLNode* nvalue)
{
element=evalue; next=nvalue;
}
friend class SinglyLinkedList;
};
Нэг холбоост жагсаалтын
зангилааг илэрхийлэх:
Data element; Өгөгдөл агуулах талбар
SLNode *next; Дараагийн зангилааг
заах заагч талбар
Нэг холбоост жагсаалтын
зангилааг илэрхийлэх:
100
100
SLNode
100
SLNode
100
SLNode
 Нэг холбоост жагсаалтад дараах гадаад заагчуудыг
тодорхойлж, ашиглах шаардлагатай
1. Жагсаалтын эхний зангилааны санах ойн
үүрний хаягийг агуулах толгой заагч буюу
эхлэл заагч юм. Нэг холбоост жагсаалтын
аливаа зангилаанд хүрэхийн тулд жагсаалтын
эхний зангилаанаас эхлэн холбоосуудын
тусламжтайгаар дараалан хандаж хүссэн
зангилаагаа олж авдаг. Иймд толгой буюу эхлэл
заагч нь ямагт жагсаалтын эхний зангилааг зааж
байх ёстой.
Нэг холбоост жагсаалтыг
зохион байгуулах
100 56 34 456
2. Жагсаалтын төгсгөлийн зангилааны санах
ойн үүрний хаягийг агуулах сүүл заагч буюу
төгсгөл заагч юм. Энэ заагчийн
тусламжтайгаар жагсаалтын төгсгөл
хязгаарлагдана. Иймд сүүл буюу төгсгөл
заагч нь ямагт жагсаалтын төгсгөлийн
зангилааг зааж байх ёстой.
Нэг холбоост жагсаалтыг
зохион байгуулах
100 56 34 456
3. Идэвхтэй элемэнтийн санах ойн үүрний
хаягийг агуулах идэвхтэй элемэнтийн
заагч буюу туслах заагч. Энэ заагчийн
тусламжтайгаар жагсаалтад хийгдэх
үйлдлүүдийг гүйцэтгэнэ. Тиймээс энэхүү
заагчид тогтсон байрлал байхгүй бөгөөд
тухайн эгшинд идэвхтэй байх элемэнтийг
заана.
Нэг холбоост жагсаалтыг
зохион байгуулах
100 56 34 456
НХЖ-д
элемэнт
нэмж
оруулах
Жагсаалтын эхэнд
элемэнт нэмэх
InsertFirst()
Жагсаалтын дунд
элемэнт нэмэх
Өгөгдсөн элемэнтийн
өмнө
InsertBefore()
Өгөгдсөн элемэнтийн
хойно
InsertAfter()
Өгөгдсөн байрлалд
InsertPosition()
Жагсаалтын
төгсгөлд элемэнт
нэмэх
InsertLast()
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
НХЖ-аас
элемэнт
устгах
Жагсаалтын
эхлэлээс устггах
DeleteFirst()
Жагсаалтын
дундаас устгах
Өгөгдсөн элемэнтийн
өмнөх
DeleteBefore()
Өгөгдсөн элемэнтийн
ардах
DeleteAfter()
Өгөгдсөн байрлал
дахь
DeletePosition()
Өгөгдсөн утгатай
DeleteItem()
Жагсаалтын
төгсгөлөөс
устгах
DeleteLast()
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
НХЖ-аас элемэнт хайх – FindItem()
НХЖ хоосон эсэхийг шалгах – IsEmpty()
НХЖ-ыг хоослох – MakeEmpty()
НХЖ-ын эхний элемэнтийн утгыг буцаах –
First()
Жагсаалтын төгсгөлийн элемэнтийн утгыг буцаах–
Last()
Жагсаалтын элемэнтийн тоог буцаах – Count()
Жагсаалтын элемэнтүүдийг хэвлэх – Print()
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
class SinglyLinkedList
{
SLNode *head;
SLNode *tail;
public:
SinglyLinkedList ();
~SinglyLinkedList ();
bool IsEmpty() ;
void MakeEmpty();
const Data First () ;
const Data Last () ;
void InsertFirst (Data item);
void InsertLast (Data item);
НХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
void InsertBefore(Data key,Data item);
void InsertAfter(Data key,Data item);
void InsertPosition(int pos,Data item);
void FindItem(Data key);
void DeleteFirst();
void DeleteLast();
void DeleteBefore(Data item);
void DeleteAfter(Data item);
void DeletePosition(int pos);
void DeleteItem(Data key);
int Count();
void Print();
};
НХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
SinglyLinkedList::SinglyLinkedList (){
head=tail= NULL;
}
Тайлбар:
SinglyLinkedList list;
// list нэртэй нэг холбоост жагсаалт үүсгэж байна.
НХЖ-ыг үүсгэх
байгуулагч функц:
head tail
SinglyLinkedList::~SinglyLinkedList (){
MakeEmpty();
}
void SinglyLinkedList::MakeEmpty()
{
SLNode *curr=NULL;
while (head != NULL){
curr = head;
head = head->next;
delete curr;
}
tail = NULL;
}
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
Тайлбар:
 Устгагч функц нь MakeEmpty() функцийг
дуудна.
 MakeEmpty() функц нь үүсгэсэн нэг холбоост
жагсаалтын элемэнтүүдийг санах ойгоос чөлөөлөх
буюу нэг холбоост жагсаалтыг хоослоно.
 MakeEmpty() функц нь туслах заагч/curr/-ийг
ашиглан эхлэлийн элемэнтээс эхлэн
элемэнтүүдийг нэг нэгээр санах ойгоос чөлөөлнө.
 Бүх элемэнтүүдийг чөлөөлсний дараа хоосон
жагсаалт үлдэнэ.
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
100 56 34. . .
curr
head tail
456
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
100 56 34
head
. . .
tail
curr
456
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
56 34
head
. . .
tailcurr
456
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
34
head
. . .
tailcurr
456
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
34
head tailcurr
456
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
headtailcurr
456
НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
headtailcurr
Нэг холбоост жагсаалт
Устгагч функц:
headtailcurr
Тайлбар:
Устгагч функц нь байгуулагч функцээр болон
тухайн хийсвэр төрлөөр санах ойд хуваарилагдсан
хувьсагчдыг санах ойгоос чөлөөлнө.
bool SinglyLinkedList::IsEmpty(){
if( head == NULL && tail==NULL)
return true;
return false;
}
Тайлбар:
Эхлэлийн заагч /head/ болон төгсгөлийн заагч
/tail/-ууд нь хоосон/NULL/ утгатай бол нэг
холбоост жагсаалт хоосон байна буюу true утга,
хоосон/NULL/-оос ялгаатай бол хоосон биш буюу
false утга буцаана.
НХЖ-ыг хоосон
эсэхийг шалгах
НХЖ-ыг хоосон
эсэхийг шалгах
head tail
100 56 . . .
head
true
false
void SinglyLinkedList::InsertFirst(Data item)
{
SLNode *curr = new SLNode(item, head);
if (IsEmpty()==true)
tail = curr;
head = curr;
}
НХЖ-ын эхэнд
элемэнт нэмэх
Тайлбар:
1. Шинэ элемэнтийг санах ойд хуваарилна. Уг
зангилааны заагч талбар нь эхлэлийн заагчийг
зааж байгаа утгыг заана.
2. А. Хэрвээ жагсаалт хоосон бол эхлэлийн заагч
болон төгсгөлийн заагчаар шинэ элемэнтийг
заалгана.
2. В. Харин жагсаалт хоосон биш буюу элемэнттэй
бол эхлэлийн заагчийг шинэ элемэнтэд
шилжүүлнэ.
НХЖ-ын эхэнд
элемэнт нэмэх
НХЖ-ын эхэнд
элемэнт нэмэх
curr head tail
100
100 56 34. . .
head tail
456
curr
void SinglyLinkedList::InsertLast (Data item)
{
SLNode *curr = new SLNode (item, NULL);
if (IsEmpty()==true)
head = curr;
else
tail->next = curr;
tail = curr;
}
НХЖ-ын төгсгөлд
элемэнт нэмэх
Тайлбар:
1. Шинэ элемэнтийг санах ойд хуваарилна. Уг
зангилааны заагч талбар нь хоосон утгыг заана.
2. А. Хэрвээ жагсаалт хоосон бол эхлэлийн заагч
болон төгсгөлийн заагчаар шинэ элемэнтийг
заалгана.
2. В. Харин жагсаалт хоосон биш буюу элемэнттэй
бол төгсгөлийн элемэнтийн заагч талбараар
шинэ элемэнтийг заалган, төгсгөлийн
заагчийг шинэ элемэнтэд шилжүүлнэ.
НХЖ-ын төгсгөлд
элемэнт нэмэх
НХЖ-ын төгсгөлд
элемэнт нэмэх
currhead tail
100
100 56 34. . .
head tail
456
curr
void SinglyLinkedList::InsertBefore(Data key,
Data item){
SLNode *prevCurr=NULL;
SLNode *nextCurr=head;
if(IsEmpty()==false){
while(nextCurr->element!=key &&
nextCurr!=NULL){
prevCurr=nextCurr;
nextCurr=nextCurr->next;
}
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
if (nextCurr == NULL)
cout<<"ugugdsun element
oldsongui";
if(nextCurr->element==key){
SLNode *curr=new SLNode (item,
nextCurr);
prevCurr->next= curr;
}
}
else
cout<<"SinglyLinkedList is
empty"<<endl;
}
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
100 56 34. . .
head tail
456
nextCurr
prevCurr
Өгөгдсөн элемэнт: 156
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
100 56 34. . .
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
100 56 34. . .
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
100 56 34. . .
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
100 56 34. . .
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт олдсонгүй!!!
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
void SinglyLinkedList::InsertBefore(Data key,
Data item){
SLNode *prevCurr=NULL;
SLNode *nextCurr=head;
if(IsEmpty()==false){
while(prevCurr->element!=key &&
nextCurr!=NULL){
prevCurr=nextCurr;
nextCurr=nextCurr->next;
}
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
if (nextCurr == NULL)
cout<<"ugugdsun element
oldsongui";
if(prevCurr->element==key){
SLNode *curr=new SLNode (item,
nextCurr);
prevCurr->next= curr;
}
}
else
cout<<"SinglyLinkedList is
empty"<<endl;
}
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол өгөгдсөн элемэнт
олдохгүй бөгөөд энэ үйлдлийг гүйцэтгэх
боломжгүй.
2. В. Хоосон биш бол дараах алхамуудыг
гүйцэтгэнэ.
2. 1. Өгөгдсөн элемэнтийг олохын тулд
жагсаалтын эхлэлээс зангилаа болгоны
элемэнт талбартай өгөгдсөн утгыг жиших
замаар дараалан хайна.
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
Тайлбар:
2. 2. Хэрвээ өгөгдсөн элемэнт олдохгүйгээр
жагсаалтын элемэнтийн төгсгөлд хүрвэл
жагсаалт элемэнт нэмэх боломжгүй
2. 3. Харин өгөгдсөн элемэнт олдвол шинэ
элемэнтийн санах ойд хуваарилж, түүний
заагч талбараар шинэ элемэнтийг заалгана.
Мөн өгөгдсөн элемэнтийн өмнөх элемэнтийн
заагч талбараар шинэ элемэнтийг заалгана.
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurr
prevCurr
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42 curr
42
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн элемэнт:456
Шинэ элемэнт: 42 curr
42
НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
100 56 34
head tail
42
nextCurrprevCurr
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42
curr
456
void SinglyLinkedList::InsertPosition( int
pos, Data item)
{
if(IsEmpty()==false){
SLNode* prevCurr=NULL;
SLNode*nextCurr=head;
int i=1;
while(i!=pos && nextCurr!=NULL){
prevCurr=nextCurr;
nextCurr=nextCurr->next;
i++;
}
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
if (nextCurr == NULL)
cout<<"bairlal buruu";
if(i==pos){
SLNode *curr=new SLNode(item,
nextCurr);
prevCurr->next= curr;
}
}
else
cout<<"SinglyLinkedList is
empty"<<endl;
}
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол өгөгдсөн элемэнт
олдохгүй бөгөөд энэ үйлдлийг гүйцэтгэх
боломжгүй.
2. В. Хоосон биш бол дараах алхамуудыг
гүйцэтгэнэ.
2. 1. Өгөгдсөн байрлалыг тодорхойлохын тулд
жагсаалтын эхлэлээс зангилаануудыг тоолно.
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
Тайлбар:
2. 2. Хэрвээ өгөгдсөн байрлал олдохгүйгээр
жагсаалтын элемэнтийн төгсгөлд хүрвэл
жагсаалт элемэнт нэмэх боломжгүй
2. 3. Харин өгөгдсөн байрлал олдвол шинэ
элемэнтийн санах ойд хуваарилж, түүний
заагч талбараар шинэ элемэнтийг заалгана.
Мөн өгөгдсөн элемэнтийн өмнөх элемэнтийн
заагч талбараар шинэ элемэнтийг заалгана.
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurr
prevCurr
Өгөгдсөн байрлал: 4
Шинэ элемэнт: 42
i=1
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн байрлал: 4
Шинэ элемэнт: 42
i=2
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн байрлал: 4
Шинэ элемэнт: 42
i=3
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
Өгөгдсөн байрлал: 4
Шинэ элемэнт: 42
i=4
curr
42
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
100 56 34
head tail
456
nextCurrprevCurr
curr
42
НХЖ-ын өгөгдсөн байрлалд
элемэнт нэмж оруулах
100 56 34
head tail
42
nextCurrprevCurr
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42
curr
456
void SinglyLinkedList::Print(){
if(IsEmpty()==false){
SLNode *curr=head;
cout<<"SinglyLinkedList: ";
while(curr!=NULL){
cout<<curr->element<<"->";
curr=curr->next;
}
}
else
cout<<"SinglyLinkedList is
empty"<<endl;
}
НХЖ-ын элемэнтүүдийг хэвлэх
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList
is empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг
гүйцэтгэнэ.
2. 1. жагсаалтын эхлэлээс төгсгөл хүртэл бүх
зангилаанд туслах заагчийн тусламжтайгаар
дараалан хандаж, зангилаа бүрийн element
талбарын утгыг хэвлэнэ.
НХЖ-ын элемэнтүүдийг хэвлэх
НХЖ-ын элемэнтүүдийг хэвлэх
100 56 34
head tail
42
SinglyLinkedList:
456
curr
100->
НХЖ-ын элемэнтүүдийг хэвлэх
100 56 34
head tail
42
SinglyLinkedList:
456
curr
100->56->
НХЖ-ын элемэнтүүдийг хэвлэх
100 56 34
head tail
42
SinglyLinkedList:
456
curr
100->56->456->
НХЖ-ын элемэнтүүдийг хэвлэх
100 56 34
head tail
42
SinglyLinkedList:
456
curr
100->56->456->42->
НХЖ-ын элемэнтүүдийг хэвлэх
100 56 34
head tail
42
SinglyLinkedList:
456
curr
100->56->456->42->34->
НХЖ-ын элемэнтүүдийг хэвлэх
100 56 34
head tail
42
SinglyLinkedList:
456
curr
100->56->456->42->34->
bool SinglyLinkedList::FindItem(Data key){
if(IsEmpty()==false){
SLNode *curr = head;
while (curr!=NULL && curr->element!=key){
curr=curr->next;
}
if (curr->element == key) return true;
return false;
}
else
return false;
}
НХЖ-аас өгөгдсөн
элемэнтийг хайх
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList
is empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг
гүйцэтгэнэ.
2. 1. жагсаалтын эхлэлээс туслах заагчийн
тусламжтайгаар өгөгдсөн утгыг зангилаа
бүрийн элемэнт талбарын утгатай жиших
замаар элемэнт олдох хүртэл эсвэл төгсгөл
хүртэл зангилаануудад дараалан хандах
замаар хайлтыг явуулна.
НХЖ-аас өгөгдсөн
элемэнтийг хайх
Тайлбар:
2. 2. Хайлтыг явуулж буй давталт дуусах үед
туслах заагчын утга хоосон/NULL/ байвал
өгөгдсөн элемэнт жагсаалтад байхгүй байна.
2. 3. Хайлтыг явуулж буй давталт дуусах үед
туслах заагчын зааж буй зангилааны элемэнт
талбарын утга өгөгдсөн элемэнттэй тэнцүү
үед өгөгдсөн утга жагсаалтад байна.
НХЖ-аас өгөгдсөн
элемэнтийг хайх
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 10
10
Хайсан элемэнт олдсонгүй!!!
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 56
56
НХЖ-аас өгөгдсөн
элемэнтийг хайх
100 56 34
head tail
42456
curr
Хайх утга: 56
56
Хайсан элемэнт олдлоо!!!
int SinglyLinkedList::Count(){
if(IsEmpty()==false){
SLNode *curr=head;
int counter=0;
while(curr!=NULL){
counter++;
curr=curr->next;
}
return counter;
}
else
return 0;
}
НХЖ-ын элемэнтийн
тоог буцаах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол 0 гэсэн утгыг буцаана.
2. В. Хоосон биш бол туслах туслах заагчийн
тусламжтайгаар жагсаалтын эхлэлээс төгсгөл
хүртэл элемэнтүүдэд дараалан хандах замаар
тоолон, тоог буцаана.
НХЖ-ын элемэнтийн
тоог буцаах
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42
counter=0
456
curr
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42
Counter=
456
curr
1
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42456
curr
Counter=2
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42456
curr
Counter=3
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42456
curr
Counter=4
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42456
curr
Counter=5
НХЖ-ын элемэнтийн
тоог буцаах
100 56 34
head tail
42456
curr
Counter=5
Data SinglyLinkedList::First ()
{
if (IsEmpty()==true)
cout<<"SinglyLinkedList is empty";
return head->element;
}
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол эхлэлийн заагчийн зааж буй
зангилааны элемэнт талбарын утгыг буцаана.
НХЖ-ын эхний элемэнтийн
утгыг буцаах
НХЖ-ын эхний элемэнтийн
утгыг буцаах
100 56 34
head tail
42
head->element=100
456
Data SinglyLinkedList::Last ()
{
if (tail == NULL)
cout<<"SinglyLinkedList is
empty";
return tail->element;
}
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол төгсгөлийн заагчийн зааж буй
зангилааны элемэнт талбарын утгыг буцаана.
НХЖ-ын төгсгөлийн
элемэнтийн утгыг буцаах
НХЖ-ын төгсгөлийн
элемэнтийн утгыг буцаах
100 56 34
head tail
42
tail->element=34
456
void SinglyLinkedList::DeleteFirst()
{
if(IsEmpty()==false){
SLNode* curr = head;
head=curr->next;
delete curr;
}
else
cout<<"SinglyLinkedList is
empty"<<endl;
}
НХЖ-ын эхний
элемэнтийг устгах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2. 1. Туслах заагчийг зарлан, түүгээр эхний зангилааг
заалгана.
2. 2. Эхлэлийн заагчийг дараагийн буюу хоёр дахь
зангилаанд шилжүүлнэ.
2. 3. Туслах заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
НХЖ-ын эхний
элемэнтийг устгах
НХЖ-ын эхний
элемэнтийг устгах
100 56 34
head tail
42456
curr
void SinglyLinkedList::DeleteLast()
{
if(IsEmpty()==false){
SLNode* prevCurr = NULL;
SLNode* curr = head;
while (curr!= tail )
{
prevCurr = curr;
curr = curr->next;
}
НХЖ-ын төгсгөлийн
элемэнтийг устгах
if (curr == tail){
prevCurr->next=curr->next;
tail = prevCurr;
}
delete curr;
}
else
cout<<"SinglyLinkedList is
empty"<<endl;
}
НХЖ-ын төгсгөлийн
элемэнтийг устгах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2. 1. Туслах заагч/curr/-ийг зарлан, түүгээр эхний
зангилааг заалгана.
2. 2. Туслах заагчийн зааж буй зангилааны өмнөх
зангилааг заах өөр нэг туслах заагч/prevCurr/-ийг
зарлан, түүгээр хоосон/NULL/-ыг заалгана.
2. 3. Туслах заагч/curr/ болон төгсгөлийн заагчууд нэг
зангилаа заах хүртэл дээрх заагчийг дараалуулан
шилжүүлнэ.
НХЖ-ын төгсгөлийн
элемэнтийг устгах
Тайлбар:
2. 4. Туслах заагч/curr/ болон төгсгөлийн заагчууд нэг
зангилаа заах үед prevCurr заагчийн заагч
талбараар curr заагчийн заагч талбарын зааж буй
утгыг заалгана.
2. 5. Төгсгөлийн заагчийг prevCurr заагчийг зааж буй
зангилаанд шилжүүлнэ.
2. 6. curr заагчийн зааж буй зангилааг устгах буюу
санах ойгоос чөлөөлнө.
НХЖ-ын төгсгөлийн
элемэнтийг устгах
НХЖ-ын төгсгөлийн
элемэнтийг устгах
head tail
prevCurr
curr
100 56 34. . . 456
НХЖ-ын төгсгөлийн
элемэнтийг устгах
head tail
prevCurr
curr
100 56 34. . . 456
НХЖ-ын төгсгөлийн
элемэнтийг устгах
head tail
prevCurr
curr
100 56 34. . . 456
НХЖ-ын төгсгөлийн
элемэнтийг устгах
head tail
prevCurr
curr
100 56 34. . . 456
НХЖ-ын төгсгөлийн
элемэнтийг устгах
head tail
prevCurr
curr
100 56 34. . . 456
НХЖ-ын төгсгөлийн
элемэнтийг устгах
head tail
prevCurr
curr
100 56 34. . . 456
void SinglyLinkedList::DeleteBefore(Data key)
{
if(IsEmpty()==false){
SLNode *prevCurr = NULL;
SLNode *curr = NULL;
SLNode *nextCurr=head;
while(nextCurr!=NULL && nextCurr->element!=key)
{
prevCurr = curr;
curr=nextCurr;
nextCurr = nextCurr->next;
}
if (nextCurr == NULL)
cout<<"key element oldsongui"<<endl;
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
if (nextCurr == head)
cout<<"key elementiin umnu element bhgui
bna"<<endl;
else if (nextCurr->element == key){
if(curr==head)
head=nextCurr;
else
prevCurr->next=nextCurr;
delete curr;
}
}
else
cout<<"SinglyLinkedList is empty"<<endl;
}
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд гурван
туслах заагчийг ашиглана.
• curr – устгах зангилааг заалгана.
• prevCurr – устгах элемэнтийн өмнөх зангилааг
заалгана.
• nextCurr – өгөгдсөн элемэнт буюу устгах
элемэнтийн дараагийн зангилааг заалгана.
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
Тайлбар:
2. 2. Хайлт зогссон үед хэрвээ nextCurr заагч NULL
утгыг зааж байвал өгөгдсөн элемэнт жагсаалтад
байхгүй байна.
2. 3. Хайлт зогссон үед хэрвээ nextCurr болон эхлэлийн
заагчуудын зааж буй утга адил үед эхний
элемэнтийн өмнө зангилаа байхгүй тул үйлдэл
гүйцэтгэх боломжгүй.
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
Тайлбар:
2. 3. Хайлт зогссон үед хэрвээ nextCurr заагчийн
element талбарын утга өгөгдсөн элемэнттэй тэнцүү
буюу хайсан зангилаа олдсон бол:
2. 3. 1. Хэрвээ curr болон head заагчуудын зааж буй
зангилаа нь адил үед эхлэлийн заагчийг дараагийн
элемэнтэд шилжүүлнэ.
2. 3. 2. Хэрвээ curr болон head заагчуудын зааж буй
зангилаа нь адил биш үед prevCurr заагчийн зааж
буй зангилааны заагч талбараар nextCurr заагчийн
зааж буй зангилааг заалгана.
2. 4. curr заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
100 56 34
head tail
42
nextCurr
prevCurr
456
curr
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
100 56 34
head tail
42
nextCurr
prevCurr
Өгөгдсөн элемэнт: 100
456
curr
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
100 56 34
head tail
42
nextCurr
prevCurr
Өгөгдсөн элемэнт: 456
456
curr
НХЖ-ын өгөгдсөн элемэнтийн
өмнөх элемэнтийг устгах
100 56 34
head tail
42
nextCurr
prevCurr
456
curr
void SinglyLinkedList::DeleteAfter(Data key)
{
if(IsEmpty()==false){
SLNode *prevCurr = NULL;
SLNode *curr = head;
while (curr!= NULL && prevCurr->element!=key)
{
prevCurr = curr;
curr=curr->next;
}
if (curr == NULL)
cout<<"key element oldsongui"<<endl;
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
if (prevCurr == tail)
cout<<"key elementiin hoino element
bhgui bna"<<endl;
else if (prevCurr->element == key){
prevCurr->next=curr->next;
delete curr;
}
}
else
cout<<"SinglyLinkedList is empty"<<endl;
}
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд хоёр
туслах заагчийг ашиглана.
• curr – устгах зангилааг заалгана.
• prevCurr – устгах элемэнтийн өмнөх зангилааг
заалгана.
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
Тайлбар:
2. 2. Хайлт зогссон үед хэрвээ curr заагч NULL утгыг
зааж байвал өгөгдсөн элемэнт жагсаалтад байхгүй
байна.
2. 3. Хайлт зогссон үед хэрвээ prevCurr болон
төгсгөлийн заагчуудын зааж буй зангилаа нь адил
бол төгсгөлийн элемэнтийн ард зангилаа байхгүй
тул үйлдэл гүйцэтгэх боломжгүй.
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
Тайлбар:
2. 3. Хайлт зогссон үед хэрвээ prevCurr заагчийн зааж
буй зангилааны element талбарын утга өгөгдсөн
элемэнттэй тэнцүү буюу хайсан зангилаа олдсон
бол prevCurr заагчийн зааж буй зангилааны заагч
талбараар curr заагчийн зааж буй зангилааг
заалгана.
2. 4. curr заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 42
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 56
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 56
НХЖ-ын өгөгдсөн элемэнтийн
ардах элемэнтийг устгах
100 56 34
head tail
42
prevCurr
456
curr
Өгөгдсөн элемэнт: 56
void SinglyLinkedList::DeleteItem(Data key)
{
if(IsEmpty()==false){
SLNode *prevCurr = NULL;
SLNode *curr = head;
while (curr != NULL && curr->element != key)
{
prevCurr = curr;
curr=curr->next;
}
if (curr == NULL)
cout<<"key element oldsongui"<<endl;
if (curr == tail)
tail=prevCurr;
НХЖ-ын өгөгдсөн
элемэнтийг устгах
if(curr==head)
head=prevCurr;
if (curr->element == key){
prevCurr->next=curr->next;
delete curr;
}
}
else
cout<<"SinglyLinkedList is empty"<<endl;
}
НХЖ-ын өгөгдсөн
элемэнтийг устгах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд хоёр
туслах заагчийг ашиглана.
• curr – устгах зангилааг заалгана.
• prevCurr – устгах элемэнтийн өмнөх зангилааг
заалгана.
НХЖ-ын өгөгдсөн
элемэнтийг устгах
Тайлбар:
2. 2. Хайлт зогссон үед хэрвээ curr заагч NULL утгыг
зааж байвал өгөгдсөн элемэнт жагсаалтад байхгүй
байна.
2. 3. Хайлт зогссон үед хэрвээ curr болон эхлэлийн
заагчуудын зааж буй зангилаа нь адил бол
эхлэлийн заагчийг дараагийн элемэнтэд
шилжүүлнэ.
2. 4. Хайлт зогссон үед хэрвээ curr болон төгсгөлийн
заагчуудын зааж буй зангилаа нь адил бол
төгсгөлийн заагчийг өмнөх элемэнтэд шилжүүлнэ.
НХЖ-ын өгөгдсөн
элемэнтийг устгах
Тайлбар:
2. 4. Хайлт зогссон үед хэрвээ curr заагчийн зааж буй
зангилааны element талбарын утга өгөгдсөн
элемэнттэй тэнцүү буюу хайсан зангилаа олдсон
бол prevCurr заагчийн зааж буй зангилааны заагч
талбараар curr заагчийн зааж буй зангилааг
заалгана.
2. 5. curr заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
НХЖ-ын өгөгдсөн
элемэнтийг устгах
void SinglyLinkedList::DeletePosition(int pos)
{
if(IsEmpty()==false){
int i=1;
SLNode *prevCurr = NULL;
SLNode *curr = head;
while (curr != NULL && i!= pos)
{
prevCurr = curr;
curr=curr->next;
i++;
}
if (curr == NULL)
cout<<"bairlal oldsongui"<<endl;
НХЖ-ын өгөгдсөн байрлал дахь
элемэнтийг устгах
if (i == pos){
if(curr==head)
head=curr->next;
else
prevCurr->next=curr->next;
if(curr==tail)
tail=prevCurr;
delete curr;
}
}
else
cout<<"SinglyLinkedList is empty"<<endl;
}
НХЖ-ын өгөгдсөн байрлал дахь
элемэнтийг устгах
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ.
2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд хоёр
туслах заагч, нэг хувьсагч ашиглана.
• curr – устгах зангилааг заалгана.
• prevCurr – устгах элемэнтийн өмнөх зангилааг
заалгана.
• i – элемэнтүүдийн байрлалыг тодорхойлох
тоолуур
НХЖ-ын өгөгдсөн байрлал дахь
элемэнтийг устгах
Тайлбар:
2. 2. Хайлт зогссон үед хэрвээ curr заагч NULL утгыг
зааж байвал жагсаалтад өгөгдсөн байрлал байхгүй
байна.
2. 3. Хайлт зогссон үед хэрвээ тоолуур хувьсагчийн
утга өгөгдсөн байрлалтай тэнцүү үед:
2. 3. 1. хэрвээ curr болон эхлэлийн заагчуудын зааж
буй зангилаа нь адил бол эхлэлийн заагчийг
дараагийн элемэнтэд шилжүүлнэ.
2. 3. 2. хэрвээ curr болон төгсгөлийн заагчуудын
зааж буй зангилаа нь адил бол төгсгөлийн заагчийг
өмнөх элемэнтэд шилжүүлнэ.
НХЖ-ын өгөгдсөн байрлал дахь
элемэнтийг устгах
Тайлбар:
2. 3. 3. дээрх хоёр нөхцлийн аль нь ч биш
тохиодолд prevCurr заагчийн зааж буй зангилааны
заагч талбараар curr заагчийн зааж буй зангилааг
заалгана.
2. 4. curr заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
НХЖ-ын өгөгдсөн байрлал дахь
элемэнтийг устгах

More Related Content

What's hot

Presentation1 өгөгдлийн сан
Presentation1 өгөгдлийн санPresentation1 өгөгдлийн сан
Presentation1 өгөгдлийн сан
baterden
 
U.cs101 алгоритм программчлал-10
U.cs101   алгоритм программчлал-10U.cs101   алгоритм программчлал-10
U.cs101 алгоритм программчлал-10
Badral Khurelbaatar
 
Microsoft access 2007
Microsoft access 2007Microsoft access 2007
Microsoft access 2007
Akhyt
 
Ogogdliin sangiin zohion baiguulalt lekts
Ogogdliin sangiin zohion baiguulalt lektsOgogdliin sangiin zohion baiguulalt lekts
Ogogdliin sangiin zohion baiguulalt lekts
Алдарболд Э.
 
Lec3 c++operator
Lec3 c++operatorLec3 c++operator
Lec3 c++operator
Turuu Tsogt
 

What's hot (20)

массив
массивмассив
массив
 
Лекц 10: (Рекурс)
Лекц 10: (Рекурс)Лекц 10: (Рекурс)
Лекц 10: (Рекурс)
 
Presentation1 өгөгдлийн сан
Presentation1 өгөгдлийн санPresentation1 өгөгдлийн сан
Presentation1 өгөгдлийн сан
 
Sw203 Lecture6 Inheritance
Sw203 Lecture6 InheritanceSw203 Lecture6 Inheritance
Sw203 Lecture6 Inheritance
 
Өгөгдлийн бүтэц 2-3
Өгөгдлийн бүтэц 2-3Өгөгдлийн бүтэц 2-3
Өгөгдлийн бүтэц 2-3
 
U.cs101 алгоритм программчлал-10
U.cs101   алгоритм программчлал-10U.cs101   алгоритм программчлал-10
U.cs101 алгоритм программчлал-10
 
Database 3
Database 3Database 3
Database 3
 
Microsoft access 2007
Microsoft access 2007Microsoft access 2007
Microsoft access 2007
 
Ms access
Ms accessMs access
Ms access
 
It101 lec6 10.06
It101 lec6 10.06It101 lec6 10.06
It101 lec6 10.06
 
Өгөгдлийн бүтэц 13
Өгөгдлийн бүтэц 13Өгөгдлийн бүтэц 13
Өгөгдлийн бүтэц 13
 
өгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэсөгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэс
 
U.cs101 алгоритм программчлал-3
U.cs101   алгоритм программчлал-3U.cs101   алгоритм программчлал-3
U.cs101 алгоритм программчлал-3
 
Ogogdliin sangiin zohion baiguulalt lekts
Ogogdliin sangiin zohion baiguulalt lektsOgogdliin sangiin zohion baiguulalt lekts
Ogogdliin sangiin zohion baiguulalt lekts
 
C++ vndsen oilgolt хичээл 1
C++ vndsen oilgolt хичээл 1C++ vndsen oilgolt хичээл 1
C++ vndsen oilgolt хичээл 1
 
database 7-8
database 7-8database 7-8
database 7-8
 
u.cs101 "Алгоритм ба програмчлал" Лекц №2
u.cs101 "Алгоритм ба програмчлал" Лекц №2u.cs101 "Алгоритм ба програмчлал" Лекц №2
u.cs101 "Алгоритм ба програмчлал" Лекц №2
 
Өгөгдлийн бүтэц 15
Өгөгдлийн бүтэц 15Өгөгдлийн бүтэц 15
Өгөгдлийн бүтэц 15
 
2
22
2
 
Lec3 c++operator
Lec3 c++operatorLec3 c++operator
Lec3 c++operator
 

More from International Ulaanbaatar University

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
 

Dsi lec5,6

  • 3. Жагсаалт  Элемэнтүүд нь санах ойд дэс дараалан байрлах албагүй бөгөөд элемэнтүүд нь санах ойд динамикаар үүсдэг шугаман зохион байгуулалттай элемэнтүүдийн олонлогийг жагсаалт гэнэ.  Динамикаар үүссэн элемэнтүүдийн дарааллыг холбоос буюу заагчаар тодорхойлдог.
  • 4. Жагсаалтын ангилал Жагсаалтыг холбоосоор нь дараах байдлаар ангилдаг: Нэг холбоост жагсаалт /Singly Linked List/ Цикл жагсаалт /Circular Linked List Давхар холбоост жагсаалт /Doubly Linked List/
  • 5. Өгөгдөл Нэг холбоост жагсаалт  Нэг холбоост жагсаалтын элемэнт буюу зангилаа нь өгөгдөл ба холбоос/заагч/ гэсэн хоёр хэсгээс тогтоно. 100 100
  • 6.  Зангилаа бүрийн заагч нь дараачийн зангилааг заадаг өгөгдлүүдийн цэгцлэгдсэн тогтоцыг нэг холбоост жагсаалт /НХЖ/ буюу шугаман жагсаалт гэнэ.  Өөрөөр хэлбэл дэс дараалан ар араасаа холбогдсон элемэнтүүдийн тогтоц юм. Нэг холбоост жагсаалт 100 56 34 456
  • 7.  Жагсаалтын зангилааны өгөгдөл нь өгөгдөл буюу утгыг агуулах бөгөөд тухайн утгын төрөл бүхэл тоо, бодит тоо, тэмдэгт мөр зэрэг үндсэн өгөгдлийн төрлүүдээс гадна хэрэглэгийн тодорхойлсон ямар ч төрөлтэй байж болно.  typedef int Data;  typedef char Data; Нэг холбоост жагсаалт 100 56 34 456 c k a d
  • 8.  Жагсаалтын зангилааны холбоос буюу заагч нь дараачийн зангилааг заах буюу санах ойн үүрний хаягийг агуулах учраас заах зангилааны төрөлтэй ижил төрлийнх байна.  Жагсаалтын хамгийн сүүлийн зангилааны заагч нь NULL гэсэн утгыг заавал агуулсан байх ёстой Нэг холбоост жагсаалт 100 56 34 456
  • 9.  Нэг холбоост жагсаалтын зангилааг дараах SLNode классаар тодорхойлъё class SLNode{ Data element; SLNode *next; SLNode(Data evalue;SLNode* nvalue) { element=evalue; next=nvalue; } friend class SinglyLinkedList; }; Нэг холбоост жагсаалтын зангилааг илэрхийлэх:
  • 10. Data element; Өгөгдөл агуулах талбар SLNode *next; Дараагийн зангилааг заах заагч талбар Нэг холбоост жагсаалтын зангилааг илэрхийлэх: 100 100 SLNode 100 SLNode 100 SLNode
  • 11.  Нэг холбоост жагсаалтад дараах гадаад заагчуудыг тодорхойлж, ашиглах шаардлагатай 1. Жагсаалтын эхний зангилааны санах ойн үүрний хаягийг агуулах толгой заагч буюу эхлэл заагч юм. Нэг холбоост жагсаалтын аливаа зангилаанд хүрэхийн тулд жагсаалтын эхний зангилаанаас эхлэн холбоосуудын тусламжтайгаар дараалан хандаж хүссэн зангилаагаа олж авдаг. Иймд толгой буюу эхлэл заагч нь ямагт жагсаалтын эхний зангилааг зааж байх ёстой. Нэг холбоост жагсаалтыг зохион байгуулах 100 56 34 456
  • 12. 2. Жагсаалтын төгсгөлийн зангилааны санах ойн үүрний хаягийг агуулах сүүл заагч буюу төгсгөл заагч юм. Энэ заагчийн тусламжтайгаар жагсаалтын төгсгөл хязгаарлагдана. Иймд сүүл буюу төгсгөл заагч нь ямагт жагсаалтын төгсгөлийн зангилааг зааж байх ёстой. Нэг холбоост жагсаалтыг зохион байгуулах 100 56 34 456
  • 13. 3. Идэвхтэй элемэнтийн санах ойн үүрний хаягийг агуулах идэвхтэй элемэнтийн заагч буюу туслах заагч. Энэ заагчийн тусламжтайгаар жагсаалтад хийгдэх үйлдлүүдийг гүйцэтгэнэ. Тиймээс энэхүү заагчид тогтсон байрлал байхгүй бөгөөд тухайн эгшинд идэвхтэй байх элемэнтийг заана. Нэг холбоост жагсаалтыг зохион байгуулах 100 56 34 456
  • 14. НХЖ-д элемэнт нэмж оруулах Жагсаалтын эхэнд элемэнт нэмэх InsertFirst() Жагсаалтын дунд элемэнт нэмэх Өгөгдсөн элемэнтийн өмнө InsertBefore() Өгөгдсөн элемэнтийн хойно InsertAfter() Өгөгдсөн байрлалд InsertPosition() Жагсаалтын төгсгөлд элемэнт нэмэх InsertLast() Нэг холбоост жагсаалтад хийгдэх үйлдлүүд
  • 15. НХЖ-аас элемэнт устгах Жагсаалтын эхлэлээс устггах DeleteFirst() Жагсаалтын дундаас устгах Өгөгдсөн элемэнтийн өмнөх DeleteBefore() Өгөгдсөн элемэнтийн ардах DeleteAfter() Өгөгдсөн байрлал дахь DeletePosition() Өгөгдсөн утгатай DeleteItem() Жагсаалтын төгсгөлөөс устгах DeleteLast() Нэг холбоост жагсаалтад хийгдэх үйлдлүүд
  • 16. НХЖ-аас элемэнт хайх – FindItem() НХЖ хоосон эсэхийг шалгах – IsEmpty() НХЖ-ыг хоослох – MakeEmpty() НХЖ-ын эхний элемэнтийн утгыг буцаах – First() Жагсаалтын төгсгөлийн элемэнтийн утгыг буцаах– Last() Жагсаалтын элемэнтийн тоог буцаах – Count() Жагсаалтын элемэнтүүдийг хэвлэх – Print() Нэг холбоост жагсаалтад хийгдэх үйлдлүүд
  • 17. class SinglyLinkedList { SLNode *head; SLNode *tail; public: SinglyLinkedList (); ~SinglyLinkedList (); bool IsEmpty() ; void MakeEmpty(); const Data First () ; const Data Last () ; void InsertFirst (Data item); void InsertLast (Data item); НХЖ-ыг илэрхийлэх хийсвэр төрлийг тодорхойлох
  • 18. void InsertBefore(Data key,Data item); void InsertAfter(Data key,Data item); void InsertPosition(int pos,Data item); void FindItem(Data key); void DeleteFirst(); void DeleteLast(); void DeleteBefore(Data item); void DeleteAfter(Data item); void DeletePosition(int pos); void DeleteItem(Data key); int Count(); void Print(); }; НХЖ-ыг илэрхийлэх хийсвэр төрлийг тодорхойлох
  • 19. SinglyLinkedList::SinglyLinkedList (){ head=tail= NULL; } Тайлбар: SinglyLinkedList list; // list нэртэй нэг холбоост жагсаалт үүсгэж байна. НХЖ-ыг үүсгэх байгуулагч функц: head tail
  • 20. SinglyLinkedList::~SinglyLinkedList (){ MakeEmpty(); } void SinglyLinkedList::MakeEmpty() { SLNode *curr=NULL; while (head != NULL){ curr = head; head = head->next; delete curr; } tail = NULL; } НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц:
  • 21. Тайлбар:  Устгагч функц нь MakeEmpty() функцийг дуудна.  MakeEmpty() функц нь үүсгэсэн нэг холбоост жагсаалтын элемэнтүүдийг санах ойгоос чөлөөлөх буюу нэг холбоост жагсаалтыг хоослоно.  MakeEmpty() функц нь туслах заагч/curr/-ийг ашиглан эхлэлийн элемэнтээс эхлэн элемэнтүүдийг нэг нэгээр санах ойгоос чөлөөлнө.  Бүх элемэнтүүдийг чөлөөлсний дараа хоосон жагсаалт үлдэнэ. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц:
  • 22. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: 100 56 34. . . curr head tail 456
  • 23. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: 100 56 34 head . . . tail curr 456
  • 24. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: 56 34 head . . . tailcurr 456
  • 25. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: 34 head . . . tailcurr 456
  • 26. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: 34 head tailcurr 456
  • 27. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: headtailcurr 456
  • 28. НХЖ-ыг санах ойгоос бүрэн чөлөөлөх устгагч функц: headtailcurr
  • 29. Нэг холбоост жагсаалт Устгагч функц: headtailcurr Тайлбар: Устгагч функц нь байгуулагч функцээр болон тухайн хийсвэр төрлөөр санах ойд хуваарилагдсан хувьсагчдыг санах ойгоос чөлөөлнө.
  • 30. bool SinglyLinkedList::IsEmpty(){ if( head == NULL && tail==NULL) return true; return false; } Тайлбар: Эхлэлийн заагч /head/ болон төгсгөлийн заагч /tail/-ууд нь хоосон/NULL/ утгатай бол нэг холбоост жагсаалт хоосон байна буюу true утга, хоосон/NULL/-оос ялгаатай бол хоосон биш буюу false утга буцаана. НХЖ-ыг хоосон эсэхийг шалгах
  • 32. void SinglyLinkedList::InsertFirst(Data item) { SLNode *curr = new SLNode(item, head); if (IsEmpty()==true) tail = curr; head = curr; } НХЖ-ын эхэнд элемэнт нэмэх
  • 33. Тайлбар: 1. Шинэ элемэнтийг санах ойд хуваарилна. Уг зангилааны заагч талбар нь эхлэлийн заагчийг зааж байгаа утгыг заана. 2. А. Хэрвээ жагсаалт хоосон бол эхлэлийн заагч болон төгсгөлийн заагчаар шинэ элемэнтийг заалгана. 2. В. Харин жагсаалт хоосон биш буюу элемэнттэй бол эхлэлийн заагчийг шинэ элемэнтэд шилжүүлнэ. НХЖ-ын эхэнд элемэнт нэмэх
  • 34. НХЖ-ын эхэнд элемэнт нэмэх curr head tail 100 100 56 34. . . head tail 456 curr
  • 35. void SinglyLinkedList::InsertLast (Data item) { SLNode *curr = new SLNode (item, NULL); if (IsEmpty()==true) head = curr; else tail->next = curr; tail = curr; } НХЖ-ын төгсгөлд элемэнт нэмэх
  • 36. Тайлбар: 1. Шинэ элемэнтийг санах ойд хуваарилна. Уг зангилааны заагч талбар нь хоосон утгыг заана. 2. А. Хэрвээ жагсаалт хоосон бол эхлэлийн заагч болон төгсгөлийн заагчаар шинэ элемэнтийг заалгана. 2. В. Харин жагсаалт хоосон биш буюу элемэнттэй бол төгсгөлийн элемэнтийн заагч талбараар шинэ элемэнтийг заалган, төгсгөлийн заагчийг шинэ элемэнтэд шилжүүлнэ. НХЖ-ын төгсгөлд элемэнт нэмэх
  • 37. НХЖ-ын төгсгөлд элемэнт нэмэх currhead tail 100 100 56 34. . . head tail 456 curr
  • 38. void SinglyLinkedList::InsertBefore(Data key, Data item){ SLNode *prevCurr=NULL; SLNode *nextCurr=head; if(IsEmpty()==false){ while(nextCurr->element!=key && nextCurr!=NULL){ prevCurr=nextCurr; nextCurr=nextCurr->next; } НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах
  • 39. if (nextCurr == NULL) cout<<"ugugdsun element oldsongui"; if(nextCurr->element==key){ SLNode *curr=new SLNode (item, nextCurr); prevCurr->next= curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах
  • 40. НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах 100 56 34. . . head tail 456 nextCurr prevCurr Өгөгдсөн элемэнт: 156 Шинэ элемэнт: 42
  • 41. НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах 100 56 34. . . head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт: 56 Шинэ элемэнт: 42
  • 42. НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах 100 56 34. . . head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт: 56 Шинэ элемэнт: 42
  • 43. НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах 100 56 34. . . head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт: 56 Шинэ элемэнт: 42
  • 44. НХЖ-ын өгөгдсөн элемэнтийн өмнө элемэнт нэмж оруулах 100 56 34. . . head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт олдсонгүй!!! Өгөгдсөн элемэнт: 56 Шинэ элемэнт: 42
  • 45. void SinglyLinkedList::InsertBefore(Data key, Data item){ SLNode *prevCurr=NULL; SLNode *nextCurr=head; if(IsEmpty()==false){ while(prevCurr->element!=key && nextCurr!=NULL){ prevCurr=nextCurr; nextCurr=nextCurr->next; } НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах
  • 46. if (nextCurr == NULL) cout<<"ugugdsun element oldsongui"; if(prevCurr->element==key){ SLNode *curr=new SLNode (item, nextCurr); prevCurr->next= curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах
  • 47. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол өгөгдсөн элемэнт олдохгүй бөгөөд энэ үйлдлийг гүйцэтгэх боломжгүй. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Өгөгдсөн элемэнтийг олохын тулд жагсаалтын эхлэлээс зангилаа болгоны элемэнт талбартай өгөгдсөн утгыг жиших замаар дараалан хайна. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах
  • 48. Тайлбар: 2. 2. Хэрвээ өгөгдсөн элемэнт олдохгүйгээр жагсаалтын элемэнтийн төгсгөлд хүрвэл жагсаалт элемэнт нэмэх боломжгүй 2. 3. Харин өгөгдсөн элемэнт олдвол шинэ элемэнтийн санах ойд хуваарилж, түүний заагч талбараар шинэ элемэнтийг заалгана. Мөн өгөгдсөн элемэнтийн өмнөх элемэнтийн заагч талбараар шинэ элемэнтийг заалгана. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах
  • 49. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurr prevCurr Өгөгдсөн элемэнт: 456 Шинэ элемэнт: 42
  • 50. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт: 456 Шинэ элемэнт: 42
  • 51. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт: 456 Шинэ элемэнт: 42
  • 52. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт: 456 Шинэ элемэнт: 42 curr 42
  • 53. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн элемэнт:456 Шинэ элемэнт: 42 curr 42
  • 54. НХЖ-ын өгөгдсөн элемэнтийн хойно элемэнт нэмж оруулах 100 56 34 head tail 42 nextCurrprevCurr Өгөгдсөн элемэнт: 456 Шинэ элемэнт: 42 curr 456
  • 55. void SinglyLinkedList::InsertPosition( int pos, Data item) { if(IsEmpty()==false){ SLNode* prevCurr=NULL; SLNode*nextCurr=head; int i=1; while(i!=pos && nextCurr!=NULL){ prevCurr=nextCurr; nextCurr=nextCurr->next; i++; } НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах
  • 56. if (nextCurr == NULL) cout<<"bairlal buruu"; if(i==pos){ SLNode *curr=new SLNode(item, nextCurr); prevCurr->next= curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах
  • 57. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол өгөгдсөн элемэнт олдохгүй бөгөөд энэ үйлдлийг гүйцэтгэх боломжгүй. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Өгөгдсөн байрлалыг тодорхойлохын тулд жагсаалтын эхлэлээс зангилаануудыг тоолно. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах
  • 58. Тайлбар: 2. 2. Хэрвээ өгөгдсөн байрлал олдохгүйгээр жагсаалтын элемэнтийн төгсгөлд хүрвэл жагсаалт элемэнт нэмэх боломжгүй 2. 3. Харин өгөгдсөн байрлал олдвол шинэ элемэнтийн санах ойд хуваарилж, түүний заагч талбараар шинэ элемэнтийг заалгана. Мөн өгөгдсөн элемэнтийн өмнөх элемэнтийн заагч талбараар шинэ элемэнтийг заалгана. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах
  • 59. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurr prevCurr Өгөгдсөн байрлал: 4 Шинэ элемэнт: 42 i=1
  • 60. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн байрлал: 4 Шинэ элемэнт: 42 i=2
  • 61. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн байрлал: 4 Шинэ элемэнт: 42 i=3
  • 62. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr Өгөгдсөн байрлал: 4 Шинэ элемэнт: 42 i=4 curr 42
  • 63. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах 100 56 34 head tail 456 nextCurrprevCurr curr 42
  • 64. НХЖ-ын өгөгдсөн байрлалд элемэнт нэмж оруулах 100 56 34 head tail 42 nextCurrprevCurr Өгөгдсөн элемэнт: 456 Шинэ элемэнт: 42 curr 456
  • 65. void SinglyLinkedList::Print(){ if(IsEmpty()==false){ SLNode *curr=head; cout<<"SinglyLinkedList: "; while(curr!=NULL){ cout<<curr->element<<"->"; curr=curr->next; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын элемэнтүүдийг хэвлэх
  • 66. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. жагсаалтын эхлэлээс төгсгөл хүртэл бүх зангилаанд туслах заагчийн тусламжтайгаар дараалан хандаж, зангилаа бүрийн element талбарын утгыг хэвлэнэ. НХЖ-ын элемэнтүүдийг хэвлэх
  • 67. НХЖ-ын элемэнтүүдийг хэвлэх 100 56 34 head tail 42 SinglyLinkedList: 456 curr 100->
  • 68. НХЖ-ын элемэнтүүдийг хэвлэх 100 56 34 head tail 42 SinglyLinkedList: 456 curr 100->56->
  • 69. НХЖ-ын элемэнтүүдийг хэвлэх 100 56 34 head tail 42 SinglyLinkedList: 456 curr 100->56->456->
  • 70. НХЖ-ын элемэнтүүдийг хэвлэх 100 56 34 head tail 42 SinglyLinkedList: 456 curr 100->56->456->42->
  • 71. НХЖ-ын элемэнтүүдийг хэвлэх 100 56 34 head tail 42 SinglyLinkedList: 456 curr 100->56->456->42->34->
  • 72. НХЖ-ын элемэнтүүдийг хэвлэх 100 56 34 head tail 42 SinglyLinkedList: 456 curr 100->56->456->42->34->
  • 73. bool SinglyLinkedList::FindItem(Data key){ if(IsEmpty()==false){ SLNode *curr = head; while (curr!=NULL && curr->element!=key){ curr=curr->next; } if (curr->element == key) return true; return false; } else return false; } НХЖ-аас өгөгдсөн элемэнтийг хайх
  • 74. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. жагсаалтын эхлэлээс туслах заагчийн тусламжтайгаар өгөгдсөн утгыг зангилаа бүрийн элемэнт талбарын утгатай жиших замаар элемэнт олдох хүртэл эсвэл төгсгөл хүртэл зангилаануудад дараалан хандах замаар хайлтыг явуулна. НХЖ-аас өгөгдсөн элемэнтийг хайх
  • 75. Тайлбар: 2. 2. Хайлтыг явуулж буй давталт дуусах үед туслах заагчын утга хоосон/NULL/ байвал өгөгдсөн элемэнт жагсаалтад байхгүй байна. 2. 3. Хайлтыг явуулж буй давталт дуусах үед туслах заагчын зааж буй зангилааны элемэнт талбарын утга өгөгдсөн элемэнттэй тэнцүү үед өгөгдсөн утга жагсаалтад байна. НХЖ-аас өгөгдсөн элемэнтийг хайх
  • 76. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10
  • 77. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10
  • 78. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10
  • 79. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10
  • 80. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10
  • 81. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10
  • 82. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 10 10 Хайсан элемэнт олдсонгүй!!!
  • 83. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 56 56
  • 84. НХЖ-аас өгөгдсөн элемэнтийг хайх 100 56 34 head tail 42456 curr Хайх утга: 56 56 Хайсан элемэнт олдлоо!!!
  • 85. int SinglyLinkedList::Count(){ if(IsEmpty()==false){ SLNode *curr=head; int counter=0; while(curr!=NULL){ counter++; curr=curr->next; } return counter; } else return 0; } НХЖ-ын элемэнтийн тоог буцаах
  • 86. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол 0 гэсэн утгыг буцаана. 2. В. Хоосон биш бол туслах туслах заагчийн тусламжтайгаар жагсаалтын эхлэлээс төгсгөл хүртэл элемэнтүүдэд дараалан хандах замаар тоолон, тоог буцаана. НХЖ-ын элемэнтийн тоог буцаах
  • 87. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42 counter=0 456 curr
  • 88. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42 Counter= 456 curr 1
  • 89. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42456 curr Counter=2
  • 90. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42456 curr Counter=3
  • 91. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42456 curr Counter=4
  • 92. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42456 curr Counter=5
  • 93. НХЖ-ын элемэнтийн тоог буцаах 100 56 34 head tail 42456 curr Counter=5
  • 94. Data SinglyLinkedList::First () { if (IsEmpty()==true) cout<<"SinglyLinkedList is empty"; return head->element; } Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол эхлэлийн заагчийн зааж буй зангилааны элемэнт талбарын утгыг буцаана. НХЖ-ын эхний элемэнтийн утгыг буцаах
  • 95. НХЖ-ын эхний элемэнтийн утгыг буцаах 100 56 34 head tail 42 head->element=100 456
  • 96. Data SinglyLinkedList::Last () { if (tail == NULL) cout<<"SinglyLinkedList is empty"; return tail->element; } Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол төгсгөлийн заагчийн зааж буй зангилааны элемэнт талбарын утгыг буцаана. НХЖ-ын төгсгөлийн элемэнтийн утгыг буцаах
  • 97. НХЖ-ын төгсгөлийн элемэнтийн утгыг буцаах 100 56 34 head tail 42 tail->element=34 456
  • 98. void SinglyLinkedList::DeleteFirst() { if(IsEmpty()==false){ SLNode* curr = head; head=curr->next; delete curr; } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын эхний элемэнтийг устгах
  • 99. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Туслах заагчийг зарлан, түүгээр эхний зангилааг заалгана. 2. 2. Эхлэлийн заагчийг дараагийн буюу хоёр дахь зангилаанд шилжүүлнэ. 2. 3. Туслах заагчийн зааж буй зангилааг санах ойгоос чөлөөлөх буюу устгана. НХЖ-ын эхний элемэнтийг устгах
  • 101. void SinglyLinkedList::DeleteLast() { if(IsEmpty()==false){ SLNode* prevCurr = NULL; SLNode* curr = head; while (curr!= tail ) { prevCurr = curr; curr = curr->next; } НХЖ-ын төгсгөлийн элемэнтийг устгах
  • 102. if (curr == tail){ prevCurr->next=curr->next; tail = prevCurr; } delete curr; } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын төгсгөлийн элемэнтийг устгах
  • 103. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Туслах заагч/curr/-ийг зарлан, түүгээр эхний зангилааг заалгана. 2. 2. Туслах заагчийн зааж буй зангилааны өмнөх зангилааг заах өөр нэг туслах заагч/prevCurr/-ийг зарлан, түүгээр хоосон/NULL/-ыг заалгана. 2. 3. Туслах заагч/curr/ болон төгсгөлийн заагчууд нэг зангилаа заах хүртэл дээрх заагчийг дараалуулан шилжүүлнэ. НХЖ-ын төгсгөлийн элемэнтийг устгах
  • 104. Тайлбар: 2. 4. Туслах заагч/curr/ болон төгсгөлийн заагчууд нэг зангилаа заах үед prevCurr заагчийн заагч талбараар curr заагчийн заагч талбарын зааж буй утгыг заалгана. 2. 5. Төгсгөлийн заагчийг prevCurr заагчийг зааж буй зангилаанд шилжүүлнэ. 2. 6. curr заагчийн зааж буй зангилааг устгах буюу санах ойгоос чөлөөлнө. НХЖ-ын төгсгөлийн элемэнтийг устгах
  • 111. void SinglyLinkedList::DeleteBefore(Data key) { if(IsEmpty()==false){ SLNode *prevCurr = NULL; SLNode *curr = NULL; SLNode *nextCurr=head; while(nextCurr!=NULL && nextCurr->element!=key) { prevCurr = curr; curr=nextCurr; nextCurr = nextCurr->next; } if (nextCurr == NULL) cout<<"key element oldsongui"<<endl; НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах
  • 112. if (nextCurr == head) cout<<"key elementiin umnu element bhgui bna"<<endl; else if (nextCurr->element == key){ if(curr==head) head=nextCurr; else prevCurr->next=nextCurr; delete curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах
  • 113. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд гурван туслах заагчийг ашиглана. • curr – устгах зангилааг заалгана. • prevCurr – устгах элемэнтийн өмнөх зангилааг заалгана. • nextCurr – өгөгдсөн элемэнт буюу устгах элемэнтийн дараагийн зангилааг заалгана. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах
  • 114. Тайлбар: 2. 2. Хайлт зогссон үед хэрвээ nextCurr заагч NULL утгыг зааж байвал өгөгдсөн элемэнт жагсаалтад байхгүй байна. 2. 3. Хайлт зогссон үед хэрвээ nextCurr болон эхлэлийн заагчуудын зааж буй утга адил үед эхний элемэнтийн өмнө зангилаа байхгүй тул үйлдэл гүйцэтгэх боломжгүй. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах
  • 115. Тайлбар: 2. 3. Хайлт зогссон үед хэрвээ nextCurr заагчийн element талбарын утга өгөгдсөн элемэнттэй тэнцүү буюу хайсан зангилаа олдсон бол: 2. 3. 1. Хэрвээ curr болон head заагчуудын зааж буй зангилаа нь адил үед эхлэлийн заагчийг дараагийн элемэнтэд шилжүүлнэ. 2. 3. 2. Хэрвээ curr болон head заагчуудын зааж буй зангилаа нь адил биш үед prevCurr заагчийн зааж буй зангилааны заагч талбараар nextCurr заагчийн зааж буй зангилааг заалгана. 2. 4. curr заагчийн зааж буй зангилааг санах ойгоос чөлөөлөх буюу устгана. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах
  • 116. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах 100 56 34 head tail 42 nextCurr prevCurr 456 curr
  • 117. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах 100 56 34 head tail 42 nextCurr prevCurr Өгөгдсөн элемэнт: 100 456 curr
  • 118. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах 100 56 34 head tail 42 nextCurr prevCurr Өгөгдсөн элемэнт: 456 456 curr
  • 119. НХЖ-ын өгөгдсөн элемэнтийн өмнөх элемэнтийг устгах 100 56 34 head tail 42 nextCurr prevCurr 456 curr
  • 120. void SinglyLinkedList::DeleteAfter(Data key) { if(IsEmpty()==false){ SLNode *prevCurr = NULL; SLNode *curr = head; while (curr!= NULL && prevCurr->element!=key) { prevCurr = curr; curr=curr->next; } if (curr == NULL) cout<<"key element oldsongui"<<endl; НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах
  • 121. if (prevCurr == tail) cout<<"key elementiin hoino element bhgui bna"<<endl; else if (prevCurr->element == key){ prevCurr->next=curr->next; delete curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах
  • 122. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд хоёр туслах заагчийг ашиглана. • curr – устгах зангилааг заалгана. • prevCurr – устгах элемэнтийн өмнөх зангилааг заалгана. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах
  • 123. Тайлбар: 2. 2. Хайлт зогссон үед хэрвээ curr заагч NULL утгыг зааж байвал өгөгдсөн элемэнт жагсаалтад байхгүй байна. 2. 3. Хайлт зогссон үед хэрвээ prevCurr болон төгсгөлийн заагчуудын зааж буй зангилаа нь адил бол төгсгөлийн элемэнтийн ард зангилаа байхгүй тул үйлдэл гүйцэтгэх боломжгүй. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах
  • 124. Тайлбар: 2. 3. Хайлт зогссон үед хэрвээ prevCurr заагчийн зааж буй зангилааны element талбарын утга өгөгдсөн элемэнттэй тэнцүү буюу хайсан зангилаа олдсон бол prevCurr заагчийн зааж буй зангилааны заагч талбараар curr заагчийн зааж буй зангилааг заалгана. 2. 4. curr заагчийн зааж буй зангилааг санах ойгоос чөлөөлөх буюу устгана. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах
  • 125. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr
  • 126. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 42
  • 127. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 42
  • 128. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 42
  • 129. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 42
  • 130. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 42
  • 131. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 56
  • 132. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 56
  • 133. НХЖ-ын өгөгдсөн элемэнтийн ардах элемэнтийг устгах 100 56 34 head tail 42 prevCurr 456 curr Өгөгдсөн элемэнт: 56
  • 134. void SinglyLinkedList::DeleteItem(Data key) { if(IsEmpty()==false){ SLNode *prevCurr = NULL; SLNode *curr = head; while (curr != NULL && curr->element != key) { prevCurr = curr; curr=curr->next; } if (curr == NULL) cout<<"key element oldsongui"<<endl; if (curr == tail) tail=prevCurr; НХЖ-ын өгөгдсөн элемэнтийг устгах
  • 135. if(curr==head) head=prevCurr; if (curr->element == key){ prevCurr->next=curr->next; delete curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн элемэнтийг устгах
  • 136. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд хоёр туслах заагчийг ашиглана. • curr – устгах зангилааг заалгана. • prevCurr – устгах элемэнтийн өмнөх зангилааг заалгана. НХЖ-ын өгөгдсөн элемэнтийг устгах
  • 137. Тайлбар: 2. 2. Хайлт зогссон үед хэрвээ curr заагч NULL утгыг зааж байвал өгөгдсөн элемэнт жагсаалтад байхгүй байна. 2. 3. Хайлт зогссон үед хэрвээ curr болон эхлэлийн заагчуудын зааж буй зангилаа нь адил бол эхлэлийн заагчийг дараагийн элемэнтэд шилжүүлнэ. 2. 4. Хайлт зогссон үед хэрвээ curr болон төгсгөлийн заагчуудын зааж буй зангилаа нь адил бол төгсгөлийн заагчийг өмнөх элемэнтэд шилжүүлнэ. НХЖ-ын өгөгдсөн элемэнтийг устгах
  • 138. Тайлбар: 2. 4. Хайлт зогссон үед хэрвээ curr заагчийн зааж буй зангилааны element талбарын утга өгөгдсөн элемэнттэй тэнцүү буюу хайсан зангилаа олдсон бол prevCurr заагчийн зааж буй зангилааны заагч талбараар curr заагчийн зааж буй зангилааг заалгана. 2. 5. curr заагчийн зааж буй зангилааг санах ойгоос чөлөөлөх буюу устгана. НХЖ-ын өгөгдсөн элемэнтийг устгах
  • 139. void SinglyLinkedList::DeletePosition(int pos) { if(IsEmpty()==false){ int i=1; SLNode *prevCurr = NULL; SLNode *curr = head; while (curr != NULL && i!= pos) { prevCurr = curr; curr=curr->next; i++; } if (curr == NULL) cout<<"bairlal oldsongui"<<endl; НХЖ-ын өгөгдсөн байрлал дахь элемэнтийг устгах
  • 140. if (i == pos){ if(curr==head) head=curr->next; else prevCurr->next=curr->next; if(curr==tail) tail=prevCurr; delete curr; } } else cout<<"SinglyLinkedList is empty"<<endl; } НХЖ-ын өгөгдсөн байрлал дахь элемэнтийг устгах
  • 141. Тайлбар: 1. Жагсаалт хоосон эсэхийг шалгана. 2. А. Жагсаалт хоосон бол SinglyLinkedList is empty мэдээллийг хэвлэнэ. 2. В. Хоосон биш бол дараах алхамуудыг гүйцэтгэнэ. 2. 1. Өгөгдсөн элемэнтийг хайна. Үүний тулд хоёр туслах заагч, нэг хувьсагч ашиглана. • curr – устгах зангилааг заалгана. • prevCurr – устгах элемэнтийн өмнөх зангилааг заалгана. • i – элемэнтүүдийн байрлалыг тодорхойлох тоолуур НХЖ-ын өгөгдсөн байрлал дахь элемэнтийг устгах
  • 142. Тайлбар: 2. 2. Хайлт зогссон үед хэрвээ curr заагч NULL утгыг зааж байвал жагсаалтад өгөгдсөн байрлал байхгүй байна. 2. 3. Хайлт зогссон үед хэрвээ тоолуур хувьсагчийн утга өгөгдсөн байрлалтай тэнцүү үед: 2. 3. 1. хэрвээ curr болон эхлэлийн заагчуудын зааж буй зангилаа нь адил бол эхлэлийн заагчийг дараагийн элемэнтэд шилжүүлнэ. 2. 3. 2. хэрвээ curr болон төгсгөлийн заагчуудын зааж буй зангилаа нь адил бол төгсгөлийн заагчийг өмнөх элемэнтэд шилжүүлнэ. НХЖ-ын өгөгдсөн байрлал дахь элемэнтийг устгах
  • 143. Тайлбар: 2. 3. 3. дээрх хоёр нөхцлийн аль нь ч биш тохиодолд prevCurr заагчийн зааж буй зангилааны заагч талбараар curr заагчийн зааж буй зангилааг заалгана. 2. 4. curr заагчийн зааж буй зангилааг санах ойгоос чөлөөлөх буюу устгана. НХЖ-ын өгөгдсөн байрлал дахь элемэнтийг устгах