Hallo Semua!
kembali lagi dengan chaca!!Ada yang berbeda dari postingan sebelum-sebelumnya karena postingan kali ini spesial dan sangat berguna sebagai pemenuhan tugas GLSC untuk mata kuliah Data Struct.
Berikut ini adalah hal-hal yang saya ketahui tentang data struct/Struktur data!
selamat membaca!
Apa sih itu Linked List?
sederhananya adalah sebuah struktur data yang sangat dinamis di mana elemen dapat ditambahkan atau dihapus dari mana saja sesuka hati kita, Juga, setiap elemennya disebut node atau koleksi linear dari data dimana setiap node menunjuk pada node lain melalui pointer.
Pada semester sebelumnya, kita sudah belajar tentang pointer bukan?
Tentunya teman-teman harus masih inget dong.
Nah, Pada linked list terdapat beberapa jenis tuh . kali ini spesial banget aku bakalan bahas tiga hal dibawah ini yaitu :
1.Circular
Single Linked List
2.Doubly
Linked List
3.Circular
Doubly Linked List
mari kita bahas satu persatu!
1. Circular single linked list
Q : apa sih itu circular single linked list?
A: Dari kata circular sebenarnya bisa langsung kita tahu bhwa linked list yang satu ini membentuk sebuah siklus nih. Artinya, simpul di awal dan akhirnya bersebelahan atau ismpul terakhir berisi pointer ke simpul pertama. Di linked list yang satu ini juga Tidak ada penyimpanan nilai NULL dalam list.
sumber :https://www.javatpoint.com/circular-singly-linked-list |
- Menambahkan diawal
yaitu Menambahkan simpul ke circular singly linked list yang ditautkan sendiri di awal. - Menambahkan diakhir
Menambahkan node ke circular singly linked listyang ditaukan di akhir - Penghapusan di awal.
Menghapus simpul dari circular singly linked list yang ditautkan di awal. - Penghapusan di bagian akhir
Menghapus simpul dari daftar tertaut tunggal melingkar di bagian akhir. - Pencarian
Membandingkan setiap elemen dari simpul dengan item yang diberikan dan kembalikan lokasi di mana item tersebut ada dalam daftar jika tidak mengembalikan null. - Traversing
Mengunjungi setiap elemen daftar setidaknya satu kali untuk melakukan beberapa operasi tertentu.
berikut source code contoh dari circular singly linked list :
//sumber : javapoint.com
- #include<stdio.h>
- #include<stdlib.h>
- struct node
- {
- int data;
- struct node *next;
- };
- struct node *head;
- void beginsert ();
- void lastinsert ();
- void randominsert();
- void begin_delete();
- void last_delete();
- void random_delete();
- void display();
- void search();
- void main ()
- {
- int choice =0;
- while(choice != 7)
- {
- printf("\n*********Main Menu*********\n");
- printf("\nChoose one option from the following list ...\n");
- printf("\n===============================================\n");
- printf("\n1.Insert in begining\n2.Insert at last\n3.Delete from Beginning\n4.Delete from last\n5.Search for an element\n6.Show\n7.Exit\n");
- printf("\nEnter your choice?\n");
- scanf("\n%d",&choice);
- switch(choice)
- {
- case 1:
- beginsert();
- break;
- case 2:
- lastinsert();
- break;
- case 3:
- begin_delete();
- break;
- case 4:
- last_delete();
- break;
- case 5:
- search();
- break;
- case 6:
- display();
- break;
- case 7:
- exit(0);
- break;
- default:
- printf("Please enter valid choice..");
- }
- }
- }
- void beginsert()
- {
- struct node *ptr,*temp;
- int item;
- ptr = (struct node *)malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\nOVERFLOW");
- }
- else
- {
- printf("\nEnter the node data?");
- scanf("%d",&item);
- ptr -> data = item;
- if(head == NULL)
- {
- head = ptr;
- ptr -> next = head;
- }
- else
- {
- temp = head;
- while(temp->next != head)
- temp = temp->next;
- ptr->next = head;
- temp -> next = ptr;
- head = ptr;
- }
- printf("\nnode inserted\n");
- }
- }
- void lastinsert()
- {
- struct node *ptr,*temp;
- int item;
- ptr = (struct node *)malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\nOVERFLOW\n");
- }
- else
- {
- printf("\nEnter Data?");
- scanf("%d",&item);
- ptr->data = item;
- if(head == NULL)
- {
- head = ptr;
- ptr -> next = head;
- }
- else
- {
- temp = head;
- while(temp -> next != head)
- {
- temp = temp -> next;
- }
- temp -> next = ptr;
- ptr -> next = head;
- }
- printf("\nnode inserted\n");
- }
- }
- void begin_delete()
- {
- struct node *ptr;
- if(head == NULL)
- {
- printf("\nUNDERFLOW");
- }
- else if(head->next == head)
- {
- head = NULL;
- free(head);
- printf("\nnode deleted\n");
- }
- else
- { ptr = head;
- while(ptr -> next != head)
- ptr = ptr -> next;
- ptr->next = head->next;
- free(head);
- head = ptr->next;
- printf("\nnode deleted\n");
- }
- }
- void last_delete()
- {
- struct node *ptr, *preptr;
- if(head==NULL)
- {
- printf("\nUNDERFLOW");
- }
- else if (head ->next == head)
- {
- head = NULL;
- free(head);
- printf("\nnode deleted\n");
- }
- else
- {
- ptr = head;
- while(ptr ->next != head)
- {
- preptr=ptr;
- ptr = ptr->next;
- }
- preptr->next = ptr -> next;
- free(ptr);
- printf("\nnode deleted\n");
- }
- }
- void search()
- {
- struct node *ptr;
- int item,i=0,flag=1;
- ptr = head;
- if(ptr == NULL)
- {
- printf("\nEmpty List\n");
- }
- else
- {
- printf("\nEnter item which you want to search?\n");
- scanf("%d",&item);
- if(head ->data == item)
- {
- printf("item found at location %d",i+1);
- flag=0;
- }
- else
- {
- while (ptr->next != head)
- {
- if(ptr->data == item)
- {
- printf("item found at location %d ",i+1);
- flag=0;
- break;
- }
- else
- {
- flag=1;
- }
- i++;
- ptr = ptr -> next;
- }
- }
- if(flag != 0)
- {
- printf("Item not found\n");
- }
- }
- }
- void display()
- {
- struct node *ptr;
- ptr=head;
- if(head == NULL)
- {
- printf("\nnothing to print");
- }
- else
- {
- printf("\n printing values ... \n");
- while(ptr -> next != head)
- {
- printf("%d\n", ptr -> data);
- ptr = ptr -> next;
- }
- printf("%d\n", ptr -> data);
- }
- }
2.Doubly Linked List
Q: Apa itu double linked list? apa bedanya sama double linked list?
A : Iya bener banget! itu sama aja kok. Cuma beda penyebutan aja tuh hehehe. jadi , doubly/double linked list itu struktur data yang mempunyai dua tautan , satu yang merujuk kepada data setelahnya , satu lagi yang merujuk pada sebelumnya.
sumber : https://javatpoint.com/doubly-linked-list |
- Penyisipan di awal
Menambahkan simpul ke dalam Linked List di awal. - Penyisipan di akhir
Menambahkan simpul ke Linked List ke akhir. - Penyisipan setelah simpul yang ditentukan
Menambahkan simpul ke dalam daftar tertaut setelah simpul yang ditentukan. - Penghapusan di awal.
Menghapus simpul dari awal daftar - Penghapusan di bagian akhir
Menghapus simpul dari akhir daftar. - Penghapusan dibagian terten
Menghapus node yang hadir tepat setelah node yang berisi data yang diberikan. - Pencarian/Searching
Membandingkan setiap data node dengan item yang akan dicari dan mengembalikan lokasi item dalam daftar jika item yang ditemukan lain kembali nol. - Traversing
Mengunjungi setiap node daftar setidaknya sekali untuk melakukan beberapa operasi tertentu seperti pencarian, pengurutan, tampilan, dll.
berikut source code contoh dari circular single linked list :
- #include<stdio.h>
- #include<stdlib.h>
- struct node
- {
- struct node *prev;
- struct node *next;
- int data;
- };
- struct node *head;
- void insertion_beginning();
- void insertion_last();
- void insertion_specified();
- void deletion_beginning();
- void deletion_last();
- void deletion_specified();
- void display();
- void search();
- void main ()
- {
- int choice =0;
- while(choice != 9)
- {
- printf("\n*********Main Menu*********\n");
- printf("\nChoose one option from the following list ...\n");
- printf("\n===============================================\n");
- printf("\n1.Insert in begining\n2.Insert at last\n3.Insert at any random location\n4.Delete from Beginning\n
- 5.Delete from last\n6.Delete the node after the given data\n7.Search\n8.Show\n9.Exit\n");
- printf("\nEnter your choice?\n");
- scanf("\n%d",&choice);
- switch(choice)
- {
- case 1:
- insertion_beginning();
- break;
- case 2:
- insertion_last();
- break;
- case 3:
- insertion_specified();
- break;
- case 4:
- deletion_beginning();
- break;
- case 5:
- deletion_last();
- break;
- case 6:
- deletion_specified();
- break;
- case 7:
- search();
- break;
- case 8:
- display();
- break;
- case 9:
- exit(0);
- break;
- default:
- printf("Please enter valid choice..");
- }
- }
- }
- void insertion_beginning()
- {
- struct node *ptr;
- int item;
- ptr = (struct node *)malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\nOVERFLOW");
- }
- else
- {
- printf("\nEnter Item value");
- scanf("%d",&item);
- if(head==NULL)
- {
- ptr->next = NULL;
- ptr->prev=NULL;
- ptr->data=item;
- head=ptr;
- }
- else
- {
- ptr->data=item;
- ptr->prev=NULL;
- ptr->next = head;
- head->prev=ptr;
- head=ptr;
- }
- printf("\nNode inserted\n");
- }
- }
- void insertion_last()
- {
- struct node *ptr,*temp;
- int item;
- ptr = (struct node *) malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\nOVERFLOW");
- }
- else
- {
- printf("\nEnter value");
- scanf("%d",&item);
- ptr->data=item;
- if(head == NULL)
- {
- ptr->next = NULL;
- ptr->prev = NULL;
- head = ptr;
- }
- else
- {
- temp = head;
- while(temp->next!=NULL)
- {
- temp = temp->next;
- }
- temp->next = ptr;
- ptr ->prev=temp;
- ptr->next = NULL;
- }
- }
- printf("\nnode inserted\n");
- }
- void insertion_specified()
- {
- struct node *ptr,*temp;
- int item,loc,i;
- ptr = (struct node *)malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\n OVERFLOW");
- }
- else
- {
- temp=head;
- printf("Enter the location");
- scanf("%d",&loc);
- for(i=0;i<loc;i++)
- {
- temp = temp->next;
- if(temp == NULL)
- {
- printf("\n There are less than %d elements", loc);
- return;
- }
- }
- printf("Enter value");
- scanf("%d",&item);
- ptr->data = item;
- ptr->next = temp->next;
- ptr -> prev = temp;
- temp->next = ptr;
- temp->next->prev=ptr;
- printf("\nnode inserted\n");
- }
- }
- void deletion_beginning()
- {
- struct node *ptr;
- if(head == NULL)
- {
- printf("\n UNDERFLOW");
- }
- else if(head->next == NULL)
- {
- head = NULL;
- free(head);
- printf("\nnode deleted\n");
- }
- else
- {
- ptr = head;
- head = head -> next;
- head -> prev = NULL;
- free(ptr);
- printf("\nnode deleted\n");
- }
- }
- void deletion_last()
- {
- struct node *ptr;
- if(head == NULL)
- {
- printf("\n UNDERFLOW");
- }
- else if(head->next == NULL)
- {
- head = NULL;
- free(head);
- printf("\nnode deleted\n");
- }
- else
- {
- ptr = head;
- if(ptr->next != NULL)
- {
- ptr = ptr -> next;
- }
- ptr -> prev -> next = NULL;
- free(ptr);
- printf("\nnode deleted\n");
- }
- }
- void deletion_specified()
- {
- struct node *ptr, *temp;
- int val;
- printf("\n Enter the data after which the node is to be deleted : ");
- scanf("%d", &val);
- ptr = head;
- while(ptr -> data != val)
- ptr = ptr -> next;
- if(ptr -> next == NULL)
- {
- printf("\nCan't delete\n");
- }
- else if(ptr -> next -> next == NULL)
- {
- ptr ->next = NULL;
- }
- else
- {
- temp = ptr -> next;
- ptr -> next = temp -> next;
- temp -> next -> prev = ptr;
- free(temp);
- printf("\nnode deleted\n");
- }
- }
- void display()
- {
- struct node *ptr;
- printf("\n printing values...\n");
- ptr = head;
- while(ptr != NULL)
- {
- printf("%d\n",ptr->data);
- ptr=ptr->next;
- }
- }
- void search()
- {
- struct node *ptr;
- int item,i=0,flag;
- ptr = head;
- if(ptr == NULL)
- {
- printf("\nEmpty List\n");
- }
- else
- {
- printf("\nEnter item which you want to search?\n");
- scanf("%d",&item);
- while (ptr!=NULL)
- {
- if(ptr->data == item)
- {
- printf("\nitem found at location %d ",i+1);
- flag=0;
- break;
- }
- else
- {
- flag=1;
- }
- i++;
- ptr = ptr -> next;
- }
- if(flag==1)
- {
- printf("\nItem not found\n");
- }
- }
//sumber : https://javatpoint.com/doubly-linked-list
3.Circular Doubly Linked List
Q: Loh, kalau yang ini apa bedanya sama double linked list? mirip" sama yang linked list pertama dong,cha? eh mirip yang circular single linked list juga cuma dalam versi double gitu ya?
A: Yaps! bener banget kamu. Jadi , yang satu ini mirip dengan circular single linked list, tetapi total pointer di setiap node di sini adalah 2 (dua) pointer. Dan juga ia tidak mengandung NULL di sembarang simpul.
sumber: https://javatpoint.com/circular-doubly-linked-list |
Operasi yang dapat dilakukan di circular doubly linked list adalah sebagai berikut :
- 1 Penyisipan di awal
Menambahkan simpul dalam daftar ditautkan melingkar di awal. - Penyisipan di akhir
Menambahkan simpul dalam daftar ditautkan melingkar di akhir - Penghapusan di awal
Menghapus simpul dalam daftar tertaut ganda melingkar dari awal. - Penghapusan di akhir
Menghapus simpul dalam daftar ditautkan melingkar di akhir. - Melintasi dan mencari dalam circular doubly linked list mirip dengan yang ada dalam circular linked linked list
berikut contoh source code circular doubly linked list :
- #include<stdio.h>
- #include<stdlib.h>
- struct node
- {
- struct node *prev;
- struct node *next;
- int data;
- };
- struct node *head;
- void insertion_beginning();
- void insertion_last();
- void deletion_beginning();
- void deletion_last();
- void display();
- void search();
- void main ()
- {
- int choice =0;
- while(choice != 9)
- {
- printf("\n*********Main Menu*********\n");
- printf("\nChoose one option from the following list ...\n");
- printf("\n===============================================\n");
- printf("\n1.Insert in Beginning\n2.Insert at last\n3.Delete from Beginning\n4.Delete from last\n5.Search\n6.Show\n7.Exit\n");
- printf("\nEnter your choice?\n");
- scanf("\n%d",&choice);
- switch(choice)
- {
- case 1:
- insertion_beginning();
- break;
- case 2:
- insertion_last();
- break;
- case 3:
- deletion_beginning();
- break;
- case 4:
- deletion_last();
- break;
- case 5:
- search();
- break;
- case 6:
- display();
- break;
- case 7:
- exit(0);
- break;
- default:
- printf("Please enter valid choice..");
- }
- }
- }
- void insertion_beginning()
- {
- struct node *ptr,*temp;
- int item;
- ptr = (struct node *)malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\nOVERFLOW");
- }
- else
- {
- printf("\nEnter Item value");
- scanf("%d",&item);
- ptr->data=item;
- if(head==NULL)
- {
- head = ptr;
- ptr -> next = head;
- ptr -> prev = head;
- }
- else
- {
- temp = head;
- while(temp -> next != head)
- {
- temp = temp -> next;
- }
- temp -> next = ptr;
- ptr -> prev = temp;
- head -> prev = ptr;
- ptr -> next = head;
- head = ptr;
- }
- printf("\nNode inserted\n");
- }
- }
- void insertion_last()
- {
- struct node *ptr,*temp;
- int item;
- ptr = (struct node *) malloc(sizeof(struct node));
- if(ptr == NULL)
- {
- printf("\nOVERFLOW");
- }
- else
- {
- printf("\nEnter value");
- scanf("%d",&item);
- ptr->data=item;
- if(head == NULL)
- {
- head = ptr;
- ptr -> next = head;
- ptr -> prev = head;
- }
- else
- {
- temp = head;
- while(temp->next !=head)
- {
- temp = temp->next;
- }
- temp->next = ptr;
- ptr ->prev=temp;
- head -> prev = ptr;
- ptr -> next = head;
- }
- }
- printf("\nnode inserted\n");
- }
- void deletion_beginning()
- {
- struct node *temp;
- if(head == NULL)
- {
- printf("\n UNDERFLOW");
- }
- else if(head->next == head)
- {
- head = NULL;
- free(head);
- printf("\nnode deleted\n");
- }
- else
- {
- temp = head;
- while(temp -> next != head)
- {
- temp = temp -> next;
- }
- temp -> next = head -> next;
- head -> next -> prev = temp;
- free(head);
- head = temp -> next;
- }
- }
- void deletion_last()
- {
- struct node *ptr;
- if(head == NULL)
- {
- printf("\n UNDERFLOW");
- }
- else if(head->next == head)
- {
- head = NULL;
- free(head);
- printf("\nnode deleted\n");
- }
- else
- {
- ptr = head;
- if(ptr->next != head)
- {
- ptr = ptr -> next;
- }
- ptr -> prev -> next = head;
- head -> prev = ptr -> prev;
- free(ptr);
- printf("\nnode deleted\n");
- }
- }
- void display()
- {
- struct node *ptr;
- ptr=head;
- if(head == NULL)
- {
- printf("\nnothing to print");
- }
- else
- {
- printf("\n printing values ... \n");
- while(ptr -> next != head)
- {
- printf("%d\n", ptr -> data);
- ptr = ptr -> next;
- }
- printf("%d\n", ptr -> data);
- }
- }
- void search()
- {
- struct node *ptr;
- int item,i=0,flag=1;
- ptr = head;
- if(ptr == NULL)
- {
- printf("\nEmpty List\n");
- }
- else
- {
- printf("\nEnter item which you want to search?\n");
- scanf("%d",&item);
- if(head ->data == item)
- {
- printf("item found at location %d",i+1);
- flag=0;
- }
- else
- {
- while (ptr->next != head)
- {
- if(ptr->data == item)
- {
- printf("item found at location %d ",i+1);
- flag=0;
- break;
- }
- else
- {
- flag=1;
- }
- i++;
- ptr = ptr -> next;
- }
- }
- if(flag != 0)
- {
- printf("Item not found\n");
- }
- }
- }
- //sumber : https://javatpoint.com/circular-doubly-linked-list
Nah, gimana nih temen-temen udah dapet ilmu baru belum?
Sampai jumpa pada materi selanjutnya!~~
Bye~~~
Sampai jumpa pada materi selanjutnya!~~
Bye~~~
Posting Komentar
Silahkan berkomentar dengan baik ~