Хоёр холбоост жагсаалт

        Лекц №9
                   LOGO
Хичээлийн агуулга




Багш: В.Нямсүрэн
Нэг холбоост ба цикл
жагсаалтын бэрхшээл
 Нэг холбоост ба цикл жагсаалтуудын хувьд
  буцаж   өмнөх     элемэнтүүдрүүгээ дамжих
  боломжгүй байдаг.

 Хэрвээ одоогийн идэвхитэй элемэнтийн яг
  өмнөх элемэнтрүү хандахын тулд заавал эхний
  элемэнтээс/гадаад    заагч    байрлаж   буй
  элемэнтээс эхлэн элемэнт бүрт дараалан
  хандаж байж тухайн элемэнтэд очно.




Багш: В.Нямсүрэн
Хоёр холбоост жагсаалт
 Жагсаалтын зангилаануудыг хоѐр чиглэлд
  холбогддог байхаар зохион байгуулж болно.
 Зангилаа бүр нь өмнө болон хойно орших
  зангилааныхаа хаягийг агуулдаг элемэнтүүдийн
  тогтоцыг хоёр холбоост жагсаалт /ХХЖ/ буюу
  давхар жагсаалт гэнэ.

              100   56      34       456

 Хоѐр   холбоост    жагсаалт    нь    хэдийгээр
  жагсаалтын дурын элемэнтэд хандах боломжгүй
  хэдий ч хоѐр чиглэлтэй учир хийгдэх
  үйлдлүүдийн хувьд илүү уян хатан юм.
Багш: В.Нямсүрэн
Хоёр холбоост жагсаалт
 Хоѐр холбоост жагсаалтын эхний элемэнтэд
  өмнөх элемэнт, төгсгөлийн элемэнтэд дараагийн
  элемэнт гэж байхгүй учраас тэдгээр зангилааны
  харгалзах заагч талбарууд нь хоосон буюу NULL
  утгыг заавал агуулсан байх ѐстой.



              100   56     34       456




Багш: В.Нямсүрэн
Хоёр холбоост
жагсаалтын зангилаа
 Хоѐр холбоост жагсаалтын зангилаа нь гурван
  хэсгээс бүрдэнэ.

                   back – өмнөх элемэнтийн санах ойн
                   үүрний хаягийг агуулах заагч талбар


    456            info – өгөгдөл      буюу   мэдээллийг
                   агуулах талбар


                   next – дараагийн элемэнтийн санах
                   ойн үүрний хаягийг агуулах заагч талбар

Багш: В.Нямсүрэн
Хоёр холбоост жагсаалтын
зангилааг илэрхийлэх:
 Хоѐр холбоост жагсаалтын зангилааг    дараах
  DLNode классаар тодорхойлъѐ
class DLNode{
   Data info;
   DLNode* prev;
   DLNode* next;
   DLNode(Data ivalue, DLNode*pvalue,
                 DLNode* nvalue) {
     info=ivalue;
     prev=pvalue;
     next=nvalue;
   }
   friend class DoubleLinkedList;
};
Багш: В.Нямсүрэн
Хоёр холбоост жагсаалтыг
зохион байгуулах
 Хоѐр холбоост жагсаалтыг зохион байгуулахдаа
  дараах гадаад заагчуудыг ашиглана.
     хуй
                   head – эхлэлийн заагч



                   tail – төгсгөлийн заагч



                   curr – туслах заагч

Багш: В.Нямсүрэн
Нэг холбоост жагсаалтад
хийгдэх үйлдлүүд
 Дараах үйлдлүүдийг хоѐр чиглэлд гүйцэтгэх
  боломжтой. /Ө.х эхлэлээс төгсгөлрүү эсвэл
  төгсгөлөөс эхлэлрүү/
ХХЖ-ыг хоослох – MakeEmpty()

ХХЖ-аас элемэнт хайх – FindItem()

ХХЖ-ын элемэнтийн тоог буцаах – Count()

ХХЖ-ын элемэнтүүдийг хэвлэх – Print()

Багш: В.Нямсүрэн
ХХЖ-ыг илэрхийлэх
хийсвэр төрлийг тодорхойлох
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;
}

Багш: В.Нямсүрэн
ХХЖ-ыг хоослох

                      curr




           head                   tail


               100   56      34     456




Багш: В.Нямсүрэн
ХХЖ-ыг хоослох

                      curr




          head                    tail


               100   56      34     456




Багш: В.Нямсүрэн
ХХЖ-ыг хоослох




          head            tail    curr


               100   56      34




Багш: В.Нямсүрэн
ХХЖ-ыг хоослох




          head       tail    curr


               100      56




Багш: В.Нямсүрэн
ХХЖ-ыг хоослох




           tail
          head       curr


               100




Багш: В.Нямсүрэн
ХХЖ-ыг хоослох




 tail
head         curr




Багш: В.Нямсүрэн
ХХЖ-ын эхэнд
элемэнт нэмэх
void DoubleLinkedList::AddFirst(Data item){
  DLNode *curr=new DLNode(item, NULL, head);
     if(IsEmpty())
          tail = curr;
     else
          head->prev = curr;
     head = curr;
}




Багш: В.Нямсүрэн
ХХЖ-ын эхэнд
элемэнт нэмэх
                   curr    head   tail


                   100



         curr             head            tail


        100                 56      ...    456


Багш: В.Нямсүрэн
ХХЖ-ын өгөгдсөн элемэнтийн
өмнө элемэнт нэмж оруулах
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;
       }
}

Багш: В.Нямсүрэн
ХХЖ-ын эхэнд
  элемэнт нэмэх
prevCurr                 Өгөгдсөн элемэнт:     40
                         Шинэ элемэнт:         100




nextCurr
  head                                       tail


       56           36    40       12         456

 Багш: В.Нямсүрэн
ХХЖ-ын эхэнд
  элемэнт нэмэх

                               Өгөгдсөн элемэнт:     40
                               Шинэ элемэнт:         100




prevCurr            nextCurr
  head                                             tail


       56             36        40       12         456

 Багш: В.Нямсүрэн
ХХЖ-ын эхэнд
элемэнт нэмэх

                        curr    Өгөгдсөн элемэнт:     40
                                Шинэ элемэнт:         100

                        100


               prevCurr    nextCurr
 head                                         tail


      56           36          40      12       456

Багш: В.Нямсүрэн
ХХЖ-ын төгсгөлийн
элемэнтийг устгах
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";
}
Багш: В.Нямсүрэн

Dsi lec9-copy

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