Wednesday 22 April 2009

TIPS Memahami Linked List

Tips ini saya tulis berdasar pengalaman pribadi selama masih kuliah dan mengambil mata kuliah Algoritma dan Struktur Data. Harapan saya sedikit banyak bisa membantu pembaca dalam menguasai topik programming yang satu ini. Terus terang pas jaman kuliah dulu saya kesulitan memahami apa sebenarnya linked list. Maklum dalam linked list kita sedikit bicara hal abstrak, nggak begitu jelas karena yang dibahas adalah membayangkan isi memori komputer. Bahkan sampai selesai UAS pun saya masih bertanya-tanya, "Linked List???". Hingga akhirnya saya dapat menemukan pencerahan dari-Nya. Alhamdulillah :)

TIPS 1. Pahami konsep dasar Linked List.
Singkat cerita, linked list (LL) adalah identik dengan array/ larik. LL merupakan struktur data yang bisa menyimpan rangkaian data secara dinamis. Dinamis karena bisa ditambah dan dikurangi sesuai kebutuhan program. Dengan demikian ketika kita bicara linked list maka bayangkan bahwa ia secara fisik hampir sama ilustrasinya dengan tipe data array, yaitu deretan kotak elemen yang memanjang. Bedanya, klo array itu kotaknya berdempetan, sedangkan linked list kotak-kotaknya (node/simpul) nanti terhubung dengan minimal sebuah garis panah (pointer).

TIPS 2. Gambar dulu ilustrasinya.
LL itu abstrak, namun bisa kita buat gambaran prosesnya. Bagian yang paling rumit dalam LL adalah merangkai simpul satu dengan simpul lainnya sehingga terbentuklah LL dan menjamin masih terhubungnya seluruh rangkaian node meskipun terjadi penambahan node baru maupun penghapusan node lama di posisi manapun (depan, belakang atau tengah). Untuk itu sebelum kita menulis baris perintah code program untuk operasi-operasi LL alangkah lebih baiknya jika kita awali dengan menggambarkan dulu ilustrasinya. Baik untuk kondisi LL masih baru berupa satu node, dua node maupun banyak node. Selain itu juga ketika LL dalam mode operasi penambahan maupun penghapusan node. Pastikan kita sudah menggambarkan dengan benar tentang perubahan-perubahan terhadap kondisi panah penghubung. Sebelumnya begini, setelah proses jadi begitu. Misal, yang semula bernilai NULL alias nggak kemana-mana, setelah penambahan menjadi terhubung ke simpul terdepan.
baru->next = head;
Atau bisa juga misalnya yang semula menunjuk ke simpul X berubah dialihkan menunjuk ke simpul Y karena simpul X akan dihapus, dst.
if (temp->next == X)
{
temp->next = Y;
free(X);
}
Jadi ilustrasikan dulu skema prosesnya, baru tuliskan codingnya.

TIPS 3. Jangan takut mencoba.
Practice make perfect. Silahkan dicoba berbagai macam skenario yang mungkin terjadi. Tambah di depan, tambah di belakang atau sisipkan di tengah. Hapus simpul di tengah, hapus simpul yang di belakang sendiri atau hapus simpul yang terdepan. Bagaimana pula klo LL-nya adalah Double, artinya punya dua pointer (panah penghubung) sehingga sebuah simpul bisa membaca simpul berikutnya dan juga simpul sebelumnya. Silahkan dicoba itu semua. Siapkan selembar kertas untuk menggambarkan ilustrasi prosesnya. Pasti akan asyik dan menarik :)

OK. Mungkin itu dulu tiga tips dari saya. Semoga ada manfaatnya. If there are any question, please remind me and write something right here. Perhaps i do can help :D

Tuesday 21 April 2009

Contoh Program Menu Linked List

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
struct node{
int info;
struct node *next;
};
typedef struct node *simpul;

void main()
{
simpul baru, head=NULL, tail=NULL, temp;
int pilih;
do
{
printf("MENU\n");
printf("1. Insert\n");
printf("2. View\n");
printf("3. Search\n");
printf("4. Delete\n");
printf("PILIH: ");
scanf("%d", &pilih);
switch(pilih)
{
case 1:
int data;
printf("Data Masuk: ");
scanf("%i", &data);
baru = (simpul) malloc(sizeof (struct node));
baru->info = data;
baru->next = NULL; //tidak menuju simpul mana2
if (head == NULL) //khusus simpul pertama LL
{
head = baru; //pointer head, tail, baru sama
tail = baru;
}
else //untuk simpul2 berikutnya
{
tail->next = baru; //sambungkan di belakang
tail = baru;
}
break;
case 2:
temp = head; //tampilkan mulai dr depan
while(temp!=NULL) //ulangi sampai temp bernilai NULL
{
printf("%i ", temp->info);
temp = temp->next; //geser temp ke belakang
}
printf("\n");
break;
case 3:
int cari;
printf("Cari Angka: ");
scanf("%i", &cari);
temp = head;
while((temp!=NULL)&&(temp->info!=cari))
{
temp = temp->next;
}
if(temp != NULL && temp->info == cari)
printf("Data Ditemukan");
else //if(temp == NULL)
printf("Data Tidak Ditemukan");
printf("\n");
break;
case 4:
int hapus;
char jwb;
simpul prev = NULL;
printf("Hapus Angka: ");
scanf("%i", &hapus);
temp = head;
while((temp!=NULL)&&(temp->info!=hapus))
{
//prev selalu berada 1 simpul di belakang temp
prev = temp;
temp = temp->next;
}
if(temp != NULL && temp->info == hapus)
{
printf("Yakin Dihapus? (y/t)");
flushall();
jwb=getch();
if(jwb == 'y')
{
//jika hapus simpul di tengah
if(temp->next != NULL && temp != head)
prev->next = temp->next;
//jika hapus di depan dan tinggal 1 simpul
else if (temp == head && head->next == NULL)
{
head = NULL;
}
//jika hapus di depan tapi masih ada simpul berikutnya
else if (temp == head && head->next != NULL)
{
head = head->next;
}
//jika hapus di belakang
else if (temp->next == NULL)
{
prev->next = NULL;
tail = prev;
}
free(temp); //hapus dr memori
}
else
printf("Batal Dihapus");
}
else
printf("Data Tidak Ditemukan");
printf("\n");
break;
}
}while (pilih!=5);
}

Monday 20 April 2009

Contoh Program Linked List Sederhana dalam Bahasa C

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct simpul {
char nama[20];
float nilai;
struct simpul *next_simpul;
} simpulku;
void main()
{ simpulku *simpul1, *simpul2, *simpul3, *simpul4, *temp;
//alokasikan memorinya dulu
simpul1 = (simpulku *)malloc(sizeof(simpulku));
simpul2 = (simpulku *)malloc(sizeof(simpulku));
simpul3 = (simpulku *)malloc(sizeof(simpulku));
//isi data masing2 simpul
strcpy(simpul1->nama, "Amin");
strcpy(simpul2->nama, "Budi");
strcpy(simpul3->nama, "Citra");
simpul1->nilai=90; simpul2->nilai=20;
simpul3->nilai=100;
simpul1->next_simpul = NULL;
//sambungkan link masing2 simpul
simpul1->next_simpul = simpul2;
simpul2->next_simpul = simpul3;
simpul3->next_simpul = NULL;
//tampilkan hasilnya, mulai dr simpul 1
temp = simpul1; //cara satu per satu
printf("%s, %f\n", temp->nama, temp->nilai);
temp = temp->next_simpul;
printf("%s, %f\n", temp->nama, temp->nilai);
temp = temp->next_simpul;
printf("%s, %f\n", temp->nama, temp->nilai);
printf("\n");
temp = simpul1;
for(;temp!=NULL; temp=temp->next_simpul) //cara looping
printf("%s, %f\n", temp->nama, temp->nilai);

//skenario menambahkan simpul baru
simpul4 = (simpulku *)malloc(sizeof(simpulku)); //siapkan
strcpy(simpul4->nama, "Dewi");simpul4->nilai=80; //isi
simpul2->next_simpul = simpul4; //update link
simpul4->next_simpul = simpul3;
printf("\n");
temp = simpul1;
for(;temp!=NULL; temp=temp->next_simpul) //cara looping
printf("%s, %f\n", temp->nama, temp->nilai);
//menghapus simpul budi
simpul1->next_simpul = simpul4; //update link
free(simpul2); //hapus simpul
printf("\n");
temp = simpul1;
for(;temp!=NULL; temp=temp->next_simpul) //cara looping
printf("%s, %f\n", temp->nama, temp->nilai);
}