Struktur Data – Double Linked List dengan Bahasa C
30 December 2016 Comments Struktur Data , Tutorial CMahir Koding – Double Linked List adalah salah satu contoh lain implementasi linked list selain single linked list yang telah kita bahas di tutorial sebelumnya. Sesuai namanya, Double artinya blok data yang kita miliki akan memiliki 2 penunjuk kiri dan kanan untuk menentukan data sebelum/sesudahnya. Berbeda dengan single linked list yang hanya mempunyai satu penunjuk, double linked list mempunyai 2 penunjuk kiri dan kanan untuk menentukan urutan datanya. Agar lebih paham, bisa perhatikan gambar di bawah ini :
Dalam pembelajaran struktur data, kita akan lebih sering mengenal dengan istilah :
- Push untuk menambah data.
- PushHead – Menambah data ke barisan paling awal
- PushTail – Menambah data ke barisan paling akhir
- PushMid – Menambah data ke barisan di tengah (sorting)
- Pop untuk menghapus data.
- PopHead – Menghapus data paling awal
- PopTail – Menghapus data paling akhir
- PopMid – Menghapus data ditengah (sesuai parameter value)
Contoh pembuatan double linked list untuk menyimpan nama seseorang beserta umurnya.
Deklarasi Struct
#include <stdio.h> #include <stdlib.h> #include <string.h> struct human{ //menampung integer umur int age; //menampung nama manusia char name[30]; //menampung alamat dari data selanjutnya dan sebelumnya human *next, *prev; }*head, *tail, *current; //head adalah pointer yang menyimpan alamat data pertama //tail adalah pointer yang menyimpan alamat data terakhir //current adalah pointer yang digunakan sebagai temporary variabel
Push Head
void pushHead(int age, char name[]){ //membuat blok data baru current = (struct human *)malloc(sizeof human); //mengisi data strcpy(current->name, name); current->age=age; //membuat penunjuk data lain menjadi NULL terlebih dahulu current->next = current->prev=NULL; //jika tidak ada data if(head==NULL){ //maka akan jadi data pertama, head dan tail akan sama dengan data baru head=tail=current; //jika ada data }else{ //pergantian head menjadi data terbaru head->prev=current; current->next=head; head=current; } }
Push Tail
void pushTail(int age, char name[]){ //membuat blok data baru current = (struct human *)malloc(sizeof human); //mengisi data strcpy(current->name, name); current->age = age; //membuat penunjuk data lain menjadi NULL terlebih dahulu current->prev = current->next = NULL; //jika tidak ada data if(head==NULL){ //maka akan jadi data pertama, head dan tail akan sama dengan data baru head=tail=current; //jika ada data }else{ //pergantian tail menjadi data terbaru current->prev = tail; tail->next = current; tail = current; } }
Push Mid – Mengurutkan sesuai umur
void PushMid(int age, char name[]){ //jika tidak ada data if(head==NULL){ //pushHead pushHead(age,name); //jika umur yang akan dimasukkan lebih kecil dari umur data ke head }else if(age < head->age){ //pushHead pushHead(age,name); //jika umur yang akan dimasukkan lebih kecil dari umur data ke tail }else if(age > tail->age){ //pushTail pushTail(age,name); }else{ //buat blok data current = (struct human *)malloc(sizeof human); //mengisi data strcpy(current->name, name); current->age = age; //buat penunjuk data sebelum/sesudahnya menjadi NULL terlebih dahulu current->next = current->prev = NULL; struct human *temp=head; //mencari posisi dimana data akan dimasukkan while(temp!=NULL && temp->age < current->age){ temp=temp->next; } //memasukkan data dan menunjuk alamat-alamat data selanjutnya/sebelumnya current->prev=temp->prev; current->next=temp; temp->prev->next=current; temp->prev=current; } }
Pop Head
void popHead(){ //jika tidak ada data if(head==NULL){ printf("No Data\n"); //jika hanya ada 1 data }else if(head==tail){ current=head; head=tail=NULL; free(current); //jika lebih dari 1 data }else{ current=head; head=head->next; head->prev=NULL; free(current); } }
Pop Tail
void popTail(){ //jika tidak ada data if(head==NULL){ printf("No Data\n"); //jika hanya ada 1 data }else if(head==tail){ current=tail; head=tail=NULL; free(current); //jika lebih dari 1 data }else{ current=tail; tail=tail->prev; tail->next=NULL; free(current); } }
Pop Mid – Mencari umur yang ingin dihapus
void popMid(int age){ //inisialisasi flag sebagai penanda eksistensi data int temu=0; //jika tidak ada data if(head==NULL){ printf("No Data\n"); //jika ada data }else{ current=head; //mencari posisi data while(current!=NULL){ //pengecekan data,jika sesuai, ubah flag dan langsung break looping if(current->age==age){ temu=1; break; } current=current->next; } //jika data ketemu if(temu==1){ //jika hanya data yang ditemukan adalah Head if(current==head){ popHead(); //jika hanya data yang ditemukan adalah Tail }else if(current==tail){ popTail(); //jika hanya data yang ditemukan bukan Head dan bukan Tail }else{ current->prev->next=current->next; current->next->prev=current->prev; free(current); } }else{ printf("Data Not Found\n"); } } }
Pop All – Menghapus semua data
void popAll(){ while(head!=NULL){ popHead(); } }
Print Data
void print(){ current=head; if(current!=NULL){ while(current!=NULL){ printf("Name : %s | Age : %d\n", current->name, current->age); current=current->next; } }else{ printf("No Data\n"); } }
Main Function
void main(){ pushHead(23, "Hery"); pushHead(20, "Budi"); pushHead(13,"Tono"); pushHead(11, "Andi"); pushTail(15, "MahirKoding"); PushMid(17, "Budi"); popMid(11); //popMid(6); //popAll(); print(); getchar(); }
Source code secara lengkap bisa dicek ke github saya, di link ini.
Jika ada pertanyaan yang kurang jelas silahkan berkomentar di bawah. Atau, jika ingin request tutorial juga dapat ke halaman ini. Dukung terus Mahir Koding agar dapat selalu mengupdate artikel dengan share dan like artikel ini. Terima Kasih.