Tugas2 - RESUME Linked List

Embed Size (px)

Citation preview

RESUMEALGORITMA DAN STRUKTUR DATA(LINKED LIST)

OLEH:NI KADEK DWI ASRI (1108605048)

JURUSAN ILMU KOMPUTERFAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAMUNIVERSITAS UDAYANA2012PENDAHULUAN

A. Pengertian Linked ListLinked list atau yang biasa disebut senarai berkait merupakan struktur data yang terdiri dari beberapa simpul (node) dimana setiap simpulnya saling terhubung (linked). Simpul berupa struct, sedangkan link berupa komponen simpul yang bertipe pointer ke simpul. Bersifat dinamis dan memakai perintah malloc() dan free().Umumnya memiliki pointer head untuk menunjukkan alamat simpul terdepan dan pointer tail untuk menunjukkan simpul terakhir. Operasi penambahan/ penghapusan sebuah simpul akan meng-update nilai pointer link-nya. Pointer link simpul terakhir diberi nilai NULL (kecuali untuk circular linked list).

B. Kelebihan Linked ListAdapun kelebihan dari Linked List, yaitu:1. Mudah untuk melakukan penambahan dan penghapusan elemen (jika dibandingkan pada array tidak mungkin menambahkan elemen, karena banyaknya elemen sudah ditentukan dari awal)2. Panjang list bisa diubah dengan bebas (panjang array telah ditentukan dari awal dan tidak dapat dirubah)3. Mudah untuk menyambungkan beberapa list, maupun memutuskannya (jika dibandingkan pada array, array tidak bisa menyambung ataupun memutuskan elemen yang telah ada)

C. Jenis-jenis Linked ListAdapun jenis-jenis linked list adalah sebagai berikut:1. Single Linked List2. Double Linked List3. Circular Linked Lista. Single Circular Linked Listb. Double Circular Linked ListPenjelasan masing-masing jenis linked list akan dibahas pada BAB I, BAB II, dan BAB III.

BAB ISINGLE LINKED LIST

1.1. Pengertian Single Linked ListSenarai berkait tunggal (Single Linked List) yang selanjutnya akan disingkat dengan SLL adalah senarai berkait yang setiap simpulnya mengacu satu simpul lain dan diacu satu simpul lain dengan pengecualian pada simpul terakhir mengacu pada NULL dan simpu; pertama tidak diacu simpul lain. Simpul SLL mempunyai satu field bertipe pointer.

Gambar 1.1. Contoh Single Linked List

Pada Gambar 1.1. mengilustrasikan sebuah SLL yang simpulnya terdiri atas dua field. Field dengan kotak yang ukurannya lebih besar adalah field data, sedangkan yang ukurannya lebih kecil adalah pointer. Simpul-simpul SLL berada di memori heap dialokasikan secara dinamik dengan menggunakan instruksi malloc(), sedangkan pointer head berada di memori lokal (local stack memory). Pointer head mengacu atau menunjuk simpul pertama SLL (simpul paling kiri). Field pointer pada simpul terakhir diberikan nilai NULL, untuk menandai bahwa simpul tersebuttidak menunjuk simpul lain.

Dalam pembuatan Single Linked List dapat menggunakan 2 Metoda : LIFO ( Last In First Out ), aplikasinya : Stack (Tumpukan) FIFO ( First In First Out ), aplikasinya : Queue (Antrian)

LIFO (Last In First Out)LIFO adalah suatu metoda pembuatan Linked List dimana data yang masuk paling akhir adalah data yang keluar paling awal. Hal ini dapat dianalogikan dengan menumpukan barang pada kehidupan seharihari. Pembuatan simpul pada suatu linked list disebut dengan istilah INSERT. Jika linked list dibuat dengan Metoda LIFO maka penambahan/insert simpul dilakukan di BELAKANG.

FIFO (First In First Out)FIFO adalah suatu metoda pembuatan Linked List dimana data yang masuk paling awal adalah data yang keluar paling awal juga. Jika linked list dibuat dengan menggunakan FIFO, maka terjadi penambahan / Insert simpul di depan.

Gambar 1.2. Ilustrasi FIFO dan LIFO

1.2. Deklarasi Tipe Data Simpul Single Linked ListPada umumnya, deklarasi tipe data simpul Single Linked List adalah sebagai berikut:

struct tnode { int data; struct tnode *next;};Simpul SLL berupa structure (record) yang terdiri atas beberapa field yang salah satunya bertipe pointer. Field pointer ini biasanya diberi nama next. Karena field pointer ini berfungsi untuk mengacu simpul yang lain yang sejenis maka deklarasi field pointer ini dilakukan secara rekursif. Pada contoh diatas tnode adalah tipe simpul yang terdiri atas dua field: sebuah integer dan sebuah pointer.

Adapun deklarasi pointer penunjuk kepala (head) SLL adalah:

struct tnode node;node *head, *N;Deklarasi ini digunakan untuk mengakses field data dari simpul yang diacu pointer head adalah head->data.

Beberapa fungsi yang harus ada dalam membuat sebuah program Linked List adalah:1. Deklarasi Tipe Data Simpul SLL:2. Deklarasi Pointer Penunjuk Head SLL3. Deklarasi awal()

void awal(){ head = NULL;}Fungsi awal() akan dipanggil di awal program. Artinya pada saat kita mulai menjalankan program belum terdapat list, sehingga head di-set kosong (NULL).4. Deklarasi isEmpty()

int isEmpty(){ if (head==NULL) return 1; else return 0;}Fungsi isEmpty() akan dipanggil pada saat pengecekan kosong/ tidaknya list. Saat (head==NULL) atau list sedang kosong maka isEmpty() akan memberikan nilai 1 ke fungsi yang memanggilnya. Sedangkan jika tidak kosong maka isEmpty() akan memberikan nilai 0 ke fungsi yang memanggilnya.

Operasi Single Linked List: Operasi-operasi yang ada di SLL adalah:1. Pembentukan Simpul Baru (Node)Terdapat 2 kondisi saat pembentukan simpul baru, yaitu saat list masih kosong (head==NULL) dan list tidak kosong. Saat (head==NULL)Langkah-langkah:a. Memesan sebuah simpul baru dengan menggunakan intruksi malloc()b. Memasukkan data/ nilai ke dalam simpulc. Memberikan nilai NULL kepada field pointer nextd. Mengubah pointer head sehingga menunjuk pointer tersebutIlustrasi:

Gambar 1.3. Pembentukan Simpul PertamaSource code:

printf("masukkan bilangan : ");scanf("%d",&bil);node = (tnode*) malloc(sizeof(tnode)); //anode->data=bil; //bif (isEmpty()){ node->next=NULL; //c head=node; //d} Saat (head!=NULL)Saat (head!=NULL) merupakan penambahan simpul baru dimana sudah terdapat simpul-simpul yang saling berkaitan. Hal ini juga disebut penambahan simpul di awal (sebelah kiri). Langkah-langkah:a. Memesan sebuah simpul baru dengan menggunakan intruksi malloc()b. Memasukkan data/ nilai ke dalam simpulc. Mengkaitkan field pointer next pada simpul baru ke simpul yang ditunjuk head (hal ini menyebabkan simpul baru ini terhubung ke SLL dan menjadi simpul pertama. d. Mengubah pointer head sehingga menunjuk ke simpul baru ini.Ilustrasi:

Gambar 1.4. Pembentukan Simpul KeduaSource code:

printf("Masukkan bilangan : ");scanf("%d",&bil);node = (tnode*) malloc(sizeof(tnode)); //anode->data=bil; //bif(!isEmpty()){ node->next=head; //c head=node; //d}

2. Penambahan Simpul (Node)a. Penambahan Simpul dari depan (sebelah kiri)Untuk penambahan simpul dari depan (sebelah kiri) telah dibahas sebelumnya pada pembuatan simpul baru saat (head!=NULL).b. Penambahan Simpul dari belakang (sebelah kanan)Ilustrasi:

3030

3030

Gambar 1.5. Ilustrasi Penambahan Simpul dari belakang

Source Code:

void insertKanan(){ if(isEmpty()) { head=N; } else { node *temp; temp=head; while(temp->next!=NULL) temp=temp->next; temp->next=N; }}

3. Penghapusan Simpul (Node)a. Penghapusan Simpul dari depan (Sebelah Kiri)Ilustrasi:

Gambar 1.6. Penghapusan Simpul dari depanSource Code:

void hapusKiri(){ if(!isEmpty()) { node *temp; temp=head; head=head->next; free(temp); } else printf("Data sudah habis");}

b. Penghapusan Simpul dari belakang (Sebelah Kanan)Ilustrasi:

Gambar 1.7. Penghapusan Dimpul dari belakang

Source Code:

void hapusKanan(){ if(!isEmpty()) { node *temp=head; printf("%d ", temp->data); if(temp->next!=NULL) { while(temp->next->next!=NULL) { temp=temp->next; } free(temp->next); temp->next=NULL; } else { free(temp); awal(); } } else printf("Data sudah habis");}

4. Mencetak Linked List

Ilustrasi:

Gambar 1.8. Mencetak Linked ListSource Code:

void showList(){ node *temp=head; if (!isEmpty()) { while(temp->next!=NULL) { printf("%d ",temp->data); temp=temp->next; } printf("%d ",temp->data); } else printf("Data sudah tidak ada");}1.3. Contoh Program

#include #include #include typedef struct tnode {int data;struct tnode *next;};typedef struct tnode node;node *N,*head;void awal(){ head=NULL;}int isEmpty(){ if(head==NULL) return 1; else return 0;}void newNode(int bil){ N=(node*) malloc(sizeof(node)); if(N!=NULL) { N->data=bil; N->next=NULL; } else printf("Pembuatan simpul gagal");} void insertKiri(){ if(!isEmpty()) N->next=head; head=N;}

void insertKanan(){ if(isEmpty()) { head=N; } else { node *temp; temp=head; while(temp->next!=NULL) temp=temp->next; temp->next=N; }}void showList(){ node *temp=head; if (!isEmpty()) { while(temp->next!=NULL) { printf("%d ",temp->data); temp=temp->next; } printf("%d ",temp->data); } else printf("Data sudah tidak ada");}void hapusKiri(){ if(!isEmpty()) { node *temp; temp=head; head=head->next; free(temp); printf("Data terhapus!"); } else printf("Data sudah habis");}

void hapusKanan(){ if(!isEmpty()) { node *temp=head; printf("%d ", temp->data); if(temp->next!=NULL) { while(temp->next->next!=NULL) { temp=temp->next; } free(temp->next); temp->next=NULL; printf("Data terhapus!"); } else { free(temp); awal(); printf("Data terhapus!"); } } else printf("Data sudah habis");}void main(){ awal(); int pil, angka, bil; printf("\t\t\t==========================\n"); printf("\t\t\tProgram Single Linked List\n"); printf("\t\t\t==========================\n\n"); do { printf ("\n\nMENU\n"); printf ("1. Tambah Kiri\n"); printf ("2. Tambah Kanan\n"); printf ("3. Show Data\n"); printf ("4. Hapus Kiri\n"); printf ("5. Hapus Kanan\n"); printf ("0. Exit\n"); printf("Masukkan pilihan : "); scanf("%d",&pil);

switch(pil) { case 1: printf ("\n\nTambah Kiri\n"); printf ("-----------\n"); printf("Masukkan data : ");scanf("%d",&angka); newNode(angka); insertKiri(); break; case 2: printf ("\n\nTambah Kanan\n"); printf ("-----------\n\n"); printf("Masukkan data : ");scanf("%d",&angka); newNode(angka); insertKanan(); break; case 3: printf ("\n\nShow List\n"); printf ("-----------\n\n"); showList(); getch(); break; case 4: printf ("\n\nHapus Kiri\n"); printf ("-----------\n\n"); hapusKiri(); getch(); break; case 5: printf ("\n\nHapus Kanan\n"); printf ("-----------\n\n"); hapusKanan(); getch(); break; case 0: exit(0); getch(); default : printf("Input salah"); getch(); } }while (pil!=0);}Contoh Eksekusi Program

BAB IIDOUBLE LINKED LIST

2.1 Pengertian Double Linked ListSenarai berkait ganda atau Double Linked List disingkay DLL, adalah senarai berkait yang setiap simpulnya mengacu dua simpul lain dan diacu dua simpul lain. Dengan pengecualian pada simpul pertama dan terakhir yang masing-masing mengacu satu simpul lain dan diacu satu simpul lain.Simpul DLL mempunyai dua field pointer yang biasanya diberi nama prev dan next. Pointer prev digunakan untuk mengacu simpul sebelumnya dan pointer next digunakan untuk mengacu simpul berikutnya. Pada gambar 2.1 pointer next berada di bagian kanan dan pointer prev berada pada bagian kiri simpul.

Gambar 2.1 Senarai Berkait Ganda

2.2 Deklarasi Tipe Data Double Linked ListPada umumnya, deklarasi tipe data simpul Double Linked List adalah sebagai berikut:

struct tnode { int data; struct tnode *next, *prev;};Simpul SLL berupa structure (record) yang terdiri atas beberapa field. Dua diantara field tersebut, harus berupa pointer yang digunakan untuk menunjuk ke simpul sebelumnya (prev) dan simpul berikutnya (next). Jadi prev dan next menunjuk simpul lain yang tipenya sama dengan tipe simpul tempat prev dan next berada.

Sebuah DLL biasanya diacu dua buah pointer, satu untuk menunjuk simpul pertama (biasanya diberi nama head) dan satu lagi untuk menunjuk simpul terakhir (biasanya diberi nama tail). Pada saat DLL masih kosong (belum ada simpul), head dan tail diberi nilai NULL. Pointer lainnnya dideklarasikan sesuai kebutuhan.

struct tnode node;node *head, *N;

Beberapa fungsi yang harus ada dalam membuat sebuah program Linked List adalah:1. Deklarasi Tipe Data Simpul DLL:2. Deklarasi Pointer Penunjuk Head DLL3. Deklarasi awal()

void awal(){ head = NULL; tail = NULL;}Fungsi awal() akan dipanggil di awal program. Artinya pada saat kita mulai menjalankan program belum terdapat list, sehingga head dan tail di-set kosong (NULL).4. Deklarasi isEmpty()

int isEmpty(){ if (head==NULL) return 1; else return 0;}Fungsi isEmpty() akan dipanggil pada saat pengecekan kosong/ tidaknya list. Saat (head==NULL) atau list sedang kosong maka isEmpty() akan memberikan nilai 1 ke fungsi yang memanggilnya. Sedangkan jika tidak kosong maka isEmpty() akan memberikan nilai 0 ke fungsi yang memanggilnya.

Operasi Double Linked List: Operasi-operasi yang ada di DLL adalah:1. Pembentukan Simpul Baru (Node)Terdapat 2 kondisi saat pembentukan simpul baru, yaitu saat list masih kosong (head dan tail==NULL) dan list tidak kosong. Saat (head dan tail==NULL)Langkah-langkah:a. Memesan sebuah simpul baru dan memasukkan data/ nilai ke dalam simpulb. Memberikan nilai NULL kepada field pointer next dan prevc. Mengubah pointer head sehingga menunjuk simpul inid. Mengubah pointer tail sehingga menunjuk simpul iniIlustrasi:

Gambar 2.2. Pembentukan Simpul PertamaSource code:

scanf("%d",&bil);node=(tnode*) malloc (sizeof(tnode));node->data=bil; //anode->prev=NULL //bnode->next=NULL //bif(head==NULL){ head=node; //c tail=node; //d}

Saat (head dan tail!=NULL)Saat (head dan tail!=NULL merupakan penambahan simpul baru dimana sudah terdapat simpul-simpul yang saling berkaitan. Hal ini juga disebut penambahan simpul di awal (sebelah kiri). Langkah-langkah:a. Memesan sebuah simpul baru dan memasukkan data/ nilai ke dalam simpulb. Memberikan nilai NULL kepada field pointer prev simpul baruc. Mengubah pointer prev dari simpul yang ditunjuk pointer head agar menunjuk simpul barud. Mengubah pointer next dari simpul baru agar menunjuk simpul yang ditunjuk pointer head e. Mengubah pointer head sehingga menunjuk simpul baruIlustrasi:

Gambar 2.3. Pembentukan Simpul KeduaSource code:

scanf("%d",&bil);node=(tnode*) malloc (sizeof(tnode));node->data=bil; //anode->prev=NULL //bif(head!=NULL){ head->prev=node; //c node->next=head //d head=node; //e}

2. Penambahan Simpul (Node)a. Penambahan Simpul dari depan (sebelah kiri)Untuk penambahan simpul dari depan (sebelah kiri) telah dibahas sebelumnya pada pembuatan simpul baru saat (head dan tail !=NULL).b. Penambahan Simpul dari belakang (sebelah kanan)Langkah-langkah:a. Memesan sebuah simpul baru, memasukkan data/ nilai ke dalam simpul, dan memberikan nilai NULL kepada pointer nextb. Mengubah pointer next dari simpul yang ditunjuk pointer tail agar menunjuk simpul baruc. Mengubah pointer prev dari simpul baru agar menunjuk simpul yang ditunjuk pointer taild. Mengubah pointer tail sehingga menunjuk simpul baru

Ilustrasi:

Gambar 2.4. Ilustrasi Penambahan Simpul dari belakang

Source Code:

void tambah_akhir (struct tnode **h, struct tnode **t, int bil){ struct tnode *node; node=(struct tnode*) malloc (sizeof(struct tnode)); node->data=bil; //a node->next=NULL; //a if (*h==NULL) { *h=node; node->prev=NULL; } else { (*t)->next=node; //b node->prev=*t; //c } *t=node; //d}

3. Penghapusan Simpul TertentuMenghapus simpul yang berada diantara simpul lain tidaklah sulit. Gambar 2.5 mengilustrasikan mekanisme penghapusan simpul bernilai 40 yang berada diantara simpul-simpul lain.Langkah-langkah:a. Pindahkan pointer node ke posisi simpul yang akan dihapus, dan pointer lainnya (current) dipindahkan ke posisi di sebelah kiri simpul yang akan di hapusnode = head;while (node->data != nilai_hapus){current = node;node = node-> next;}

b. Ubah pointer next dari simpul yang ditunjuk pointer current agar menunjuk ke simpul yang berada di sebelah kanan simpul yang ditunjuk pointer nodecurent->next = node->next;c. Ubah pointer prev dari simpul yang berada di sebelah kanan simpul yang ditunjuk pointer node agar menunjuk ke simpul yang ditunjuk pointer currentnode->next->prev = current;

d. Hapus simpul yang diacu pointer nodefree(node);Ilustrasi:

Gambar 2.5. Penghapusan Simpul Tertentu

4. Mencetak Linked ListSama halnya dengan mencetak Single Linked List, saat mencetak Double Linked List juga melakukan operasi menggunakan pointer (head dan tail). Terdapat dua buah operasi pencetakan yaitu dari head ke tail, dan dari tail ke head.

Source Code:

//head to tailvoid cetak_ht (struct tnode *h){ while (h != NULL) { printf("%d ",h->data); h=h->next; }}//tail to headvoid cetak_th (struct tnode *t){ while (t != NULL) { printf("%d ",t->data); t=t->prev; }}

2.3 Contoh Program

#include #include struct tnode{ int data; struct tnode *prev, *next;};void tambahAwal(struct tnode **h, struct tnode **t, int bil){ struct tnode *node; node=(struct tnode*)malloc(sizeof(struct tnode)); node->data=bil; node->prev=NULL; if(*h==NULL) *t=node; else (*h)->prev=node; node->next=*h; *h=node;}void tambahAkhir (struct tnode **h, struct tnode **t, int bil){ struct tnode *node; node=(struct tnode*) malloc (sizeof(struct tnode)); node->data=bil; node->next=NULL; if (*h==NULL) { *h=node; node->prev=NULL; } else { (*t)->next=node; node->prev=*t; } *t=node; }//head to tailvoid cetak_ht (struct tnode *h){ while(h != NULL) { printf("%d ",h->data); h=h->next; }}

//tail to headvoid cetak_th (struct tnode *t){ while (t != NULL) { printf("%d ",t->data); t=t->prev; }}void hapus (struct tnode **h, struct tnode **t){ struct tnode *node; while (*h!=NULL) { node=*h; *h=(*h)->next; free(node); } *t=NULL;}int main(){ struct tnode *head, *tail; int bil; head=tail=NULL; printf("\t\t\t==========================\n"); printf("\t\t\tProgram Single Linked List\n"); printf("\t\t\t==========================\n\n"); printf("Ketik Deretan Bilangan: "); do{ if(scanf("%d",&bil) != 1) break; tambahAwal(&head,&tail,bil); }while (1); printf("\n\nHead to Tail: "); cetak_ht(head); printf("\nTail to Head: "); cetak_th(tail); hapus(&head,&tail); return 0;}Contoh Eksekusi Program

BAB IIICIRCULAR LINKED LIST

3.1. Pengertian Circular Linked ListCircular Singly-Linked List adalah senarai berkait tunggal yang simpul terakhirnya mengacu simpul pertama. Circular Doubly-Linked List adalah senarai berkait ganda yang simpul terakhirnya selain mengacu simpul sebelumnya juga mengacu simpul pertama, dan simpul pertamanya selain mengacu simpul kedua juga mengacu simpul terakhir.

Gambar 3.1. Circular Singly-Linked List

Selain mengacu atau mengaitkan simpul terakhir ke simpu pertama dan sebaliknya, hal lain yang harus diingat jika membentuk circular linked list adalah untuk menandai simpul terakhir walaupun secara konsep linked list tersebut tidak berujung karena bentuknya melingkar. Penandaan simpul terakhir ini bermanfaat waktu menghapus simpul untuk mengembalikan memori yang dipakai kepada memori heap.

Gambar 3.2. Circular Doubly-Linked List

3.2. Bentuk Umum Circular Linked ListBentuk Umum dari Circular Singly-Linked List maupun Circular Doubly-Linked List hampir menyerupai bentuk umum dari Single Linked List dan Double Linked List, namun yang membedakan adalah pada circular linked list terdapat code yang digunakan untuk membuat linkes list itu memutar. Berikut ini adalah code nya:(*t)->next=*h

Code ini ditambahkan pada saat penambahan data (insert data). Dan diletakkan di bagian akhir dari fungsi insert data.

3.3. Contoh Program

#include #include typedef struct tnode{ int data; struct tnode* next;}tnode;

void isiData(tnode **h, tnode **t){ tnode *c; int bil; *h=NULL; printf("\nKetik Sejumlah bilangan: \n"); while (scanf("%d",&bil) == 1) { c=(tnode*)malloc(sizeof(tnode)); c->data=bil; c->next=NULL; if (*h==NULL) *h = c; else (*t)->next=c; *t=c; } (*t)->next=*h;}void tampil_data(tnode *h){ int n=6; printf("Ingin tampilkan berapa data? "); scanf("%d", &n); while(n) { printf("%d ", h->data); h=h->next; n--; }}oid hapus(tnode **h, tnode **t){ struct tnode *c; while (*h != *t) { c=*h; *h=(*h)->next; free(c); } free(*t); *h=*t=NULL;}

int main(){ tnode *head, *tail; isiData(&head, &tail); tampil_data(head); hapus(&head,&tail); return 0;}Contoh Eksekusi Program

Algoritma Dan Stuktur Data - Resume Linked List40