More Related Content
More from Amarsaikhan Tuvshinbayar
More from Amarsaikhan Tuvshinbayar (11)
Лекц №16
- 2. Өгөгдлийн бүтэц
Өгөгдлийн бүтэц
Өгөгдлийг компьютерийн санах ойд хадгалахад:
1. Өгөгдөл бүхлээрээ дараалсан байтуудад,
2. Тодорхой дараалалгүй энд тэнд тархсан байдлаар хадгалах хоёр
үндсэн зам байдаг.
Санах ойд дараалсан байдалтай өгөгдлийг МАССИВ, тархай байрлалтай
өгөгдлийг ХОЛБООСТ дүрслэлээр хадгалахад тохиромжтой байдаг.
- 4. Холбоост жагсаалт
Холбоост /Linked/:
Тархай салангид элементүүдийг нэгтгэж нэгдмэл нэг өгөгдөл болгоход
холбоосыг хэрэглэдэг. Холбоос гэдэг нь нэг элементийн дараагийн
дараагийн элемент санах ойн хаана байгааг заасан хаяг юм. Элемент,
холбоос гэсэн хосууд гинж байдлаар залгагдаж өгөгдлийг бүрдүүлдэг. Нэг
хосод хэдэн холбоос байгаагаас нь хамааруулж дан болон давхар холбоост
дүрслэл үүсдэг. Давхар холбоосоор дараачийн элемент төдийгүй өмнөх
элементэд хүрч болдог.
- 6. Холбоост жагсаалт
Нэг холбоост жагсаалт /Single Linked List/
Элемент буюу зангилаа нь өгөгдөл ба холбоос гэсэн 2 хэсгээс тогтоно.
Өгөгдөл нь бидний мэдэх өгөгдлийн стандарт төрлүүдээр тодорхойлогдсон
утга байх ба хэрэглэгчийн тодорхойлсон төрөл байж болно. Харин холбоос
нь заагч төрөлтэй байх ба дараагийн зангилааны хаягийг заана. Нэг
холбоост жагсаалт нь тухайн элементээс өмнөх элементүүдийг авах
боломжгүй байдаг ба заагч ашиглан дараагийн элементийг устгах, нэмэх
үйлдэл хийж болно.
- 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/
Нэг холбоост жагсаалтын шийдэж чадаагүй өмнөх элементээ авах
асуудлыг шийдсэн боловч дурын элементэд шууд хандах боломжгүй заагч
ашиглан тухайн элементийн өмнөх болон дараагийн элементүүдэд хандаж
элемент нэмэх болон устгах үйлдэлийг шийдсэн
- 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;
- 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/
Салаалсан модны цуглуулгыг ой гэж нэрлэдэг.
- 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 ->