Struktur Data – Single Linked List dengan Bahasa C
3 December 2016 Comments Struktur Data , Tutorial CMahir Koding – Single Linked List adalah salah satu bentuk implementasi dari struktur data yang paling sederhana. Seperti yang dijelaskan sebelumnya dalam konsep struktur data, single linked list bisa kita analogikan sebuah balok data dalam memory yang saling terhubung satu sama lain. Satu blok data dengan blok data lainnya dihubungkan melalui penanda berupa pointer (pointer bertugas menyimpan address blok data selanjutnya).
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 single 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 human *next; }*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[]){ //alokasi memory untuk data baru current = (human*)malloc(sizeof(struct human)); //assign data ke dalam struct current->age = age; strcpy(current->name, name); //apabila linked list kosong/tidak ada data if(head == NULL){ head = tail = current; } //kondisi tidak kosong else{ current->next = head; head = current; } }
Push Tail
void pushTail(int age, char name[]){ //alokasi memory untuk data baru current = (human*)malloc(sizeof(struct human)); //assign data ke dalam struct current->age = age; strcpy(current->name, name); //apabila linked list kosong/tidak ada data if(head == NULL){ head = tail = current; } //kondisi tidak kosong else{ tail->next = current; tail = current; } tail->next = NULL; }
Push Mid
void pushMid(int age, char name[]){ //alokasi memory untuk data baru current = (human*)malloc(sizeof(struct human)); //assign data ke dalam struct current->age = age; strcpy(current->name, name); //apabila linked list kosong/tidak ada data if(head == NULL){ head = tail = current; } //jika umur data yang barusan dimasukkan lebih kecil dari umur data pertama (head) else if(current->age < head->age){ pushHead(age, name); } //jika umur data yang barusan dimasukkan lebih besar dari umur data terakhir (tail) else if(current->age > tail->age){ pushTail(age, name); } //push ditengah-tengah else{ human *temp = head; //mencari posisi data yang sesuai untuk diselipkan while(temp->next->age < current->age){ temp = temp->next; } current->next = temp->next; //mengarahkan penunjuk ke alamat data baru temp->next = current; } }
Pop Head
void popHead(){ //inisialisasi current sebagai head current=head; //jika head kosong (tidak ada data) if(head==NULL){ //cetak tidak ada data printf("No data"); //jika head dan tail itu sama (hanya 1 data) }else if(head==tail){ //head dan tail dikosongkan head=tail=NULL; //hapus data current (head) free(current); }else{ //set head menjadi data selanjutnya dari head head=head->next; //hapus data current (head) free(current); } }
Pop Tail
void popTail(){ //jika head kosong (tidak ada data) if(head==NULL){ //cetak tidak ada data printf("No data"); //jika head dan tail itu sama (hanya 1 data) }else if(head==tail){ //head dan tail dikosongkan head=tail=NULL; //hapus data current (head) free(current); }else{ //buat variabel penampung baru dan assign nilai mulai dari head human *temp=head; //looping untuk mencari posisi 1 data sebelum tail while(temp->next!=tail){ //temp diubah menjadi 1 data selanjutnya temp=temp->next; } //set data current menjadi tail current=tail; //set tail menjadi 1 data sebelum tail (hasil looping) tail=temp; //hapus data current (tail) free(current); //data setelah next dikosongkan/pointer next punya tail diberi NULL tail->next=NULL; } }
Pop Mid
//kita akan menghapus data sesuai dengan umurnya. void popMid(int age){ //jika head kosong (tidak ada data) if(head==NULL){ printf("No data"); //jika umur si head(data pertama) sama dengan data umur yang mau dihapus }else if(head->age==age){ //pop head popHead(); //jika umur si tail(data terakhir) sama dengan data umur yang mau dihapus }else if(tail->age==age){ //pop tail popTail(); }else{ //buat variabel penampung baru dan assign nilai mulai dari head human *temp=head; //looping untuk mencari posisi 1 data sebelum tail while(temp->next->age!=age && temp!=tail){ //temp diubah menjadi 1 data selanjutnya temp=temp->next; } //set data current menjadi data selanjutnya dari temp current=temp->next; //data selanjutnya dari temp diubah menjadi 2 data setelah temp temp->next=temp->next->next; //hapus data current free(current); } }
Pop Mid
void popAll(){ while(head!=NULL){ popHead(); } }
Print Data
void print(){ current = head; while(current != NULL){ printf("%s - %d\n",current->name,current->age); current = current->next; } }
Main Function
int main(){ pushMid(18, "hery"); pushMid(17, "mahirkoding"); pushTail(22, "andi"); pushHead(15, "tono"); pushMid(11, "vandoro"); pushMid(23, "budi"); popHead(); popTail(); popMid(15); //popAll(); print(); getchar(); return 0; }
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.