0. Double Linked List ARNA FARIZA YULIANA SETIOWATI Capaian Pembelajaran 1. Mahasiswa mengerti konsep double linked list dan operasi pada single linked list. 2. Mahasiswa dapat mengimplementasikan double linked list dalam bahasa pemrograman. 1
Materi Pengertian Double Linked List OperasipadaDouble Linked List : Mencetaksimpul MenyisipkanSimpul MenghapusSimpul Implementasi Queue dengan Double Linked List Double Linked List Elemen-elemen dihubungkan dengan dua pointer dalam satu elemen. List bisamelintasbaikkedepanmaupunkebelakang. Masing-masing elemen terdiri dari tiga bagian bagian data/informasi pointer next yang menunjuk ke elemen berikutnya pointer prev yang menunjuk ke elemen sebelumnya Untuk menunjukkan dari double linked list, pointer prev dari elemen pertamamenunjuknull. Untuk menunjukkan dari double linked list tersebut, pointer next dari elemen terakhir menunjuk NULL. 4 2
Double Linked List pointer prev a b c c pointer next data/informasi Deklarasi Simpul pada Double Linked List typedef struct simpul DNode; struct simpul { int data; DNode *next; DNode *prev; };
Variabel, dan adalah variabel pointer yang menunjuk ke awal list adalah variabel pointer yang menunjuk ke akhir list adalah variabel pointer yang menunjuk ke simpul DNode * = NULL; DNode * =NULL; DNode *; 7 Alokasi Simpul Baru =(DNode *) malloc (sizeof(dnode)); ->data=x; ->next=null; ->prev=null; Jika x=10, maka 10 8 4
Membentuk Simpul Awal dan menunjukawallist, karenahanyaadasatusimpul maka dan menunjuk. Head = = ; 10 9 Operasi pada Double Linked List 1. Mencetak Simpul 2. Menyisipkan Simpul. Menghapus Simpul
Operasi Mencetak Simpul Operasi mencetak simpul dapat dilakukan dengan cara o Mencetakdari ke 8 1 12 10 o Mencetakdari ke 10 12 1 8 8 1 12 10 Mencetak dari ke DNode *p = ; while (p!= NULL){ printf( %d, p->data); p = p->next; } printf( \n );
Mencetak dari ke DNode *p = ; while (p!= NULL){ printf( %d, p->data); p = p->prev; } printf( \n ); Operasi Menyisipkan Simpul Operasi menyisipkan simpul terdiri dari: o Sisipawallist o Sisipakhirlist o Sisip sebelum simpul tertentu o Sisip setelah simpul tertentu 14 7
Sisip Awal List Buat simpul : Linked list: 8 10 1 Sisip Awal List 1. ->next menunjuk simpul 8 10 1 8
Sisip Awal List 2. ->prev menunjuk 8 10 17 Sisip Awal List. menunjuk 8 10 18 9
Sisip Awal List ->next = ; ->prev = ; = ; Sisip Akhir List Buat simpul : Linked list: 8 10 20 10
Sisip Akhir List 1. ->prev menunjuk simpul 8 10 21 Sisip Akhir List 2. ->next menunjuk simpul 8 10 22 11
Sisip Akhir List. menunjuk 8 10 2 Sisip Akhir List ->prev = ; ->next = ; = ; 12
Sisip Setelah Simpul x (misal x=10) Buat simpul : Linked list: 8 10 2 Sisip Setelah Simpul x (misal x=10) 1. after diarahkan ke posisi simpul 10, after dapat dimulai dari atau 8 10 after 2 1
Sisip Setelah Simpul x (misal x=10) 2. ->prev menunjuk after 8 10 after 27 Sisip Setelah Simpul x (misal x=10). ->next menunjuk after->next 8 10 after 28 14
Sisip Setelah Simpul x (misal x=10) 4. after->next->prev menunjuk 8 10 after 29 Sisip Setelah Simpul x (misal x=10). after->next menunjuk 8 10 after 0 1
Sisip Setelah Simpul Tertentu DNode *after = ; while (after->data!= x) after = after->next; ->prev = after; ->next = after->next; after->next->prev = ; after->next = ; Sisip Setelah Simpul Tertentu DNode *after = ; while (after->data!= x) after = after->prev; ->prev = after; ->next = after->next; after->next->prev = ; after->next = ; 1
Sisip Sebelum Simpul x (misal x=) Buat simpul : Linked List: 8 10 Sisip Sebelum Simpul x (misal x=) 1. Before diarahkan menunjuk ke posisi simpul, before dapat dimulai dari atau 8 10 before 4 17
Sisip Sebelum Simpul x (misal x=) 2. ->prev menunjuk before->prev 8 10 before Sisip Sebelum Simpul x (misal x=). ->next menunjuk before 8 10 before 18
Sisip Sebelum Simpul x (misal x=) 4. before->prev->next menunjuk 8 10 before 7 Sisip Sebelum Simpul x (misal x=). before->prev menunjuk 8 10 before 8 19
Sisip Sebelum Simpul Tertentu DNode *before = ; while (before->data!= x) before = before->next; ->prev = before->prev; ->next = before; before->prev->next = ; before->prev = ; Sisip Sebelum Simpul Tertentu DNode *before = ; while (before->data!= x) before = before->prev; ->prev = before->prev; ->next = before; before->prev->next = ; before->prev = ; 20
Operasi Menghapus Simpul Operasi menghapus simpul terdiri dari: o Hapus simpul awal o Hapus simpul akhir o Hapus simpul tertentu 41 Fungsi free_dnode Sebelum menghapus simpul, buat fungsi untuk membebaskan alokasi memori dengan fungsi free void free_dnode(dnode *p) { free(p); p=null; } 42 21
Hapus Simpul Awal Linked List 8 10 4 Hapus Simpul Awal 1. hapus menunjuk 8 10 hapus 44 22
Hapus Simpul Awal 2. ->next-> prev menunjuk NULL 8 10 hapus 4 Hapus Simpul Awal. menunjuk hapus->next 8 10 hapus 4 2
Hapus Simpul Awal 4. free_dnode(hapus) 8 10 hapus 47 Hapus Simpul Awal Dnode hapus = ; ->next->prev = NULL; = hapus->next; free_dnode(hapus); 24
Hapus Simpul Akhir Linked List 10 49 Hapus Simpul Akhir 1. hapus menunjuk 10 hapus 0 2
Hapus Simpul Akhir 2. ->prev->next menunjuk 10 hapus 1 Hapus Simpul Akhir. menunjuk hapus->prev 10 hapus 2 2
Hapus Simpul Akhir 4. free_dnode(hapus) 10 hapus Hapus Simpul Akhir Dnode hapus = ; ->prev->next = NULL; = hapus->prev; free_dnode(hapus); 27
Hapus Simpul Tertentu (misal x=) Linked List 10 Hapus Simpul Tertentu (misal x=) 1. hapus menunjuk simpul x= 10 hapus 28
Hapus Simpul Tertentu (misal x=) 2. hapus->prev->next menunjuk hapus->next 10 hapus 7 Hapus Simpul Tertentu (misal x=). hapus->next->prev menunjuk hapus->prev 10 hapus 8 29
Hapus Simpul Tertentu (misal x=) 4. free_dnode(hapus) 10 hapus 9 Hapus Simpul Tertentu Dnode hapus = ; while (hapus->data!= x) hapus = hapus->next; hapus->prev->next = hapus->next; hapus->next->prev = hapus->prev; free_dnode(hapus); 0
Hapus Simpul Tertentu Dnode hapus = ; while (hapus->data!= x) hapus = hapus->prev; hapus->prev->next = hapus->next; hapus->next->prev = hapus->prev; free_dnode(hapus); ImplementasiQueue dengandouble Linked List Queue adalahpenyimpanandata dengankonsepfirst In First Out (FIFO) Terdapat dua penunjuk yaitu front dan rear Fungsi Enqueue menambah simpul pada posisi rear Fungsi Dequeue menghapus simpul pada posisi front 1
DeklarasiQueue dengandouble Linked List typedef struct simpul DNode; typedef int itemtype; struct simpul { itemtype item; DNode *next; DNode *prev; }; typedef struct { DNode *front; DNode *rear; int count; } Queue; Fungsi pada Queue Inisialisasi front dan rear menunjuk NULL, count=0 Kosong jikarear= NULL ataufront= NULL Enqueue buat simpul, sisip akhir list (posisi rear) Dequeue hapusawallist (posisifront) 2
Fungsi Inisialisasi void inisialisasi (Queue *q) { q->front = NULL; q->rear = NULL; q->count = 0; } Fungsi Kosong int Kosong (Queue *q) { return(q->rear==null) }
Fungsi Enqueue void Enqueue (Queue *q, itemtype x) { DNode * = (DNode *) malloc (sizeof(dnode)); if(==null) { printf( Alokasi gagal\n ); exit(1); } else { ->item = x; ->next = NULL; ->prev = q->rear; q->rear->next = ; q->rear = ; q->count++; } } Fungsi Dequeue itemtype Dequeue (Queue *q) { DNode *hapus; itemtype temp; if(kosong(q)) { printf( Queue kosong\n ); return ; } else { temp = q->front->item; hapus = q->front; q->front = hapus->next; q->front->prev = NULL; free(hapus); q->count-- return temp; } } 4
Rangkuman Simpul pada double linked list terdiri dari bagian data, pointer next dan pointer prev Operasi pada double linked list terdiri dari operasi cetak, sisip dan hapus Operasicetakdapatdilakukandari ke ataudari ke Operasi sisip terdiri dari sisip awal list, sisip akhir list, sisip setelah simpul tertentu, sisip sebelum simpul tertentu Operasi hapus terdiri dari hapus awal list, hapus akhir list dan hapus simpul tertentu Implementasi Queue dengan double linked list, pada operasi Enqueue dengan sisip akhir list dan pada operasi Dequeue dengan hapus awal list Latihan 1. Buatlah double linked list dengan data bertipe integer yang dapat melakukan operasi sisip secara terurut dan hapus simpul tertentu dengan ketentuan sebagai berikut: a) Operasisisip, buatsebuahsimpul, Jikadata simpul< data pada, makagunakansisip awallist Jika pencarian data simpul mencapai NULL (data belum ada), sisip akhir list Jikadata simpul= data padasimpultertentu makaberikanpesansimpulsudah ada(duplikat) Lainnya sisip sebelum simpul tertentu b) Operasi hapus, Jika posisi simpul yang dihapus pada, gunakan hapus awal list Jika posisi simpul yang dihapus pada, gunakan hapus akhir list Lainnya hapus simpul tengah
Latihan 2. ImplementasikanQueue dengandouble linked list, buatlahmenu Enqueue, Dequeue dan Tampil. Buatlah double linked list dengan simpul berupa data mahasiswa yang terdiri dari NRP, Nama dan Kelas. Buatlah operasi Sisip secaraterurut, Hapusdata mahasiswatertentudanupdate data (nama dan kelas saja) Project Implementasikan sebuah multiple list sistem akademik. Data terdiri dari mahasiswa dan nilai mahasiswa. Data mahasiswa terdiri dari NRP, Nama dan Prodi. Sedangkan data nilai terdiridarikodemk, NamaMK dannilai. Buatlahhubunganantaramahasiswadannilai, dimana satu mahasiswa mengambil beberapa mata kuliah. Fungsi yang dibuat terdiri dari: 1. Sisip mahasiswa secara terurut 2. Hapus mahasiswa. Update mahasiswa(nama dan Prodi) 4. Sisip MK per mahasiswa. Hapus MK per mahasiswa. Tampilkan data mahasiswa dan nilai rata-rata Deklarasi mahasiswa dan mata kuliah sebagai berikut:
typedef struct simpulmhs Mahasiswa; typedef struct simpulmk MataKuliah; struct simpulmhs { int NRP; char Nama[0]; char Prodi[1]; Mahasiswa *nextmhs; Mahasiswa *prevmhs; MataKuliah *next; }; struct simpulmk { char KodeMK[]; char NamaMK[1]; int Nilai; MataKuliah *nextmk; }; 7