• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
5 6 single-linked_list
 

5 6 single-linked_list

on

  • 1,854 views

 

Statistics

Views

Total Views
1,854
Views on SlideShare
1,784
Embed Views
70

Actions

Likes
0
Downloads
55
Comments
0

1 Embed 70

http://wandiparlente.blogspot.com 70

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    5 6 single-linked_list 5 6 single-linked_list Document Transcript

    • BAB 6 SINGLY LINKED LIST (SENARAI BERKAIT TUNGGAL)1. Tujuan Instruksional Umum a. Mahasiswa dapat melakukan perancangan aplikasi menggunakan struktur Linked List (Senarai Berkait) b. Mahasiswa mampu melakukan analisis pada algoritma Linked List yang dibuat c. Mahasiswa mampu mengimplementasikan algoritma Linked List pada sebuah aplikasi secara tepat dan efisien2. Tujuan Instruksional Khusus a. Mahasiswa dapat menjelaskan mengenai Linked List b. Mahasiswa dapat membuat dan mendeklarasikan Abstraksi Tipe Data Linked List c. Mahasiswa mampu menerapkan operasi Single Linked List Non Circular : Insert, update, dan delete d. Mahasiswa mampu menerapkan operasi Single Linked List Circular : Insert, update, dan deletePengertian Linked List Salah satubentuk struktur data yang berisi kumpulan data yang tersusun secarasekuensial, saling bersambungan, dinamis dan terbatas adalah senarai berkait (linkedlist). Suatu senarai berkait (linked list) adalah suatu simpul (node) yang dikaitkandengan simpul yang lain dalam suatu urutan tertentu. Suatu simpul dapat berbentuksuatu struktur atau class. Simpul harus mempunyai satu atau lebih elemen struktur atauclass yang berisi data. Secara teori, linked list adalah sejumlah node yang dihubungkan secara linierdengan bantuan pointer. Dikatakan singly (single) linked apabila hanya ada satu pointeryang menghubungkan setiap node. Singly artinya field pointer-nya hanya satu buah sajadan satu arah Senarai berkait adalah struktur data yang paling dasar. Senarai berkait terdiriatas sejumlah unsur-unsur dikelompokkan, atau terhubung, bersama-sama di suatu deretyang spesifik. Senarai berkait bermanfaat di dalam memelihara koleksi-koleksi data,yang serupa dengan array/larik yang sering digunakan. Bagaimanapun juga, senaraiberkait memberikan keuntungan-keuntungan penting yang melebihi array/larik dalambanyak hal. Secara rinci, senarai berkait lebih efisien di dalam melaksanakanpenyisipan-penyisipan dan penghapusan-penghapusan. Senarai berkait jugamenggunakan alokasi penyimpanan secara dinamis, yang merupakan penyimpananyang dialokasikan pada runtime. Karena di dalam banyak aplikasi, ukuran dari data itutidak diketahui pada saat kompile, hal ini bisa merupakan suatu atribut yang baik juga.Setiap node akan berbentuk struct dan memiliki satu buah field bertipe struct yangsama, yang berfungsi sebagai pointer. Dalam menghubungkan setiap node, kita dapatmenggunakan cara first-create-first-access ataupun first-create-last-access. Yangberbeda dengan deklarasi struct sebelumnya adalah satu field bernama next, yangbertipe struct tnode. Hal ini sekilas dapat membingungkan. Namun, satu hal yang jelas,variabel next ini akan menghubungkan kita dengan node di sebelah kita, yang jugabertipe struct tnode. Hal inilah yang menyebabkan next harus bertipe struct tnode. 1
    • Senarai berkait tunggal (Singly Linked List) Senarai berkait yang paling sederhana, di mana unsur-unsur terhubung olehsuatu pointer. Struktur ini mengizinkan senarai dilintasi dari elemen pertama sampaielemen terakhir.Senarai berkait ganda (Doubly Linked List) Senarai berkait di mana unsur-unsur yang terhubung oleh dua pointer sebagaigantinya. Struktur ini mengizinkan senarai untuk dilintasi kedua-duanya secara majumundur.Senarai sirkular (Circular List) Senarai berkait di mana elemen yang terakhir terhubung dengan elemen yangpertama sebagai ganti set ke NULL. Struktur ini mengizinkan senarai untuk dilintasisecara lingkar.Abstraksi Tipe Data Singly Linked List Non Circular Pembuatan struct bernama tnode berisi 2 field, yaitu field data bertipe integerdan field next yang bertipe pointer dari tnode.Deklarasi node dengan struct struct tnode { int data; struct tnode *next; } Gambar 1. Sebuah node pada Singly Linked List Asumsikan kita memiliki sejumlah node yang selalu menoleh ke sebelah dalamarah yang sama. Atau, sebagai alat bantu, Anda bisa mengasumsikan beberapa orangyang bermain kereta api. Yang belakang akan memegang yang depan, dan semuanyamenghadap arah yang sama. Setiap pemain adalah node. Dan tangan pemain yangdigunakan untuk memegang bahu pemain depan adalah variabel next. Sampai di sini,kita baru saja mendeklarasikan tipe data dasar sebuah node. Selanjutnya, kita akan mendeklarasikan beberapa variabel pointer bertipe structtnode. Beberapa variabel tersebut akan kita gunakan sebagai awal dari linked list, nodeaktif dalam linked list, dan node sementara yang akan digunakan dalam pembuatan nodedi linked list. Berikan nilai awal NULL kepada mereka. Deklarasi node untuk beberapakeperluan, seperti berikut ini: struct tnode *head=NULL, *curr=NULL, *node=NULL;Dengan demikian, sampai saat ini, telah dimiliki tiga node. Satu sebagai kepala (head),satu sebagai node aktif dalam linked list (curr) dan satu lagi node sementara (node). Sekarang telah siap untuk membuat singly linked list. Untuk itu, akandimasukkan nilai tertentu sebagai nilai untuk field data dengan cara melakukanperulangan sehingga campur tangan user tidak diperlukan. Seperti yang diungkapkan sebelumnya, bahwa akan dibuat Singly Linked List(SLL) dengan cara first-create-first-access. Dengan cara ini, node yang dibuat pertamaakan menjadi head. Node-node yang dibuat setelahnya akan menjadi node-node 2
    • pengikut. Untuk mempermudah pengingatan, ingatlah gambar anak panah yangmengarah ke kanan. Head akan berada pada pangkal anak panah, dan node-nodeberikutnya akan berbaris ke arah bagian anak panah yang tajam. Gambar 2 Singly Linked List Apabila diperhatikan, setiap node memiliki petunjuk untuk node sebelahnya.Bagaimana dengan node terakhir? Akan diberikan nilai NULL. Dengan demikian, setiapnode kebagian jatah. int i; for (i=0; i<5; i++) { node = (struct tnode *) malloc (sizeof(struct tnode)); node -> data = i; if (head == NULL) { head = node; curr = node; }else { curr -> next = node; curr = node; } } curr -> next = NULL; Berikut adalah penjelasan kode-kode pembuatan singly linked list tersebut.Pertama-tama, akan dibuat perulangan dari 0 sampai 4, yang dimaksudkan untukmembuat lima buah node yang masing-masing field data nya berisikan nilai dari 0sampai 4. Pembuatan node dilakukan dengan fungsi malloc(). for (i=0; i<5; i++) { node = (struct tnode *) malloc (sizeof(struct tnode)); node -> data = i; ... ... }Setelah itu, perlu dibuat node dan penghubung. Pertama-tama, akan diuji apakah headbernilai NULL. Kondisi head bernilai NULL hanya terjadi apabila belum dimiliki satunode pun. Dengan demikian, node tersebut akan dijadikan sebagai head. Node aktif(curr), juga kita dapat dari node tersebut. Sekarang, bagaimana kalau head tidak bernilai NULL alias telah dimiliki satuatau lebih node? Yang pertama dilakukan adalah menghubungkan pointer next darinode aktif (curr) ke node yang baru saja dibuat. Dengan demikian, baru saja dibuatpenghubung antara rantai lama dengan mata rantai baru. Atau, dalam permainan keretaapi, pemain paling depan dalam barisan lama akan menempelkan tangannya pada bahu 3
    • pemain yang baru bergabung. Node aktif (curr) kemudian dipindahkan ke node yangbaru dibuat. if (head == NULL) { head = node; curr = node; } Gambar 3 Membuat elemen pertama SLL else { curr->next=node; curr = node; } Gambar 4. Penambahan elemen dibelakang SLLSetelah semuanya dibuat, sudah saatnya bagi kita untuk menghubungkan pointer nextuntuk mata rantai terakhir ke NULL. curr -> next = NULL;Dan selamat! Singly linked list baru saja diciptakan. Ada yang terlupa? Ada. Bagaimanakita tahu bahwa linked list yang kita ciptakan adalah linked list yang benar? Salah satucara untuk mengetahuinya adalah dengan mencetak field x untuk semua node. Dari headsampai node terakhir. curr = head; while (curr != NULL) { printf(“%d “, curr -> data); curr = curr -> next; } printf(“n”);Pertama-tama, kita meletakkan node aktif (curr) ke posisi head. Setelah itu, kita akanpindahkan kunjungi satu per satu node dengan memindahkan node aktif (curr) ke posisisebelahnya. Semua kunjungan tersebut akan kita lakukan apabila node aktif (curr) tidakmenemui NULL. Anda mungkin ingin menambahkan pemanggilan free() untukmelakukan dealokasi.Kode selengkapnya: #include <stdio.h> #include <stdlib.h> int main() { struct tnode { int data; struct tnode *next; }; struct tnode *head=NULL, 4
    • *curr=NULL, *node=NULL; int i; for (i=0; i<5; i++) { node = (struct tnode *) malloc (sizeof(struct tnode)); node -> data = i; if (head == NULL) { head = node; curr = node; }else { curr -> next = node; curr = node; } } curr -> next = NULL; curr = head; while (curr != NULL) { printf(“%d “, curr -> data); curr = curr -> next; } printf(“n”); free(); return 0; }Abstraksi Tipe Data Singly Linked List Circular Hampir sama dengan singly linked list non circular, bahwa dibutuhkan sebuahkait untuk menghubungkan node-node data yang ada, dimana pada node terakhir atautail yang semula menunjukkan NULL diganti dengan menunjuk ke kepala atau head.Dimana inisialisasi senarai berkait tunggal sirkular menggunakan struc adalah sebagaiberikut:Deklarasi Singly Linked List Circular Struct tnode { int data; tnode *next; }; void main() { head = new tnode; Gambar 5. Singly Linked List circular head->next = head; }Menambah node dan membuat tail dari singly linked list circularDeklarasi penambahan node baru Void main() { node = new tnode; tail = new tnode; node->next = head->next; head->next = node; tail = node; } Gambar 6. Penambahan Node baru 5
    • Menyisipkan Node baru Gambar 7 Menyisipkan Node BaruDeklarasi menyisipkan node baru menggunakan sintak berikut: Void main() { node = new tnode; node->next = head->next; head->next = node; }Menghapus Node dari Singly Linked List Circular Gambar 8. Menghapus node dari SLLCDeklarasi menghapus node dari singly linked list circular, menggunakan sintaks berikut: Void main() { hapus = new tnode; if( head != tail) { hapus = head; head = head->next; tail->next = head; delete hapus; }else { head = NULL; tail = NULL; 6
    • } }Contoh Soal Singly Linked List Circular dengan menggunakan bahasa C++ danberkerja pada kompiler Borland C++. #include <windows.h> #include <iostream> #include <conio.h> using namespace std; class CL_list { private: struct node { int data; node *link; }; struct node *p; public: CL_list(); CL_list(CL_list& l); ~CL_list(); void add(int); void del(); void addatbeg(int); void display(); void slideshow(float,int,int); int count(); void wait(float); bool operator ==(CL_list); bool operator !=(CL_list); void operator =(CL_list); }; CL_list::CL_list() { p=NULL; } CL_list::CL_list(CL_list& l) { node *x; p=NULL; x=l.p; if(x==NULL) return; for(int i=1;i<=l.count();i++) { add(x->data); x=x->link; } } CL_list::~CL_list() { node *q,*t; q=p; t=p; if(p==NULL) return; while(q->link!=t) { p=q; q=q->link; delete p; } p=q; 7
    • delete p;}void CL_list::add(int n){ if(p==NULL) { node *q; q=new node; q->data=n; q->link=q; p=q; return; } node *q; q=p; while(q->link != p) q=q->link; node *t; t=new node; t->data=n; t->link=p; q->link=t;}void CL_list::display(){ if(p==NULL) { cout<<"EMPTY LISTn"; return; } node *q; q=p; for(int i=1;i<=this->count();i++) { cout<<q->data<<endl; q=q->link; }}int CL_list::count(){ node *q; q=p; int c=0; if(p==NULL) return 0; else c++; while(q->link != p) { c++; q=q->link; } return c;}void CL_list::del(){ if(p==NULL) return; if(p->link==p) { p=NULL; } else { 8
    • node *q; q=p; while(q->link != p ) q=q->link; q->link=p->link; q=p; p=(q->link == NULL ? NULL : p->link); delete q; }}void CL_list::addatbeg(int n){ node *q,*t; q=p; while(q->link!=p) q=q->link; t=new node; t->data=n; t->link=p; q->link=t; p=t;}void CL_list::slideshow(float dlay,int x,int y){ /* if(p==NULL) { gotoxy(x,y); cout<<"EMPTY LISTn"; return; } node *q; q=p; while(!kbhit()) { gotoxy(x,y); cout<<" "; gotoxy(x,y); cout<<q->data; wait(dlay); q=q->link; }*/}void CL_list::wait(float t){ long time=GetTickCount()+(t*1000L); while(GetTickCount()<=time) { /* WAIT !!! */ }}bool CL_list::operator ==(CL_list t){ if(t.p==NULL && p==NULL) return 1; if(this->count() != t.count()) return 0; node *q; q=p; bool flag; flag=1; node *a; a=t.p; 9
    • for(int i=1;i<=count();i++) { if(a->data!=q->data) flag=0; a=a->link; q=q->link; } if(a->data!=q->data) flag=0; return flag; } bool CL_list::operator !=(CL_list t) { return !(this->operator==(t)); } int main() { CL_list a; a.add(1); a.add(2); a.add(3); a.add(4); a.addatbeg(128); a.del(); // 128 is deleted cout<<"nLIST DATA:n"; a.display(); CL_list b=a; if(b!=a) cout<<endl<<"NOT EQUAL"<<endl; else cout<<endl<<"EQUAL"<<endl; a.slideshow(1,13,13); return 0; }Soal Buatlah program Singly Linked List Circular yang flesibel dan dinamis. Dimanapengguna dapat menambah node baru beserta datanya, membaca semua data padasenarai, menghapus node dengan data yang ditentukan oleh pengguna.Daftar Rujukan 1. Abdul Kadir. 1991. Pemrograman Dasar Turbo C untuk IBM PC. Yogyakarta: Penerbit Andi 2. Andri Kristanto. 2003. Struktur Data dengan C++. Yogyakarta: Graha Ilmu 3. Antonius Rachmat C. Handout Struktur Data. Prodi Teknik Informatika Universitas Kristen Duta Wacana 4. Karve, Sanchit. Basic Data Structures in C++. www.dreamincode.net /forums /index.php 5. Noprianto. 2004. Linked List pada C. www.infolinux.web.id 10