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

What's hot

Лабораторийн ажил № 1
Лабораторийн ажил № 1Лабораторийн ажил № 1
Лабораторийн ажил № 1bsuren_bn
 
Лабораторийн ажил № 2
Лабораторийн ажил № 2Лабораторийн ажил № 2
Лабораторийн ажил № 2bsuren_bn
 
Lecture3
Lecture3Lecture3
Lecture3orgil
 
Single linked list
Single linked listSingle linked list
Single linked list
Mijiddorj Renchin-Ochir
 
Лаборатор-3
Лаборатор-3Лаборатор-3
Лаборатор-3bsuren_bn
 
баяраа сургалт
баяраа сургалтбаяраа сургалт
баяраа сургалтNatsag Oyungerel
 
U.cs101 лаборатори 12
U.cs101 лаборатори 12U.cs101 лаборатори 12
U.cs101 лаборатори 12
Ganbaatar ch
 
U.cs101 лаборатори 8-1
U.cs101 лаборатори 8-1U.cs101 лаборатори 8-1
U.cs101 лаборатори 8-1
Ganbaatar ch
 
Dsi lec7
Dsi lec7Dsi lec7
U.cs101 laborator 9
U.cs101 laborator 9U.cs101 laborator 9
U.cs101 laborator 9
Ganbaatar ch
 

What's hot (20)

Лабораторийн ажил № 1
Лабораторийн ажил № 1Лабораторийн ажил № 1
Лабораторийн ажил № 1
 
Лабораторийн ажил № 2
Лабораторийн ажил № 2Лабораторийн ажил № 2
Лабораторийн ажил № 2
 
Lecture3
Lecture3Lecture3
Lecture3
 
Single linked list
Single linked listSingle linked list
Single linked list
 
Лекц №7
Лекц №7Лекц №7
Лекц №7
 
Лаборатор-3
Лаборатор-3Лаборатор-3
Лаборатор-3
 
lab8
lab8lab8
lab8
 
Lekts 6
Lekts  6Lekts  6
Lekts 6
 
Lekts 5
Lekts  5Lekts  5
Lekts 5
 
баяраа сургалт
баяраа сургалтбаяраа сургалт
баяраа сургалт
 
Dynamic web 11
Dynamic web 11Dynamic web 11
Dynamic web 11
 
Dynamic web 5
Dynamic web 5Dynamic web 5
Dynamic web 5
 
U.cs101 лаборатори 12
U.cs101 лаборатори 12U.cs101 лаборатори 12
U.cs101 лаборатори 12
 
U.cs101 лаборатори 8-1
U.cs101 лаборатори 8-1U.cs101 лаборатори 8-1
U.cs101 лаборатори 8-1
 
Dynamic web 10
Dynamic web 10Dynamic web 10
Dynamic web 10
 
Dsi lec7
Dsi lec7Dsi lec7
Dsi lec7
 
U.cs101 laborator 9
U.cs101 laborator 9U.cs101 laborator 9
U.cs101 laborator 9
 
сургааль үгс
сургааль үгссургааль үгс
сургааль үгс
 
Dynamic web 7
Dynamic web 7Dynamic web 7
Dynamic web 7
 
Lecture 9
Lecture 9Lecture 9
Lecture 9
 

Similar to Лекц №16

Лабораторийн ажил 1
Лабораторийн ажил 1Лабораторийн ажил 1
Лабораторийн ажил 1Chinzorig Undarmaa
 
Dsi lec5,6
Dsi lec5,6Dsi lec5,6
Өгөгдлийн бүтэц 8,9
Өгөгдлийн бүтэц 8,9Өгөгдлийн бүтэц 8,9
Өгөгдлийн бүтэц 8,9
International Ulaanbaatar University
 
Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11
International Ulaanbaatar University
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
Muuluu
 

Similar to Лекц №16 (6)

Лабораторийн ажил 1
Лабораторийн ажил 1Лабораторийн ажил 1
Лабораторийн ажил 1
 
Dsi lec5,6
Dsi lec5,6Dsi lec5,6
Dsi lec5,6
 
Өгөгдлийн бүтэц 8,9
Өгөгдлийн бүтэц 8,9Өгөгдлийн бүтэц 8,9
Өгөгдлийн бүтэц 8,9
 
Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11
 
Lecture5 6
Lecture5 6Lecture5 6
Lecture5 6
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 

More from Amarsaikhan Tuvshinbayar

Лекц №4
Лекц №4Лекц №4
Лекц №3
Лекц №3Лекц №3
Лекц №2
Лекц №2Лекц №2
Лекц №1
Лекц №1Лекц №1

More from Amarsaikhan Tuvshinbayar (11)

U.it101 lec2
U.it101 lec2U.it101 lec2
U.it101 lec2
 
U.it101 lec1
U.it101 lec1U.it101 lec1
U.it101 lec1
 
Лекц №15
Лекц №15Лекц №15
Лекц №15
 
Лекц №6
Лекц №6Лекц №6
Лекц №6
 
Лекц №5
Лекц №5Лекц №5
Лекц №5
 
Лекц №4
Лекц №4Лекц №4
Лекц №4
 
Лекц №3
Лекц №3Лекц №3
Лекц №3
 
Лекц №2
Лекц №2Лекц №2
Лекц №2
 
Лекц №1
Лекц №1Лекц №1
Лекц №1
 
U.IT101 homework 1
U.IT101 homework 1U.IT101 homework 1
U.IT101 homework 1
 
U.CS101
U.CS101U.CS101
U.CS101
 

Лекц №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 ->