SlideShare una empresa de Scribd logo
1 de 28
Хоёр холбоост жагсаалт

        Лекц №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";
}
Багш: В.Нямсүрэн

Más contenido relacionado

La actualidad más candente

семинар 7
семинар 7семинар 7
семинар 7boogii79
 
семинар9
семинар9семинар9
семинар9boogii79
 
2012 09 10 тоон дараалл хязгаар лекц№2
2012 09 10 тоон дараалл хязгаар лекц№22012 09 10 тоон дараалл хязгаар лекц№2
2012 09 10 тоон дараалл хязгаар лекц№2Э. Гүнтулга
 
семинар 8
семинар 8семинар 8
семинар 8boogii79
 
Лаборатор-3
Лаборатор-3Лаборатор-3
Лаборатор-3bsuren_bn
 
Олон хувьсагчтай функцийн уламжлал ба дифференциал
Олон хувьсагчтай функцийн уламжлал ба дифференциалОлон хувьсагчтай функцийн уламжлал ба дифференциал
Олон хувьсагчтай функцийн уламжлал ба дифференциалBattur
 
Эх функц ба тодорхой биш интеграл
Эх функц ба тодорхой биш интегралЭх функц ба тодорхой биш интеграл
Эх функц ба тодорхой биш интегралBattur
 
Day 3 php working with string, number
Day 3   php working with string, numberDay 3   php working with string, number
Day 3 php working with string, numberETC
 
Олон хувьсагчтай функцийн нөхцөлт экстремум, интеграл
Олон хувьсагчтай функцийн нөхцөлт экстремум, интегралОлон хувьсагчтай функцийн нөхцөлт экстремум, интеграл
Олон хувьсагчтай функцийн нөхцөлт экстремум, интегралBattur
 
Лабораторийн ажил № 1
Лабораторийн ажил № 1Лабораторийн ажил № 1
Лабораторийн ажил № 1bsuren_bn
 
Лабораторийн ажил № 2
Лабораторийн ажил № 2Лабораторийн ажил № 2
Лабораторийн ажил № 2bsuren_bn
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргуудBayalagmaa Davaanyam
 

La actualidad más candente (19)

семинар 7
семинар 7семинар 7
семинар 7
 
Өгөгдлийн бүтэц 13
Өгөгдлийн бүтэц 13Өгөгдлийн бүтэц 13
Өгөгдлийн бүтэц 13
 
семинар9
семинар9семинар9
семинар9
 
2012 09 10 тоон дараалл хязгаар лекц№2
2012 09 10 тоон дараалл хязгаар лекц№22012 09 10 тоон дараалл хязгаар лекц№2
2012 09 10 тоон дараалл хязгаар лекц№2
 
семинар 8
семинар 8семинар 8
семинар 8
 
Лаборатор-3
Лаборатор-3Лаборатор-3
Лаборатор-3
 
Олон хувьсагчтай функцийн уламжлал ба дифференциал
Олон хувьсагчтай функцийн уламжлал ба дифференциалОлон хувьсагчтай функцийн уламжлал ба дифференциал
Олон хувьсагчтай функцийн уламжлал ба дифференциал
 
Эх функц ба тодорхой биш интеграл
Эх функц ба тодорхой биш интегралЭх функц ба тодорхой биш интеграл
Эх функц ба тодорхой биш интеграл
 
Dsi lec7
Dsi lec7Dsi lec7
Dsi lec7
 
Day 3 php working with string, number
Day 3   php working with string, numberDay 3   php working with string, number
Day 3 php working with string, number
 
Олон хувьсагчтай функцийн нөхцөлт экстремум, интеграл
Олон хувьсагчтай функцийн нөхцөлт экстремум, интегралОлон хувьсагчтай функцийн нөхцөлт экстремум, интеграл
Олон хувьсагчтай функцийн нөхцөлт экстремум, интеграл
 
Лабораторийн ажил № 1
Лабораторийн ажил № 1Лабораторийн ажил № 1
Лабораторийн ажил № 1
 
Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11
 
Лабораторийн ажил № 2
Лабораторийн ажил № 2Лабораторийн ажил № 2
Лабораторийн ажил № 2
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд
 
lab8
lab8lab8
lab8
 
Mt102 lekts14
Mt102 lekts14Mt102 lekts14
Mt102 lekts14
 
Mt102 lekts3
Mt102 lekts3Mt102 lekts3
Mt102 lekts3
 
бие даалт
бие даалтбие даалт
бие даалт
 

Destacado

Dsi lec5
Dsi lec5Dsi lec5
Dsi lec5ggmo86
 
Dsi lec14
Dsi lec14Dsi lec14
Dsi lec14ggmo86
 
Dsi lec1
Dsi lec1Dsi lec1
Dsi lec1ggmo86
 
Dsi lec2
Dsi lec2Dsi lec2
Dsi lec2ggmo86
 
Dsi lec3
Dsi lec3Dsi lec3
Dsi lec3ggmo86
 
Dsi lec4
Dsi lec4Dsi lec4
Dsi lec4ggmo86
 
Sodko111
Sodko111Sodko111
Sodko111sodko27
 
Өгөгдлийн бүтэц
Өгөгдлийн бүтэцӨгөгдлийн бүтэц
Өгөгдлийн бүтэцMuuluu
 

Destacado (10)

Dsi lec5
Dsi lec5Dsi lec5
Dsi lec5
 
Dsi lec14
Dsi lec14Dsi lec14
Dsi lec14
 
Dsi lec1
Dsi lec1Dsi lec1
Dsi lec1
 
Dsi lec2
Dsi lec2Dsi lec2
Dsi lec2
 
Dsi lec3
Dsi lec3Dsi lec3
Dsi lec3
 
Dsi lec4
Dsi lec4Dsi lec4
Dsi lec4
 
Blog ds-tod
Blog ds-todBlog ds-tod
Blog ds-tod
 
Sodko111
Sodko111Sodko111
Sodko111
 
Өгөгдлийн бүтэц
Өгөгдлийн бүтэцӨгөгдлийн бүтэц
Өгөгдлийн бүтэц
 
Datastructure algoritm
Datastructure algoritmDatastructure algoritm
Datastructure algoritm
 

Dsi lec9-copy

  • 3. Нэг холбоост ба цикл жагсаалтын бэрхшээл  Нэг холбоост ба цикл жагсаалтуудын хувьд буцаж өмнөх элемэнтүүдрүүгээ дамжих боломжгүй байдаг.  Хэрвээ одоогийн идэвхитэй элемэнтийн яг өмнөх элемэнтрүү хандахын тулд заавал эхний элемэнтээс/гадаад заагч байрлаж буй элемэнтээс эхлэн элемэнт бүрт дараалан хандаж байж тухайн элемэнтэд очно. Багш: В.Нямсүрэн
  • 4. Хоёр холбоост жагсаалт  Жагсаалтын зангилаануудыг хоѐр чиглэлд холбогддог байхаар зохион байгуулж болно.  Зангилаа бүр нь өмнө болон хойно орших зангилааныхаа хаягийг агуулдаг элемэнтүүдийн тогтоцыг хоёр холбоост жагсаалт /ХХЖ/ буюу давхар жагсаалт гэнэ. 100 56 34 456  Хоѐр холбоост жагсаалт нь хэдийгээр жагсаалтын дурын элемэнтэд хандах боломжгүй хэдий ч хоѐр чиглэлтэй учир хийгдэх үйлдлүүдийн хувьд илүү уян хатан юм. Багш: В.Нямсүрэн
  • 5. Хоёр холбоост жагсаалт  Хоѐр холбоост жагсаалтын эхний элемэнтэд өмнөх элемэнт, төгсгөлийн элемэнтэд дараагийн элемэнт гэж байхгүй учраас тэдгээр зангилааны харгалзах заагч талбарууд нь хоосон буюу NULL утгыг заавал агуулсан байх ѐстой. 100 56 34 456 Багш: В.Нямсүрэн
  • 6. Хоёр холбоост жагсаалтын зангилаа  Хоѐр холбоост жагсаалтын зангилаа нь гурван хэсгээс бүрдэнэ. back – өмнөх элемэнтийн санах ойн үүрний хаягийг агуулах заагч талбар 456 info – өгөгдөл буюу мэдээллийг агуулах талбар next – дараагийн элемэнтийн санах ойн үүрний хаягийг агуулах заагч талбар Багш: В.Нямсүрэн
  • 7. Хоёр холбоост жагсаалтын зангилааг илэрхийлэх:  Хоѐр холбоост жагсаалтын зангилааг дараах DLNode классаар тодорхойлъѐ class DLNode{ Data info; DLNode* prev; DLNode* next; DLNode(Data ivalue, DLNode*pvalue, DLNode* nvalue) { info=ivalue; prev=pvalue; next=nvalue; } friend class DoubleLinkedList; }; Багш: В.Нямсүрэн
  • 8. Хоёр холбоост жагсаалтыг зохион байгуулах  Хоѐр холбоост жагсаалтыг зохион байгуулахдаа дараах гадаад заагчуудыг ашиглана.  хуй head – эхлэлийн заагч tail – төгсгөлийн заагч curr – туслах заагч Багш: В.Нямсүрэн
  • 9. Нэг холбоост жагсаалтад хийгдэх үйлдлүүд  Дараах үйлдлүүдийг хоѐр чиглэлд гүйцэтгэх боломжтой. /Ө.х эхлэлээс төгсгөлрүү эсвэл төгсгөлөөс эхлэлрүү/ ХХЖ-ыг хоослох – MakeEmpty() ХХЖ-аас элемэнт хайх – FindItem() ХХЖ-ын элемэнтийн тоог буцаах – Count() ХХЖ-ын элемэнтүүдийг хэвлэх – Print() Багш: В.Нямсүрэн
  • 10. ХХЖ-ыг илэрхийлэх хийсвэр төрлийг тодорхойлох class DoubleLinkedList{ DLNode *head; DLNode *tail; public: DoubleLinkedList (); ~DoubleLinkedList (); bool IsEmpty(); void MakeEmpty(); Data First(); Data Last(); void AddFirst(Data item); void AddLast (Data item); void AddAfter(Data key, Data item); void AddBefore(Data key, Data item); Багш: В.Нямсүрэн
  • 11. ХХЖ-ыг илэрхийлэх хийсвэр төрлийг тодорхойлох void AddPosition( int pos, Data item); void RemoveFirst(); void RemoveLast (); void RemoveItem(Data key); void RemoveBefore(Data key); void RemoveAfter(Data key); void RemovePosition(int key); bool FindForward(); bool FindBackward(); int CountForward(); int CountBackward(); void PrintForward(); void PrintBackward(); }; Багш: В.Нямсүрэн
  • 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. ХХЖ-ын эхэнд элемэнт нэмэх void DoubleLinkedList::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. ХХЖ-ын төгсгөлийн элемэнтийг устгах 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"; } Багш: В.Нямсүрэн