Dsi lec6,7
- 3. Жагсаалт
Элемэнтүүд нь санах ойд дэс дараалан байрлах
албагүй бөгөөд элемэнтүүд нь санах ойд
динамикаар үүсдэг шугаман зохион
байгуулалттай элемэнтүүдийн олонлогийг
жагсаалт гэнэ.
Динамикаар үүссэн элемэнтүүдийн дарааллыг
холбоос буюу заагчаар тодорхойлдог.
Багш: Т.Гантөр
- 4. Жагсаалтын ангилал
Жагсаалтыг холбоосоор нь дараах
байдлаар ангилдаг:
Нэг холбоост жагсаалт
/Singly Linked List/
Цикл жагсаалт /Circular
Linked List
Давхар холбоост жагсаалт
/Doubly Linked List/
Багш: Т.Гантөр
- 5. Нэг холбоост жагсаалт
Нэг холбоост жагсаалтын элемэнт буюу
зангилаа нь өгөгдөл ба холбоос/заагч/ гэсэн
хоѐр хэсгээс тогтоно.
100
Өгөгдөл
100
Багш: Т.Гантөр
- 6. Нэг холбоост жагсаалт
Зангилаа бүрийн заагч нь дараачийн зангилааг
заадаг өгөгдлүүдийн цэгцлэгдсэн тогтоцыг нэг
холбоост жагсаалт /НХЖ/ буюу шугаман
жагсаалт гэнэ.
100 56 34 456
Өөрөөр хэлбэл дэс дараалан ар араасаа
холбогдсон элемэнтүүдийн тогтоц юм.
Багш: Т.Гантөр
- 7. Нэг холбоост жагсаалт
Жагсаалтын зангилааны өгөгдөл нь өгөгдөл
буюу утгыг агуулах бөгөөд тухайн утгын төрөл
бүхэл тоо, бодит тоо, тэмдэгт мөр зэрэг үндсэн
өгөгдлийн төрлүүдээс гадна хэрэглэгийн
тодорхойлсон ямар ч төрөлтэй байж болно.
typedef int Data;
100 56 34 456
typedef char Data;
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; Өгөгдөл агуулах талбар
100
SLNode *next; Дараагийн зангилааг
заах заагч талбар
SLNode SLNode SLNode
100 100 100
Багш: Т.Гантөр
- 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. Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
Өгөгдсөн элемэнтийн
Жагсаалтын өмнөх
эхлэлээс устггах DeleteBefore()
DeleteFirst()
Өгөгдсөн элемэнтийн
ардах
НХЖ-аас DeleteAfter()
Жагсаалтын
элемэнт
дундаас устгах
устгах Өгөгдсөн байрлал
дахь
DeletePosition()
Жагсаалтын
төгсгөлөөс
устгах Өгөгдсөн утгатай
DeleteLast() DeleteItem()
Багш: Т.Гантөр
- 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();
};
Багш: Т.Гантөр
- 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/-ийг
ашиглан эхлэлийн элемэнтээс эхлэн
элемэнтүүдийг нэг нэгээр санах ойгоос чөлөөлнө.
Бүх элемэнтүүдийг чөлөөлсний дараа хоосон
жагсаалт үлдэнэ.
Багш: Т.Гантөр
- 24. НХЖ-ыг санах ойгоос
бүрэн чөлөөлөх устгагч функц:
curr head tail
56 ... 34 456
Багш: Т.Гантөр
- 29. Нэг холбоост жагсаалт
Устгагч функц:
Тайлбар:
Устгагч функц нь байгуулагч функцээр болон
тухайн хийсвэр төрлөөр санах ойд
хуваарилагсдсан хувьсагчдыг санах ойгоос
чөлөөлнө.
currtail
head
Багш: Т.Гантөр
- 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. В. Харин жагсаалт хоосон биш буюу элемэнттэй
бол эхлэлийн заагчийг шинэ элемэнтэд
шилжүүлнэ.
Багш: Т.Гантөр
- 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. В. Харин жагсаалт хоосон биш буюу элемэнттэй
бол төгсгөлийн элемэнтийн заагч талбараар
шинэ элемэнтийг заалган, төгсгөлийн
заагчийг шинэ элемэнтэд шилжүүлнэ.
Багш: Т.Гантөр
- 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. НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
prevCurr
Өгөгдсөн элемэнт: 156
Шинэ элемэнт: 42
nextCurr
head tail
100 56 ... 456 34
Багш: Т.Гантөр
- 41. НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
prevCurr nextCurr
head tail
100 56 ... 456 34
Багш: Т.Гантөр
- 42. НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
prevCurr
nextCurr
head tail
100 56 ... 456 34
Багш: Т.Гантөр
- 43. НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
prevCurr
nextCurr
head tail
100 56 ... 456 34
Багш: Т.Гантөр
- 44. НХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
Өгөгдсөн элемэнт: 56
Шинэ элемэнт: 42
prevCurr
nextCurr
head tail
100 56 ... 456 34
Өгөгдсөн элемэнт олдсонгүй!!!
Багш: Т.Гантөр
- 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. Харин өгөгдсөн элемэнт олдвол шинэ
элемэнтийн санах ойд хуваарилж, түүний
заагч талбараар шинэ элемэнтийг заалгана.
Мөн өгөгдсөн элемэнтийн өмнөх элемэнтийн
заагч талбараар шинэ элемэнтийг заалгана.
Багш: Т.Гантөр
- 52. НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42 curr
42
prevCurr nextCurr
head tail
100 56 456 34
Багш: Т.Гантөр
- 53. НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
Өгөгдсөн элемэнт:456
Шинэ элемэнт: 42 curr
42
prevCurr nextCurr
head tail
100 56 456 34
Багш: Т.Гантөр
- 54. НХЖ-ын өгөгдсөн элемэнтийн
хойно элемэнт нэмж оруулах
Өгөгдсөн элемэнт: 456
Шинэ элемэнт: 42
prevCurr nextCurr
head curr tail
100 56 456 42 34
Багш: Т.Гантөр
- 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. Харин өгөгдсөн байрлал олдвол шинэ
элемэнтийн санах ойд хуваарилж, түүний
заагч талбараар шинэ элемэнтийг заалгана.
Мөн өгөгдсөн элемэнтийн өмнөх элемэнтийн
заагч талбараар шинэ элемэнтийг заалгана.
Багш: Т.Гантөр
- 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
талбарын утгыг хэвлэнэ.
Багш: Т.Гантөр
- 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. Хайлтыг явуулж буй давталт дуусах үед
туслах заагчын зааж буй зангилааны элемэнт
талбарын утга өгөгдсөн элемэнттэй тэнцүү
үед өгөгдсөн утга жагсаалтад байна.
Багш: Т.Гантөр
- 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. В. Хоосон биш бол туслах туслах заагчийн
тусламжтайгаар жагсаалтын эхлэлээс төгсгөл
хүртэл элемэнтүүдэд дараалан хандах замаар
тоолон, тоог буцаана.
Багш: Т.Гантөр
- 94. НХЖ-ын эхний элемэнтийн
утгыг буцаах
Data SinglyLinkedList::First ()
{
if (IsEmpty()==true)
cout<<"SinglyLinkedList is empty";
return head->element;
}
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол эхлэлийн заагчийн зааж буй
зангилааны элемэнт талбарын утгыг буцаана.
Багш: Т.Гантөр
- 96. НХЖ-ын төгсгөлийн
элемэнтийн утгыг буцаах
Data SinglyLinkedList::Last ()
{
if (tail == NULL)
cout<<"SinglyLinkedList is
empty";
return tail->element;
}
Тайлбар:
1. Жагсаалт хоосон эсэхийг шалгана.
2. А. Жагсаалт хоосон бол SinglyLinkedList is
empty мэдээллийг хэвлэнэ.
2. В. Хоосон биш бол төгсгөлийн заагчийн зааж буй
зангилааны элемэнт талбарын утгыг буцаана.
Багш: Т.Гантөр
- 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 заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
Багш: Т.Гантөр
- 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 заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
Багш: Т.Гантөр
- 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 заагчийн зааж буй зангилааг санах ойгоос
чөлөөлөх буюу устгана.
Багш: Т.Гантөр