SlideShare a Scribd company logo
Лекц №16
Сэдэв: Өгөгдлийн бүтэц-Холбоост жагсаалт,
мод
Өгөгдлийн бүтэц
Өгөгдлийн бүтэц
Өгөгдлийг компьютерийн санах ойд хадгалахад:
1. Өгөгдөл бүхлээрээ дараалсан байтуудад,
2. Тодорхой дараалалгүй энд тэнд тархсан байдлаар хадгалах хоёр
үндсэн зам байдаг.
Санах ойд дараалсан байдалтай өгөгдлийг МАССИВ, тархай байрлалтай
өгөгдлийг ХОЛБООСТ дүрслэлээр хадгалахад тохиромжтой байдаг.
Холбоост
жагсаалт
/Linked List/
Холбоост жагсаалт
Холбоост /Linked/:
Тархай салангид элементүүдийг нэгтгэж нэгдмэл нэг өгөгдөл болгоход
холбоосыг хэрэглэдэг. Холбоос гэдэг нь нэг элементийн дараагийн
дараагийн элемент санах ойн хаана байгааг заасан хаяг юм. Элемент,
холбоос гэсэн хосууд гинж байдлаар залгагдаж өгөгдлийг бүрдүүлдэг. Нэг
хосод хэдэн холбоос байгаагаас нь хамааруулж дан болон давхар холбоост
дүрслэл үүсдэг. Давхар холбоосоор дараачийн элемент төдийгүй өмнөх
элементэд хүрч болдог.
Холбоост жагсаалт
- Жагсаалт/List/
Өгөгдлийн хамгийн түгээмэл бүтэц бол шугаман жагсаалт. Жишээ:
Оюутны нэрс, сурлагын дүн, хоолны цэс, номын нэрс г.м. бүгд жагсаалт юм
Холбоост жагсаалт
Нэг холбоост жагсаалт /Single Linked List/
Элемент буюу зангилаа нь өгөгдөл ба холбоос гэсэн 2 хэсгээс тогтоно.
Өгөгдөл нь бидний мэдэх өгөгдлийн стандарт төрлүүдээр тодорхойлогдсон
утга байх ба хэрэглэгчийн тодорхойлсон төрөл байж болно. Харин холбоос
нь заагч төрөлтэй байх ба дараагийн зангилааны хаягийг заана. Нэг
холбоост жагсаалт нь тухайн элементээс өмнөх элементүүдийг авах
боломжгүй байдаг ба заагч ашиглан дараагийн элементийг устгах, нэмэх
үйлдэл хийж болно.
Холбоост жагсаалт
Нэг холбоост жагсаалт /Single Linked List/
Холбоост жагсаалт
Нэг холбоост жагсаалт
Бичигдэх хэлбэр:
struct node
{
int data;
struct node *next;
}
Холбоост жагсаалт
Гурван гишүүнтэй нэг холбоос бүхий жагсаалтыг дараах байдлаар үүсгэж
болно.
/* Зангилааг зарлах */
struct node *head;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;
/* Санах ойг хувиарлах */
one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));
/* Утгуудыг оруулах хэсэг*/
one->data = 1;
two->data = 2;
three->data = 3;
/* Зангилаануудыг холбох*/
one->next = two;
two->next = three;
three->next = NULL;
/* Эхний зангилааны хаягыг хадгалж
байна*/
head = one;
Холбоост жагсаалт
Хоёр холбоост жагсаалт /Double Linked List/
Нэг холбоост жагсаалтын шийдэж чадаагүй өмнөх элементээ авах
асуудлыг шийдсэн боловч дурын элементэд шууд хандах боломжгүй заагч
ашиглан тухайн элементийн өмнөх болон дараагийн элементүүдэд хандаж
элемент нэмэх болон устгах үйлдэлийг шийдсэн
Холбоост жагсаалт
Хоёр холбоост жагсаалт /Double Linked List/
Холбоост жагсаалт
Хоёр холбоост жагсаалт
Бичигдэх хэлбэр:
struct node
{
int data;
struct node *next;
struct node *prev;
}
Холбоост жагсаалт
Гурван гишүүнтэй хоёр холбоос бүхий жагсаалтыг дараах байдлаар үүсгэж
болно.
/* Зангилааг зарлах */
struct node *head;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;
/* Санах ойг хувиарлах */
one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));
/* Утгуудыг оруулах хэсэг*/
one->data = 1;
two->data = 2;
three->data = 3;
/* Зангилаануудыг холбох*/
one->next = two;
one->prev = NULL;
two->next = three;
two->prev = one;
three->next = NULL;
three->prev = two;
/* Эхний зангилааны хаягыг хадгалж
байна*/
head = one;
Холбоост жагсаалт
Тойрог холбоост жагсаалт /Circular Linked List/
Сүүлчийн элементийг эхний элементтэй холбосон холбосон дугуй
хэлбэрийн жагсаалтын төрөл юм.
Холбоост жагсаалт
Тойрог холбоост жагсаалт
Дугуй холбосон жагсаалтыг нэг нь хоёр холбоосоор холбож болно.
• Нэг холбоост жагсаалтын хувьд сүүлчийн зүйлийн дараагийн заагч нь
эхний зүйлийг зааж өгнө
• Хоёр холбоост жагсаалтад эхний зүйлийн өмнөх заагч нь сүүлчийн
зүйлийг мөн зааж өгнө.
Холбоост жагсаалт
Гурван гишүүнтэй нэг холбоос бүхий тойрог жагсаалтыг дараах байдлаар
үүсгэж болно.
/* Зангилааг зарлах */
struct node *head;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;
/* Санах ойг хувиарлах */
one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));
/* Утгуудыг оруулах хэсэг*/
one->data = 1;
two->data = 2;
three->data = 3;
/* Зангилаануудыг холбох*/
one->next = two;
two->next = three;
three->next = NULL;
/* Эхний зангилааны хаягыг хадгалж
байна*/
head = one;
Холбоост жагсаалт
Холбогдсон жагсаалтад хэрхэн элемент нэмэх вэ?
Холбоост жагсаалтын эхэнд, дунд эсвэл төгсгөлд элемент нэмж болно.
Эхэнд элемент нэмэх
• Шинэ зангилаанд санах ой хуваарилах,
• Өгөгдлийг хадгалах,
• Эхний хэсгийг чиглүүлэхийн тулд дараагийн шинэ зангилааг өөрчлөх,
• Шинээр үүсгэсэн зангилаа руу чиглүүлэхийн тулд эхний хэсгийг өөрчил.
struct node *newNode;
newNode = malloc(sizeof(struct node));
newNode->data = 4;
newNode->next = head;
head = newNode;
Холбоост жагсаалт
Төгсгөлд нь элемент нэмэх
• Шинэ зангилаанд санах ой хуваарилах,
• Өгөгдлийг хадгалах,
• Сүүлийн хэсэг рүү шилжих,
• Сүүлийн зангилааны хажууд шинээр үүсгэсэн зангилаагаар солино.
struct node *newNode;
newNode = malloc(sizeof(struct node));
newNode->data = 4;
newNode->next = NULL;
struct node *temp = head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = newNode;
Холбоост жагсаалт
Дунд хэсэгт элемент нэмэх
• Санах ойг хуваарилах, өгөгдлийг шинэ зангилаанд хадгалах,
• Шинэ зангилааны шаардлагатай байрлалын өмнөхөн зангилаа руу очих,
• Дараагийн заагчийг өөрчилж хооронд нь шинэ зангилаа оруулах.
struct node *newNode;
newNode = malloc(sizeof(struct node));
newNode->data = 4;
struct node *temp = head;
for(int i=2; i < position; i++)
{
if(temp->next != NULL)
{
temp = temp->next; } }
newNode->next = temp->next;
temp->next = newNode;
Холбоост жагсаалт
Холбогдсон жагсаалтаас хэрхэн устгах вэ?
Эхний хэсгээ,төгсгөл хэсгээ, эсвэл тодорхой байрлалаас элемент устгаж
болно.
Эхний хэсгээ элемент нь устгах
Эхнийх эсгийг хоёр дахь зангилаа руу чиглүүл
head = head->next;
Төгсгөл хэсгээс элемент нь хасах
• Сүүлийн хэсэг рүү хоёрдугаарт шилжих
• Дараагийн заагчийг тэг болго
struct node* temp = head;
while(temp->next->next!=NULL){
temp = temp->next; }
temp->next = NULL;
Холбоост жагсаалт
Дундаас нь элемент устгах
• Устгасан элементээс өмнө элемент рүү шилжих
• Дараах заагчийг өөрчилж, гинжнээс зангилаа оруулахгүй
for(int i=2; i< position; i++)
{
if(temp->next!=NULL)
{
temp = temp->next;
}
}
temp->next = temp->next->next;
Жишээ №1: Холбоост жагсаалттай ажиллах
1. #include <stdio.h>
2. #include <stdlib.h>
3. // Create a node
4. struct Node {
5. int item;
6. struct Node* next; };
7. void insertAtBeginning(struct Node** ref, int data) {
8. // Allocate memory to a node
9. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
10. // insert the item
11. new_node->item = data;
12. new_node->next = (*ref);
13. // Move head to new node
14. (*ref) = new_node; }
Жишээ №1: Холбоост жагсаалттай ажиллах
15. // Insert a node after a node
16. void insertAfter(struct Node* node, int data) {
17. if (node == NULL) {
18. printf("the given previous node cannot be NULL");
19. return; }
20. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
21. new_node->item = data;
22. new_node->next = node->next;
23. node->next = new_node; }
24. void insertAtEnd(struct Node** ref, int data) {
25. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
26. struct Node* last = *ref;
27. new_node->item = data;
28. new_node->next = NULL;
29. if (*ref == NULL) {
30. *ref = new_node;
31. return; }
Жишээ №1: Холбоост жагсаалттай ажиллах
32. while (last->next != NULL)
33. last = last->next;
34. last->next = new_node;
35. return;
36. }
37. void deleteNode(struct Node** ref, int key) {
38. struct Node *temp = *ref,
39. *prev;
40. if (temp != NULL && temp->item == key) {
41. *ref = temp->next;
42. free(temp); return; }
43. // Find the key to be deleted
44. while (temp != NULL && temp->item != key){
45. prev = temp; temp = temp->next; }
46. // If the key is not present
47. if (temp == NULL) return;
48. // Remove the node
49. prev->next = temp->next;
50. free(temp); }
51. // Print the linked list
52. void printList(struct Node* node) {
53. while (node != NULL) {
54. printf(" %d ", node->item);
55. node = node->next; } }
56. // Driver program
57. int main() {
58. struct Node* head = NULL;
59. insertAtEnd(&head, 1);
60. insertAtBeginning(&head, 2);
61. insertAtBeginning(&head, 3);
62. insertAtEnd(&head, 4);
63. insertAfter(head->next, 5);
64. printf("Linked list: ");
65. printList(head);
66. printf("nAfter deleting an element: ");
deleteNode(&head, 3);
67. printList(head); }
Жишээ №1: Холбоост жагсаалттай ажиллах
Үр дүн:
Linked list: 3 2 5 1 4
After deleting an element: 2 5 1 4
Мод
/Tree/
Мод
Яагаад мод хэлбэрийн өгөгдлийн бүтэц хэрэгтэй вэ?
Шугаман өгөгдлийн бүтэц болох массив, холбосон жагсаалт, стек,
дарааллаас ялгаатай нь мод нь шаталсан өгөгдлийн бүтэц юм. Шугаман
өгөгдлийн бүтцэд өгөгдлийн хэмжээ ихсэхэд үйлдлийг гүйцэтгэх хугацаа.
ихэсдэг. Модны өгөгдлийн бүтэц нь өгөгдөлд хурдан, хялбар хандах
боломжийг олгодог.
Мод
Moд
Зангилаанууд болон тэдгээрийг холбосон холбоосуудаар дүрслэгдсэн
өгөгдлийн бүтэцийг мод /Tree/ гэнэ. Мод нь өгөгдлийг агуулах зангилаа
/Node/, өөр зангилаатай холбогдох холбоосуудаас /Edge/ тогтоно.
Модны хамгийн эхний зангилааг үндэс буюу язгуур / үндсэн зангилаа
/Root// гэнэ. Модны онцлог нь үндсэн зангилаанаас ямар нэг зангилаанд
хүрэх ганц зам байна.
Холбоос
Зангилаа
Үндсэн
зангилаа
Мод
Зангилааны урт /Height of a Node/
Зангилааны урт нь зангилаанаас хамгийн гүн зангилаа хүртэлх
холбоосуудын тоо юм. Өөрөөр хэлбэл зангилаагаас зангилаа хүртэлх
хамгийн урт зам.
Зангилааны гүн /Depth of a Node/
Зангилааны гүн нь үндсэн зангилаанаас зангилаа хүртэлх холбоосуудын
тоог хэлнэ.
Мод
Moдны өндөр /Height of a tree/
Модны замын урт нь модон дахь бүх зангилааны түвшингүүдийн
нийлбэрээр тодорхойлогддог. Жишээ нь: Дараах нь 3, урт нь
0*1+1*3+2*3+3*1=12 байна.
Түвшин 0
Түвшин 1
Түвшин 2
Түвшин 3
Модны зангилаа бүрийн
өндөр ба гүн
Мод
Зангилааны зэрэг /Degree of a Node/
Зангилааны зэрэг нь тухайн зангилааны нийт салбаруудын тоог хэлнэ.
Ой /Forest/
Салаалсан модны цуглуулгыг ой гэж нэрлэдэг.
Мод
Модны төрөл
Хоёртын мод Хоёртын модны хайлт
AVL мод B-мод
Мод
Хоёртын мод
Модны нэг зангилаанаас гарч болох дэд зангилааны тоо нь хамгийн
ихдээ 2 байх модыг хоёртын мод гэнэ.
Мод
Хоёртын модны төрлүүд
Бүрэн хоёртын мод Төгс хоёртын мод Гүйцэт хоёртын мод
Дутуу мод Муруй хоёртын мод Тэнцвэртэй хоёртын мод
Мод
Хоёртын модонд элемент байрлуулах
Жагсаалтын эхний элемент модны орой болох бөгөөд дараагийн
элементүүд модны орогоос их бол баруун дэд зангилаа, бага бол зүүн дэд
зангилаа үүсгэнэ. Жишээ нь: 50, 60, 40,72, 53, 22, 35, 41, 80, 57, 18
50
6040
725322
35
41
805718
Мод
Хоёртын модны дүрслэл
Хоёртын модны зангилаа нь өгөгдлийг агуулсан бүтцээр дүрслэгддэг
ба ижил төрлийн бусад бүтэц рүү чиглүүлэх хоёр заагч байдаг.
struct node
{
int data;
struct node *left;
struct node *right;
};
Жишээ №2: Хоёртын модны дүрслэл
1. #include <stdio.h>
2. #include <stdlib.h>
3. struct node {
4. int item;
5. struct node* left;
6. struct node* right; };
7. // Inorder traversal
8. void inorderTraversal(struct node* root) {
9. if (root == NULL) return;
10. inorderTraversal(root->left);
11. printf("%d ->", root->item);
12. inorderTraversal(root->right); }
13. // Preorder traversal
14. void preorderTraversal(struct node* root)
{
15. if (root == NULL) return;
16. printf("%d ->", root->item);
17. preorderTraversal(root->left);
18. preorderTraversal(root->right); }
19. // Postorder traversal
20. void postorderTraversal(struct node* root) {
21. if (root == NULL) return;
22. postorderTraversal(root->left);
23. postorderTraversal(root->right);
24. printf("%d ->", root->item); }
25. // Create a new Node
26. struct node* createNode(value) {
27. struct node* newNode = malloc(sizeof(struct node));
28. newNode->item = value;
29. newNode->left = NULL;
30. newNode->right = NULL;
31. return newNode; }
32. // Insert on the left of the node
33. struct node* insertLeft(struct node* root, int value) {
34. root->left = createNode(value);
35. return root->left; }
Жишээ №2: Хоёртын модны дүрслэл
36. // Insert on the right of the node
37. struct node* insertRight(struct node*
root, int value) {
38. root->right = createNode(value);
39. return root->right; }
40. int main() {
41. struct node* root = createNode(1);
42. insertLeft(root, 2);
43. insertRight(root, 3);
44. insertLeft(root->left, 4);
45. printf("Inorder traversal n");
46. inorderTraversal(root);
47. printf("nPreorder traversal n");
48. preorderTraversal(root);
49. printf("nPostorder traversal n");
postorderTraversal(root); }
Үр дүн:
Inorder traversal
4 ->2 ->1 ->3 ->
Preorder traversal
1 ->2 ->4 ->3 ->
Postorder traversal
4 ->2 ->3 ->1 ->

More Related Content

PDF
Excel2007 introduce
orgil
 
PDF
Microsoft excel програмтай ажиллах гарын авлага 2017
E-Gazarchin Online University
 
PPTX
Өгөгдлийн бүтэц 10
International Ulaanbaatar University
 
PPTX
Өгөгдлийн бүтэц 8,9
International Ulaanbaatar University
 
DOCX
Microsoft Office Excel программын Data цэс
Шинэбаяр Найдан
 
PDF
Microsoft excel програм гарын авлага
EnkhjargalDashdorjEn
 
Excel2007 introduce
orgil
 
Microsoft excel програмтай ажиллах гарын авлага 2017
E-Gazarchin Online University
 
Өгөгдлийн бүтэц 10
International Ulaanbaatar University
 
Өгөгдлийн бүтэц 8,9
International Ulaanbaatar University
 
Microsoft Office Excel программын Data цэс
Шинэбаяр Найдан
 
Microsoft excel програм гарын авлага
EnkhjargalDashdorjEn
 

What's hot (20)

PDF
Лекц 3 (Давталт)
Мөнхбаярын Цэцэнцэнгэл
 
PPTX
өгөгдлийн сан үүсгэх
Tsoomoo Myagmar
 
PPTX
цэс командууд
henjii
 
PDF
3. word
Batbayar Bolormaa
 
PPTX
Өгөгдлийн бүтэц 12
International Ulaanbaatar University
 
PPT
тооллын сис 10т 2т
Narantungaa
 
PPTX
U.cs101 lection-8
Badral Khurelbaatar
 
PPTX
Бүртгэл тооцооны сургалт
badraa
 
DOCX
Insert цэсний тухай
bbe_0416
 
DOCX
Lab13 basic theory
BPurev
 
PDF
Microsoft access 2007
Akhyt
 
PPTX
мэдээллийн системийн үндэс
Tsetsenkhuu Otgonbayar
 
PPTX
Table MS word Хүснэгт хийх
Khishighuu Myanganbuu
 
PPS
Excel дасгал ажил
Баярсайхан Л
 
PPTX
Presentation1
Khishighuu Myanganbuu
 
DOCX
Se304
Usukhuu Galaa
 
PPTX
Lekts 3
nyamka_09
 
PPTX
It101 lec6 10.06
Nergui Batjargal
 
PDF
Microsoft word программын туха  _ _ _}____-___ f 7
anguuch
 
Лекц 3 (Давталт)
Мөнхбаярын Цэцэнцэнгэл
 
өгөгдлийн сан үүсгэх
Tsoomoo Myagmar
 
цэс командууд
henjii
 
Өгөгдлийн бүтэц 12
International Ulaanbaatar University
 
тооллын сис 10т 2т
Narantungaa
 
U.cs101 lection-8
Badral Khurelbaatar
 
Бүртгэл тооцооны сургалт
badraa
 
Insert цэсний тухай
bbe_0416
 
Lab13 basic theory
BPurev
 
Microsoft access 2007
Akhyt
 
мэдээллийн системийн үндэс
Tsetsenkhuu Otgonbayar
 
Table MS word Хүснэгт хийх
Khishighuu Myanganbuu
 
Excel дасгал ажил
Баярсайхан Л
 
Presentation1
Khishighuu Myanganbuu
 
Lekts 3
nyamka_09
 
It101 lec6 10.06
Nergui Batjargal
 
Microsoft word программын туха  _ _ _}____-___ f 7
anguuch
 
Ad

Similar to Лекц №16 (6)

DOCX
Лабораторийн ажил 1
Chinzorig Undarmaa
 
PPTX
Өгөгдлийн бүтэц 11
International Ulaanbaatar University
 
PPTX
Lecture5 6
Gantur Togtokh
 
PPTX
Lecture 5
Muuluu
 
Лабораторийн ажил 1
Chinzorig Undarmaa
 
Өгөгдлийн бүтэц 11
International Ulaanbaatar University
 
Lecture5 6
Gantur Togtokh
 
Lecture 5
Muuluu
 
Ad

More from Amarsaikhan Tuvshinbayar (19)

PDF
U.it101 lec2
Amarsaikhan Tuvshinbayar
 
PDF
U.it101 lec1
Amarsaikhan Tuvshinbayar
 
PPTX
Лекц №15
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №14
Amarsaikhan Tuvshinbayar
 
PPTX
Лекц №13
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №12
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №11
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №10
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №9
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №8
Amarsaikhan Tuvshinbayar
 
PPTX
Лекц №7
Amarsaikhan Tuvshinbayar
 
PPTX
Лекц №6
Amarsaikhan Tuvshinbayar
 
PPTX
Лекц №5
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №4
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №3
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №2
Amarsaikhan Tuvshinbayar
 
PDF
Лекц №1
Amarsaikhan Tuvshinbayar
 
PDF
U.IT101 homework 1
Amarsaikhan Tuvshinbayar
 

Лекц №16

  • 1. Лекц №16 Сэдэв: Өгөгдлийн бүтэц-Холбоост жагсаалт, мод
  • 2. Өгөгдлийн бүтэц Өгөгдлийн бүтэц Өгөгдлийг компьютерийн санах ойд хадгалахад: 1. Өгөгдөл бүхлээрээ дараалсан байтуудад, 2. Тодорхой дараалалгүй энд тэнд тархсан байдлаар хадгалах хоёр үндсэн зам байдаг. Санах ойд дараалсан байдалтай өгөгдлийг МАССИВ, тархай байрлалтай өгөгдлийг ХОЛБООСТ дүрслэлээр хадгалахад тохиромжтой байдаг.
  • 4. Холбоост жагсаалт Холбоост /Linked/: Тархай салангид элементүүдийг нэгтгэж нэгдмэл нэг өгөгдөл болгоход холбоосыг хэрэглэдэг. Холбоос гэдэг нь нэг элементийн дараагийн дараагийн элемент санах ойн хаана байгааг заасан хаяг юм. Элемент, холбоос гэсэн хосууд гинж байдлаар залгагдаж өгөгдлийг бүрдүүлдэг. Нэг хосод хэдэн холбоос байгаагаас нь хамааруулж дан болон давхар холбоост дүрслэл үүсдэг. Давхар холбоосоор дараачийн элемент төдийгүй өмнөх элементэд хүрч болдог.
  • 5. Холбоост жагсаалт - Жагсаалт/List/ Өгөгдлийн хамгийн түгээмэл бүтэц бол шугаман жагсаалт. Жишээ: Оюутны нэрс, сурлагын дүн, хоолны цэс, номын нэрс г.м. бүгд жагсаалт юм
  • 6. Холбоост жагсаалт Нэг холбоост жагсаалт /Single Linked List/ Элемент буюу зангилаа нь өгөгдөл ба холбоос гэсэн 2 хэсгээс тогтоно. Өгөгдөл нь бидний мэдэх өгөгдлийн стандарт төрлүүдээр тодорхойлогдсон утга байх ба хэрэглэгчийн тодорхойлсон төрөл байж болно. Харин холбоос нь заагч төрөлтэй байх ба дараагийн зангилааны хаягийг заана. Нэг холбоост жагсаалт нь тухайн элементээс өмнөх элементүүдийг авах боломжгүй байдаг ба заагч ашиглан дараагийн элементийг устгах, нэмэх үйлдэл хийж болно.
  • 7. Холбоост жагсаалт Нэг холбоост жагсаалт /Single Linked List/
  • 8. Холбоост жагсаалт Нэг холбоост жагсаалт Бичигдэх хэлбэр: struct node { int data; struct node *next; }
  • 9. Холбоост жагсаалт Гурван гишүүнтэй нэг холбоос бүхий жагсаалтыг дараах байдлаар үүсгэж болно. /* Зангилааг зарлах */ struct node *head; struct node *one = NULL; struct node *two = NULL; struct node *three = NULL; /* Санах ойг хувиарлах */ one = malloc(sizeof(struct node)); two = malloc(sizeof(struct node)); three = malloc(sizeof(struct node)); /* Утгуудыг оруулах хэсэг*/ one->data = 1; two->data = 2; three->data = 3; /* Зангилаануудыг холбох*/ one->next = two; two->next = three; three->next = NULL; /* Эхний зангилааны хаягыг хадгалж байна*/ head = one;
  • 10. Холбоост жагсаалт Хоёр холбоост жагсаалт /Double Linked List/ Нэг холбоост жагсаалтын шийдэж чадаагүй өмнөх элементээ авах асуудлыг шийдсэн боловч дурын элементэд шууд хандах боломжгүй заагч ашиглан тухайн элементийн өмнөх болон дараагийн элементүүдэд хандаж элемент нэмэх болон устгах үйлдэлийг шийдсэн
  • 11. Холбоост жагсаалт Хоёр холбоост жагсаалт /Double Linked List/
  • 12. Холбоост жагсаалт Хоёр холбоост жагсаалт Бичигдэх хэлбэр: struct node { int data; struct node *next; struct node *prev; }
  • 13. Холбоост жагсаалт Гурван гишүүнтэй хоёр холбоос бүхий жагсаалтыг дараах байдлаар үүсгэж болно. /* Зангилааг зарлах */ struct node *head; struct node *one = NULL; struct node *two = NULL; struct node *three = NULL; /* Санах ойг хувиарлах */ one = malloc(sizeof(struct node)); two = malloc(sizeof(struct node)); three = malloc(sizeof(struct node)); /* Утгуудыг оруулах хэсэг*/ one->data = 1; two->data = 2; three->data = 3; /* Зангилаануудыг холбох*/ one->next = two; one->prev = NULL; two->next = three; two->prev = one; three->next = NULL; three->prev = two; /* Эхний зангилааны хаягыг хадгалж байна*/ head = one;
  • 14. Холбоост жагсаалт Тойрог холбоост жагсаалт /Circular Linked List/ Сүүлчийн элементийг эхний элементтэй холбосон холбосон дугуй хэлбэрийн жагсаалтын төрөл юм.
  • 15. Холбоост жагсаалт Тойрог холбоост жагсаалт Дугуй холбосон жагсаалтыг нэг нь хоёр холбоосоор холбож болно. • Нэг холбоост жагсаалтын хувьд сүүлчийн зүйлийн дараагийн заагч нь эхний зүйлийг зааж өгнө • Хоёр холбоост жагсаалтад эхний зүйлийн өмнөх заагч нь сүүлчийн зүйлийг мөн зааж өгнө.
  • 16. Холбоост жагсаалт Гурван гишүүнтэй нэг холбоос бүхий тойрог жагсаалтыг дараах байдлаар үүсгэж болно. /* Зангилааг зарлах */ struct node *head; struct node *one = NULL; struct node *two = NULL; struct node *three = NULL; /* Санах ойг хувиарлах */ one = malloc(sizeof(struct node)); two = malloc(sizeof(struct node)); three = malloc(sizeof(struct node)); /* Утгуудыг оруулах хэсэг*/ one->data = 1; two->data = 2; three->data = 3; /* Зангилаануудыг холбох*/ one->next = two; two->next = three; three->next = NULL; /* Эхний зангилааны хаягыг хадгалж байна*/ head = one;
  • 17. Холбоост жагсаалт Холбогдсон жагсаалтад хэрхэн элемент нэмэх вэ? Холбоост жагсаалтын эхэнд, дунд эсвэл төгсгөлд элемент нэмж болно. Эхэнд элемент нэмэх • Шинэ зангилаанд санах ой хуваарилах, • Өгөгдлийг хадгалах, • Эхний хэсгийг чиглүүлэхийн тулд дараагийн шинэ зангилааг өөрчлөх, • Шинээр үүсгэсэн зангилаа руу чиглүүлэхийн тулд эхний хэсгийг өөрчил. struct node *newNode; newNode = malloc(sizeof(struct node)); newNode->data = 4; newNode->next = head; head = newNode;
  • 18. Холбоост жагсаалт Төгсгөлд нь элемент нэмэх • Шинэ зангилаанд санах ой хуваарилах, • Өгөгдлийг хадгалах, • Сүүлийн хэсэг рүү шилжих, • Сүүлийн зангилааны хажууд шинээр үүсгэсэн зангилаагаар солино. struct node *newNode; newNode = malloc(sizeof(struct node)); newNode->data = 4; newNode->next = NULL; struct node *temp = head; while(temp->next != NULL) { temp = temp->next; } temp->next = newNode;
  • 19. Холбоост жагсаалт Дунд хэсэгт элемент нэмэх • Санах ойг хуваарилах, өгөгдлийг шинэ зангилаанд хадгалах, • Шинэ зангилааны шаардлагатай байрлалын өмнөхөн зангилаа руу очих, • Дараагийн заагчийг өөрчилж хооронд нь шинэ зангилаа оруулах. struct node *newNode; newNode = malloc(sizeof(struct node)); newNode->data = 4; struct node *temp = head; for(int i=2; i < position; i++) { if(temp->next != NULL) { temp = temp->next; } } newNode->next = temp->next; temp->next = newNode;
  • 20. Холбоост жагсаалт Холбогдсон жагсаалтаас хэрхэн устгах вэ? Эхний хэсгээ,төгсгөл хэсгээ, эсвэл тодорхой байрлалаас элемент устгаж болно. Эхний хэсгээ элемент нь устгах Эхнийх эсгийг хоёр дахь зангилаа руу чиглүүл head = head->next; Төгсгөл хэсгээс элемент нь хасах • Сүүлийн хэсэг рүү хоёрдугаарт шилжих • Дараагийн заагчийг тэг болго struct node* temp = head; while(temp->next->next!=NULL){ temp = temp->next; } temp->next = NULL;
  • 21. Холбоост жагсаалт Дундаас нь элемент устгах • Устгасан элементээс өмнө элемент рүү шилжих • Дараах заагчийг өөрчилж, гинжнээс зангилаа оруулахгүй for(int i=2; i< position; i++) { if(temp->next!=NULL) { temp = temp->next; } } temp->next = temp->next->next;
  • 22. Жишээ №1: Холбоост жагсаалттай ажиллах 1. #include <stdio.h> 2. #include <stdlib.h> 3. // Create a node 4. struct Node { 5. int item; 6. struct Node* next; }; 7. void insertAtBeginning(struct Node** ref, int data) { 8. // Allocate memory to a node 9. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); 10. // insert the item 11. new_node->item = data; 12. new_node->next = (*ref); 13. // Move head to new node 14. (*ref) = new_node; }
  • 23. Жишээ №1: Холбоост жагсаалттай ажиллах 15. // Insert a node after a node 16. void insertAfter(struct Node* node, int data) { 17. if (node == NULL) { 18. printf("the given previous node cannot be NULL"); 19. return; } 20. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); 21. new_node->item = data; 22. new_node->next = node->next; 23. node->next = new_node; } 24. void insertAtEnd(struct Node** ref, int data) { 25. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); 26. struct Node* last = *ref; 27. new_node->item = data; 28. new_node->next = NULL; 29. if (*ref == NULL) { 30. *ref = new_node; 31. return; }
  • 24. Жишээ №1: Холбоост жагсаалттай ажиллах 32. while (last->next != NULL) 33. last = last->next; 34. last->next = new_node; 35. return; 36. } 37. void deleteNode(struct Node** ref, int key) { 38. struct Node *temp = *ref, 39. *prev; 40. if (temp != NULL && temp->item == key) { 41. *ref = temp->next; 42. free(temp); return; } 43. // Find the key to be deleted 44. while (temp != NULL && temp->item != key){ 45. prev = temp; temp = temp->next; } 46. // If the key is not present 47. if (temp == NULL) return; 48. // Remove the node 49. prev->next = temp->next; 50. free(temp); } 51. // Print the linked list 52. void printList(struct Node* node) { 53. while (node != NULL) { 54. printf(" %d ", node->item); 55. node = node->next; } } 56. // Driver program 57. int main() { 58. struct Node* head = NULL; 59. insertAtEnd(&head, 1); 60. insertAtBeginning(&head, 2); 61. insertAtBeginning(&head, 3); 62. insertAtEnd(&head, 4); 63. insertAfter(head->next, 5); 64. printf("Linked list: "); 65. printList(head); 66. printf("nAfter deleting an element: "); deleteNode(&head, 3); 67. printList(head); }
  • 25. Жишээ №1: Холбоост жагсаалттай ажиллах Үр дүн: Linked list: 3 2 5 1 4 After deleting an element: 2 5 1 4
  • 27. Мод Яагаад мод хэлбэрийн өгөгдлийн бүтэц хэрэгтэй вэ? Шугаман өгөгдлийн бүтэц болох массив, холбосон жагсаалт, стек, дарааллаас ялгаатай нь мод нь шаталсан өгөгдлийн бүтэц юм. Шугаман өгөгдлийн бүтцэд өгөгдлийн хэмжээ ихсэхэд үйлдлийг гүйцэтгэх хугацаа. ихэсдэг. Модны өгөгдлийн бүтэц нь өгөгдөлд хурдан, хялбар хандах боломжийг олгодог.
  • 28. Мод Moд Зангилаанууд болон тэдгээрийг холбосон холбоосуудаар дүрслэгдсэн өгөгдлийн бүтэцийг мод /Tree/ гэнэ. Мод нь өгөгдлийг агуулах зангилаа /Node/, өөр зангилаатай холбогдох холбоосуудаас /Edge/ тогтоно. Модны хамгийн эхний зангилааг үндэс буюу язгуур / үндсэн зангилаа /Root// гэнэ. Модны онцлог нь үндсэн зангилаанаас ямар нэг зангилаанд хүрэх ганц зам байна. Холбоос Зангилаа Үндсэн зангилаа
  • 29. Мод Зангилааны урт /Height of a Node/ Зангилааны урт нь зангилаанаас хамгийн гүн зангилаа хүртэлх холбоосуудын тоо юм. Өөрөөр хэлбэл зангилаагаас зангилаа хүртэлх хамгийн урт зам. Зангилааны гүн /Depth of a Node/ Зангилааны гүн нь үндсэн зангилаанаас зангилаа хүртэлх холбоосуудын тоог хэлнэ.
  • 30. Мод Moдны өндөр /Height of a tree/ Модны замын урт нь модон дахь бүх зангилааны түвшингүүдийн нийлбэрээр тодорхойлогддог. Жишээ нь: Дараах нь 3, урт нь 0*1+1*3+2*3+3*1=12 байна. Түвшин 0 Түвшин 1 Түвшин 2 Түвшин 3 Модны зангилаа бүрийн өндөр ба гүн
  • 31. Мод Зангилааны зэрэг /Degree of a Node/ Зангилааны зэрэг нь тухайн зангилааны нийт салбаруудын тоог хэлнэ. Ой /Forest/ Салаалсан модны цуглуулгыг ой гэж нэрлэдэг.
  • 32. Мод Модны төрөл Хоёртын мод Хоёртын модны хайлт AVL мод B-мод
  • 33. Мод Хоёртын мод Модны нэг зангилаанаас гарч болох дэд зангилааны тоо нь хамгийн ихдээ 2 байх модыг хоёртын мод гэнэ.
  • 34. Мод Хоёртын модны төрлүүд Бүрэн хоёртын мод Төгс хоёртын мод Гүйцэт хоёртын мод Дутуу мод Муруй хоёртын мод Тэнцвэртэй хоёртын мод
  • 35. Мод Хоёртын модонд элемент байрлуулах Жагсаалтын эхний элемент модны орой болох бөгөөд дараагийн элементүүд модны орогоос их бол баруун дэд зангилаа, бага бол зүүн дэд зангилаа үүсгэнэ. Жишээ нь: 50, 60, 40,72, 53, 22, 35, 41, 80, 57, 18 50 6040 725322 35 41 805718
  • 36. Мод Хоёртын модны дүрслэл Хоёртын модны зангилаа нь өгөгдлийг агуулсан бүтцээр дүрслэгддэг ба ижил төрлийн бусад бүтэц рүү чиглүүлэх хоёр заагч байдаг. struct node { int data; struct node *left; struct node *right; };
  • 37. Жишээ №2: Хоёртын модны дүрслэл 1. #include <stdio.h> 2. #include <stdlib.h> 3. struct node { 4. int item; 5. struct node* left; 6. struct node* right; }; 7. // Inorder traversal 8. void inorderTraversal(struct node* root) { 9. if (root == NULL) return; 10. inorderTraversal(root->left); 11. printf("%d ->", root->item); 12. inorderTraversal(root->right); } 13. // Preorder traversal 14. void preorderTraversal(struct node* root) { 15. if (root == NULL) return; 16. printf("%d ->", root->item); 17. preorderTraversal(root->left); 18. preorderTraversal(root->right); } 19. // Postorder traversal 20. void postorderTraversal(struct node* root) { 21. if (root == NULL) return; 22. postorderTraversal(root->left); 23. postorderTraversal(root->right); 24. printf("%d ->", root->item); } 25. // Create a new Node 26. struct node* createNode(value) { 27. struct node* newNode = malloc(sizeof(struct node)); 28. newNode->item = value; 29. newNode->left = NULL; 30. newNode->right = NULL; 31. return newNode; } 32. // Insert on the left of the node 33. struct node* insertLeft(struct node* root, int value) { 34. root->left = createNode(value); 35. return root->left; }
  • 38. Жишээ №2: Хоёртын модны дүрслэл 36. // Insert on the right of the node 37. struct node* insertRight(struct node* root, int value) { 38. root->right = createNode(value); 39. return root->right; } 40. int main() { 41. struct node* root = createNode(1); 42. insertLeft(root, 2); 43. insertRight(root, 3); 44. insertLeft(root->left, 4); 45. printf("Inorder traversal n"); 46. inorderTraversal(root); 47. printf("nPreorder traversal n"); 48. preorderTraversal(root); 49. printf("nPostorder traversal n"); postorderTraversal(root); } Үр дүн: Inorder traversal 4 ->2 ->1 ->3 -> Preorder traversal 1 ->2 ->4 ->3 -> Postorder traversal 4 ->2 ->3 ->1 ->