SlideShare a Scribd company logo
MAKALAH FUNGSI DAN STRUKTUR DATA
BAHASA C
OLEH:
DIKI CANDRA
NIM 2022903430010
D4 TEKNOLOGI REKAYASA KOMPUTER JARINGAN
POLITEKNIK NEGERI LHOKSEUMAWE
2022/2023
BAB I
PENDAHULUAN
1.1 LATAR BELAKANG
Linked List adalah suatu struktur data linier. linked list dibentuk secara dinamik. Pada
saat awal program dijalankan elemen linked list belum data. Elemen linked list (disebut
node) dibentuk sambil jalan sesuai instruksi. sebuah node linked list diakses dengan
menggunakan pointer yang mengacu ke node tersebut. Banyak yang mengira Double
Linked List Circulate adalah Double Linked List Circulate pointer next dan prev nya
menunjuk ke dirinya sendiri secara circular. Memang benar demikian tapi Double Linked
List Circulate tidak hanya itu saja
B. Rumusan Masalah
Pada makalah ini saya akan mejelaskan tentang double linked list
C. Tujuan
 Untuk memenuhi tugas dari dosen pada mata kuliah struktur data.
 Agar pembaca mengerti dan apa yang dimaksud dengan struktur array, serta
paham dalam penggunaan, penerapan dan pengaplikasiannya.
D. Manfaat
Manfaat yang diperoleh dari makalah tersebut adalah sebagai berikut:
1. Pembaca
 Menjadikan pembaca makalah semata-mata agar pembaca memahami dasar-
dasar pemrograman.
 Untuk memotivasi pembaca untuk membuat makalah yang lebih baik dari Ini.
2. Pengarang
 C. Untuk memberikan semangat pada mata kuliah yang sedang diambil saat
ini.
 D. Sebagai titik awal untuk melakukan praktikum agar praktikum selanjutnya
dapat dilakukan dengan lebih baik lagi.
BAB II
PEMBAHASAN
2.1 Pengenalan
Pengertian Double Linked List adalah sekumpulan node data yang terurut linear
atau sekuensial dengan dua buah pointer yaitu prev dan next. Double Linked List adalah
linked list dengan node yang memiliki data dan dua buah reference link (biasanya disebut
next dan prev) yang menunjuk ke node sebelum dan node sesudahnya, Pada
implementasinya, terdapat dua variasi double linked list yaitu circular dan non-circular
layaknya pada single linked list.
Operasi pada Double Linked List
Double linked list memiliki beberapa operasi dasar pada list, misalkan penyisipan,
penghapusan, menampilkan maju, dan menampilkan mundur.
Insert First
Penyisipan di awal list, sehingga pointer head juga akan berpindah ke elemen baru.
Insert Last
Penyisipan di akhir list, sehingga pointer tail juga akan berpindah ke elemen baru.
Insert After / Before
Penyisipan after/before kurang lebih sama satu sama lain. Pada kasus diatas berlaku juga
insert before 3.
Delete First
Penghapusan di awal list, pointer head akan berpindah ke node selanjutnya,sementara
node awal akan di dealokasi.
Delete Last
Penghapusan di akhir list, pointer tail akan berpindah ke node sebelumnya,sementara
node akhir akan di dealokasi.
Delete Node
Penghapusan node dengan data tertentu, pada kasus diatas yaitu delete node 2.
2.2 Penjelasan
Doubly Linked List
Dalam pembahasan artikel sebelumnya telah diperkenalkan Single Linked List, yakni
linked list dengan sebuah pointer penghubung. Dalam artikel ini, dibahas pula varian
linked list dengan 2 pointer penunjuk, yakni Doubly linked list yang memilki pointer
penunjuk 2 arah, yakni ke arah node sebelum (previos/prev) dan node sesudah (next).
Representasi sebuah doubly linked list dapat dilihat pada gambar berikut ini:
Di dalam sebuah linked list, ada 2 pointer yang menjadi penunjuk utama, yakni pointer
HEAD yang menunjuk pada node pertama di dalam linked list itu sendiri dan pointer
TAIL yang menunjuk pada node paling akhir di dalam linked list. Sebuah linked list
dikatakan kosong apabila isi pointer head adalah NULL. Selain itu, nilai pointer prev dari
HEAD selalu NULL, karena merupakan data pertama. Begitu pula dengan pointer next
dari TAIL yang selalu bernilai NULL sebagai penanda data terakhir.
Beberapa operasi yang biasanya ada di dalam sebuah doubly linked list pada dasarnya
sama dengan yang ada di dalam single linked list, yakni:
Double Linked List adalah suatu linked list yang mempunyai 2 penunjuk yaitu penunjuk
ke simpul sebelumnya dan ke simpul berikutnya. Perhatikan gambar di bawah ini :
Deklarasi secara umum double linked list :
Contoh :
Jadi satu simpul di double linked list adalah sebagai berikut :
Dari gambar di atas, untuk setiap simpul terdiri dari 3 buah field yaitu medan sambungan
kiri (prev), medan data (info), dan medan sambungan kanan (next). Beberapa operasi
yang dapat dilakukan dalam double linked list adalah :
1. Penciptaan
Penciptaan adalah memberikan nilai nil terhadap variabel pointer awal dan variabel
pointer akhir.
2. Penyisipan
2.a Penyisipan di depan/awal
Operasi ini berguna untuk menambahkan satu simpul baru di posisi pertama. Langkah
pertama untuk penambahan data adalah pembuatan simpul baru dan mengisinya dengan
data pada field info-nya. Pointer yang menunjuk ke simpul tersebut dipanggil dengan
nama baru. Kondisi setelah ada pembuatan simpul baru tersebut adalah :
Ada 2 kondisi yang harus diperhatikan dalam penambahan data di awal yaitu :
a. Ketika linked list masih kosong
Kalau kondisi linked list masih kosong, maka simpul baru akan menjadi simpul awal dan
sekaligus simpul akhir dari double linked list. Perhatikan gambar di bawah ini :
 Kondisi sebelum disisipkan
 Kondisi setelah operasi penyisipan
Operasi penyisipan pertama kali ketika linked list masih kosong adalah dengan
mengisikan alamat pointer baru ke pointer awal dan pointer akhir. Dan memberikan nilai
nil pada medan sambungan kiri (prev) dan medan sambungan kanan(next). Lihat gambar
di bawah ini:
b. Ketika linked list tidak kosong
Misalnya mula-mula keadaan list sebagai berikut:
Proses penyisipan simpul di awal linked list adalah :
 Tempatkan sebuah pointer baru di alamat yang bertipe record untuk double linked list,
kemudian medan sambungan kirinya diberi harga nil.
 Hubungkan medan sambungan kanan dari simpul yang ditunjuk oleh pointer baru ke
simpul yang ditunjuk oleh pointer awal.
 Hubungkan medan sambungan kiri (prev) dari simpul yang ditunjuk oleh pointer awal
ke simpul yang baru.
 Pindahkan pointer awal ke simpul yang baru
Maka bentuk linked list setelah terjadi penyisipan di awal adalah:
2.b. Penyisipan di tengah
Operasi penyisipan data di tengah linked list adalah suatu operasi menambah data
di posisi tertentu di dalam linked list. Karena double linked list memiliki dua pointer
sambungan, maka penyisipan bisa dilakukan sebelum data tertentu atau sesudah data
tertentu, berbeda dengan single linked list yang hanya memiliki satu pointer sambungan
yaitu sambungan kanan(next). Untuk proses tersebut ada 2 hal yang harus diperhatikan
yaitu :
 Kondisi linked list masih kosong prosesnya sama seperti penyisipan di depan/awal.
 Kondisi linked list sudah mempunyai data (tidak kosong) Mula-mula keadaan linked
list sebagai berikut:
Misalnya akan menyisipkan data 6 sebelum data 9 (untuk menyisipkan data setelahnya
lihat kembali pada single linked list) Langkah untuk penyisipan data ketika list tidak
kosong adalah:
 Cari data yang akan disisipkan setelahnya pada double linked (data 9), dimana simpul
yang ada data 9 ditunjuk oleh pointer bantuan (bantu).
Pointer bantu bisa berada di simpul yang ada data 9, karena melalui proses pencarian
(searching). Metode searching yang digunakan bisa sequential search dengan boolean
atau sequential search tanpa sentinel.
 Jika data yang dicari ditemukan, maka akan terjadi penyisipan dengan langkah sebagai
berikut:
- Tempatkan pointer baru pada sebuah simpul baru berupa double linked yang akan
disisipkan.
- Sisipkan simpul yang baru atau data yang baru disebelum simpul yang dicari tadi,
dengan langkah: a. Medan sambungan kanan (next) dan medan sambungan kiri (prev)
dari simpul yang baru dihubungkan ke simpul yang ada data 9 dengan simpul yang ada
data 7.
b. Hubungkan medan sambungan kanan (next) dari simpul tetangga kirinya bantu ke
simpul yang baru.
c. Terakhir hubungkan medan sambungan kiri (prev) dari simpul yang ditunjuk oleh bantu
ke simpul yang baru.
Maka bentuk double linked list setelah mengalami penyisipan di tengah seperti gambar
berikut:
2.c. Penyisipan di belakang/akhir
Operasi ini berguna untuk menambahkan elemen baru di posisi akhir. Langkah
pertama untuk penambahan data adalah pembuatan elemen baru dan pengisian nilai
infonya. Pointer yang menunjuk ke data tersebut dipanggil dengan nama baru. Kondisi di
setelah ada pembuatan elemen baru tersebut adalah :
Ada 2 kondisi yang harus diperhatikan dalam penambahan data di akhir yaitu :
 Kondisi linked list masih kosong prosesnya sama seperti penyisipan di depan/awal.
 Ketika linked list sudah mempunyai data Mula-mula list sebagai berikut:
Proses penambahan data di akhir linked list adalah :
 Tempatkan pointer baru pada sebuah simpul double linked list yang baru, karena
simpul yang baru ini nantinya menjadi simpul yang terakhir, maka medan sambungan
dari simpul yang baru diberi harga nil.
 Hubungkan medan sambungan kanan (next) dari simpul yang ditunjuk oleh pointer
akhir ke simpul yang baru.
 Hubungkan medan sambungan kiri(prev) dari simpul yang baru ke simpul yang
ditunjuk oleh pointer akhir.
 Pindahkan pointer akhir ke simpul yang baru
3. Penghapusan
a. Penghapusan di awal
Operasi ini berguna untuk menghapus data pada posisi pertama. Ada 3 keadaan yang
mungkin terjadi ketika akan melakukan proses hapus yaitu :
 Kondisi linked list masih kosong Jika kondisi ini terjadi, maka proses penghapusan
data tidak bisa dilakukan karena linked list masih kosong.
 Kondisi linked list hanya memiliki 1 data Langkah yang perlu dilakukan ketika ingin
melakukan proses penghapusan linked list yang memiliki hanya 1 data adalah dengan
langsung menghapus data dari memori dan kemudian pointer awal dan akhir diberi harga
nil. Untuk lebih jelas perhatikan urutan penghapusannya di bawah ini :
- Kondisi list sebelum dihapus
- Kondisi list setelah ada proses penghapusan
Kemudian pointer awal dan akhir diisi dengan nil.
 Kondisi linked list memiliki lebih dari satu data atau satu simpul Untuk operasi
penghapusan data di posisi pertama pada double linked list yang mempunyai data lebih
dari satu buah adalah :
 Tempatkan pointer bantuan (phapus) ke simpul (alamat) yang ditunjuk oleh pointer
awal.
 Pindahkan pointer awal ke simpul tetangga kanannya (next)
 Sambungan kiri (prev) dari simpul yang ditunjuk oleh pointer awal diberi harga nil
 Selamatkan data yang akan dihapus ke dalam variabel elemen, kemudian hapus simpul
yang ditunjuk oleh pointer phapus
 Setelah simpul dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini:
b. Penghapusan di tengah
Untuk melakukan proses penghapusan di tengah linked list, ada 3 kondisi yang perlu
diperhatikan yaitu :
a. Kondisi ketika linked list masih kosong atau ketika posisi hapus lebih kecil dari 1.
Ketika kondisi ini terjadi, maka proses penghapusan tidak bisa dilakukan karena data
masih kosong atau karena posisi hapus diluar jangkauan linked list (posisi kurang dari 1).
b. Kondisi ketika list memiliki satu simpul atau posisi hapus sama dengan satu (hapus
data pertama)
Ketika kondisi ini terjadi, maka proses yang dilakukan adalah proses penghapusan di
posisi awal (hapus_awal).
c. Kondisi ketika list lebih dari satu simpul atau posisi hapus lebih besar dari satu.
Misalkan akan menghapus simpul yang ke-3:
Hubungan sambungan kanan (next) dari simpul tetangga kirinya phapus dengan simpul
tetangga kanannya phapus.
Kemudian hubungkan sambungan kiri dari tetangga kanannya phapus ke simpul tetangga
kirinya phapus.
Simpan data yang akan dihapus ke dalam sebuah variabel elemen, kemudian simpul yang
ditunjuk oleh phapus dapat dihapus
Setelah terjadi penghapusan di tengah, maka linked list seperti gambar berikut:
c. Penghapusan di akhir
Operasi ini berguna untuk menghapus data pada posisi terakhir. Ada 3 keadaan yang
mungkin terjadi ketika akan melakukan proses hapus yaitu :
a. Kondisi linked list masih kosong
Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked
list masih kosong.
b. Kondisi linked list hanya memiliki satu data atau satu simpul
Penghapusan di akhir prosesnya sama seperti penghapusan di depan
c. Kondisi linked list memiliki lebih dari satu data atau lebih dari 1 simpul
Untuk operasi penghapusan data di posisi terakhir pada double linked list yang
mempunyai data lebih dari 1 buah adalah :
 Tempatkan pointer bantuan (phapus) di simpul yang terakhir
 Pindahkan pointer akhir ke simpul sebelumnya
 Field kanan dari pointer akhir diberi harga nil
 Simpan data yang akan dihapus ke variabel elemen, kemudian hapus simpul yang
ditunjuk leh pointer phapus.
 Setelah simpul dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.
4. Penelusuran/traversal
Prosesnya secara umum sama seperti penelusuran pada single liked list.
5. Pencarian /Seaching
Pencarian dilakukan dengan memeriksa data yang ada dalam linked list dengan data yang
dicari. Pencarian dilakukan dari data pertama sampai data ditemukan atau pointer pencari
(bantu) telah mencapai akhir dari list yang menandakan bahwa data yang dicari tidak
ditemukan.
Agar lebih jelas perhatikan ilustrasi di bawah ini, dengan contoh data adalah :
Ada 2 kondisi yang dihasilkan oleh proses pencarian yaitu
a. Pencarian dimana data yang dicari dapat ditemukan
Kasus : data yang akan dicari adalah data 9.
- Tempatkan pointer bantuan (bantu) di simpul pertama dan beri harga pada variabel
posisi dengan angka 1
- Jika field info yang ditunjuk oleh pointer bantu tidak sama dengan data yang dicari,
maka pointer bantu pindah ke simpul berikutnya dan variabel posisi harganya bertambah
1, ulang terus menerus sampai data yang dicari ditemukan atau sampai seluruh list
ditelusuri.
- Jika ditemukan, maka akan ada pernyataan “data yang dicari ada pada simpul ke sekian”,
tetapi jika data yang dicari tidak ditemukan, maka akan ada pernyataan “data yang dicari
tidak ditemukan/tidak ada”.
6. Pengurutan/sorting
Proses penyusunan data acak menjadi tersusun baik secara ascending ataupun secara
descending pada dasarnya sama seperti pada single linked list, hanya saja pada double
linked list dapat dilakukan dari kiri ke kanan atau dari kanan ke kiri dalam hal menyusuri
list.
Misalkan akan mengurutkan data acak secara ascending dengan menggunakan metode
selection sort yang jenisnya minimum sort:
Proses pengurutannya adalah :
Bandingkan data di simpul yg ditunjuk oleh pointer p2 dengan data di simpul yang
ditunjuk oleh pointer min, jika lebih kecil pindahkan pointer min ke simpul yang ditunjuk
oleh pointer p2, kemudian pointer p2 pindah ke simpul tetangga kanannya, ulangi sampai
pointer p2 bernilai nil (asumsi data terkecil sudah ditemukan dan simpulnya ditunjuk oleh
pointer min).
Setelah itu tukarkan data terkecil tadi dengan data di simpul yang ditunjuk oleh pointer
p1.
Tahap 1:
Tahap 2:
Tahap 3:
Data acak akhirnya tersusun secara ascending sebagai berikut:
7. Penghancuran/destroy
Proses penghancuran bisa dengan cara memanggil modul/subrutin penghapusan di awal
atau penghapusan di akhir secara terus menerus sampai list kosong, atau dengan proses
penghancuran seperti pada single linked list.
2.3 Contoh Program Double Linked List
Contoh 1:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
struct node {
int data;
int key;
struct node *next;
struct node *prev;
};
//this link always point to first Link
struct node *head = NULL;
//this link always point to last Link
struct node *last = NULL;
struct node *current = NULL;
//is list empty
bool isEmpty() {
return head == NULL;
}
int length() {
int length = 0;
struct node *current;
for(current = head; current != NULL; current = current->next){
length++;
}
return length;
}
//display the list in from first to last
void displayForward() {
//start from the beginning
struct node *ptr = head;
//navigate till the end of the list
printf("n[ ");
while(ptr != NULL) {
printf("(%d,%d) ",ptr->key,ptr->data);
ptr = ptr->next;
}
printf(" ]");
}
//display the list from last to first
void displayBackward() {
//start from the last
struct node *ptr = last;
//navigate till the start of the list
printf("n[ ");
while(ptr != NULL) {
//print data
printf("(%d,%d) ",ptr->key,ptr->data);
//move to next item
ptr = ptr ->prev;
}
}
//insert link at the first location
void insertFirst(int key, int data) {
//create a link
struct node *link = (struct node*) malloc(sizeof(struct node));
link->key = key;
link->data = data;
if(isEmpty()) {
//make it the last link
last = link;
} else {
//update first prev link
head->prev = link;
}
//point it to old first link
link->next = head;
//point first to new first link
head = link;
}
//insert link at the last location
void insertLast(int key, int data) {
//create a link
struct node *link = (struct node*) malloc(sizeof(struct node));
link->key = key;
link->data = data;
if(isEmpty()) {
//make it the last link
last = link;
} else {
//make link a new last link
last->next = link;
//mark old last node as prev of new link
link->prev = last;
}
//point last to new last node
last = link;
}
//delete first item
struct node* deleteFirst() {
//save reference to first link
struct node *tempLink = head;
//if only one link
if(head->next == NULL){
last = NULL;
} else {
head->next->prev = NULL;
}
head = head->next;
//return the deleted link
return tempLink;
}
//delete link at the last location
struct node* deleteLast() {
//save reference to last link
struct node *tempLink = last;
//if only one link
if(head->next == NULL) {
head = NULL;
} else {
last->prev->next = NULL;
}
last = last->prev;
//return the deleted link
return tempLink;
}
//delete a link with given key
struct node* delete(int key) {
//start from the first link
struct node* current = head;
struct node* previous = NULL;
//if list is empty
if(head == NULL) {
return NULL;
}
//navigate through list
while(current->key != key) {
//if it is last node
if(current->next == NULL) {
return NULL;
} else {
//store reference to current link
previous = current;
//move to next link
current = current->next;
}
}
//found a match, update the link
if(current == head) {
//change first to point to next link
head = head->next;
} else {
//bypass the current link
current->prev->next = current->next;
}
if(current == last) {
//change last to point to prev link
last = current->prev;
} else {
current->next->prev = current->prev;
}
return current;
}
bool insertAfter(int key, int newKey, int data) {
//start from the first link
struct node *current = head;
//if list is empty
if(head == NULL) {
return false;
}
//navigate through list
while(current->key != key) {
//if it is last node
if(current->next == NULL) {
return false;
} else {
//move to next link
current = current->next;
}
}
//create a link
struct node *newLink = (struct node*) malloc(sizeof(struct node));
newLink->key = newKey;
newLink->data = data;
if(current == last) {
newLink->next = NULL;
last = newLink;
} else {
newLink->next = current->next;
current->next->prev = newLink;
}
newLink->prev = current;
current->next = newLink;
return true;
}
void main() {
insertFirst(1,10);
insertFirst(2,20);
insertFirst(3,30);
insertFirst(4,1);
insertFirst(5,40);
insertFirst(6,56);
printf("nList (First to Last): ");
displayForward();
printf("n");
printf("nList (Last to first): ");
displayBackward();
printf("nList , after deleting first record: ");
deleteFirst();
displayForward();
printf("nList , after deleting last record: ");
deleteLast();
displayForward();
printf("nList , insert after key(4) : ");
insertAfter(4,7, 13);
displayForward();
printf("nList , after delete key(4) : ");
delete(4);
displayForward();
}
Output :
List (First to Last):
[ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ]
List (Last to first):
[ (1,10) (2,20) (3,30) (4,1) (5,40) (6,56) ]
List , after deleting first record:
[ (5,40) (4,1) (3,30) (2,20) (1,10) ]
List , after deleting last record:
[ (5,40) (4,1) (3,30) (2,20) ]
List , insert after key(4) :
[ (5,40) (4,1) (7,13) (3,30) (2,20) ]
List , after delete key(4) :
[ (5,40) (4,13) (3,30) (2,20) ]
Contoh 2:
#include<stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
void insertStart(struct Node** head, int data){
// creating memory for newNode
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
// assigning newNode's next as the current head
// Assign data & and make newNode's prev as NULL
newNode->data = data;
newNode->next = *head;
newNode->prev = NULL;
// if list already had item(s)
// We need to make current head previous node as this new node
if(*head != NULL)
(*head)->prev = newNode;
// change head to this newNode
*head = newNode;
}
void display(struct Node* node)
{
struct Node* end;
printf("nIn Forward Directionn");
while (node != NULL) {
printf(" %d ", node->data);
end = node;
node = node->next;
}
printf("nIn Backward direction n");
while (end != NULL) {
printf(" %d ", end->data);
end = end->prev;
}
}
int main()
{
struct Node* head = NULL;
// Need '&' i.e. address as we need to change head
insertStart(&head,1);
insertStart(&head,2);
insertStart(&head,3);
// no need for '&' as head need not be changed
// only doing traversal
display(head);
return 0;
}
Output :
In Forward Direction
3 2 1
In Backward direction
1 2 3
Contoh 3:
Input :
#include<stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
void insertStart(struct Node** head, int data){
// creating memory for newNode
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
// assigning newNode's next as the current head
// Assign data & and make newNode's prev as NULL
newNode->data = data;
newNode->next = *head;
newNode->prev = NULL;
// if list already had item(s)
// We need to make current head previous node as this new node
if(*head != NULL)
(*head)->prev = newNode;
// change head to this newNode
*head = newNode;
}
void insertLast(struct Node** head, int data){
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
//need this if there is no node present in linked list at all
if(*head==NULL){
*head = newNode;
newNode->prev = NULL;
return;
}
struct Node* temp = *head;
// traverse till the last node
while(temp->next!=NULL)
temp = temp->next;
// assign last node's next to this new Node
temp->next = newNode;
// assign this new Node's previous to last node(temp)
newNode->prev = temp;
}
void display(struct Node* node)
{
struct Node* end;
printf("nIn Forward Directionn");
while (node != NULL) {
printf(" %d ", node->data);
end = node;
node = node->next;
}
printf("nIn Backward direction n");
while (end != NULL) {
printf(" %d ", end->data);
end = end->prev;
}
}
int main()
{
struct Node* head = NULL;
// Need '&' i.e. address as we need to change head
insertStart(&head,1);
insertStart(&head,2);
insertStart(&head,3);
insertLast(&head,10);
insertLast(&head,20);
// no need for '&' as head need not be changed
// only doing traversal
display(head);
return 0;
}
Output:
In Forward Direction
3 2 1 10 20
In Backward direction
20 10 1 2 3
Contoh 4:
Input:
#include<stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
void insertStart(struct Node** head, int data){
// creating memory for newNode
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
// assigning newNode's next as the current head
// Assign data & and make newNode's prev as NULL
newNode->data = data;
newNode->next = *head;
newNode->prev = NULL;
// if list already had item(s)
// We need to make current head previous node as this new node
if(*head != NULL)
(*head)->prev = newNode;
// change head to this newNode
*head = newNode;
}
void insertLast(struct Node** head, int data){
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
//need this if there is no node present in linked list at all
if(*head==NULL){
*head = newNode;
newNode->prev = NULL;
return;
}
struct Node* temp = *head;
// traverse till the last node
while(temp->next!=NULL)
temp = temp->next;
// assign last node's next to this new Node
temp->next = newNode;
// assign this new Node's previous to last node(temp)
newNode->prev = temp;
}
int calcSize(struct Node* node){
int size=0;
while(node!=NULL){
node = node->next;
size++;
}
return size;
}
void insertPosition(int pos, int data, struct Node** head){
int size = calcSize(*head);
//If pos is 0 then should use insertStart method
//If pos is less than 0 then can't enter at all
//If pos is greater than size then bufferbound issue
if(pos<1 || size < pos)
{
printf("Can't insert, %d is not a valid positionn",pos);
}
else{
struct Node* temp = *head;
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
// traverse till pos
while(--pos)
{
temp=temp->next;
}
// assign prev/next of this new node
newNode->next = temp->next;
newNode->prev = temp;
// change next of temp node
temp->next = newNode;
}
}
void display(struct Node* node)
{
struct Node* end;
printf("nIn Forward Directionn");
while (node != NULL) {
printf("%d ", node->data);
end = node;
node = node->next;
}
printf("nnIn Backward direction n");
while (end != NULL) {
printf("%d ", end->data);
end = end->prev;
}
}
int main()
{
struct Node* head = NULL;
// Need '&' i.e. address as we need to change head
insertStart(&head,1);
insertStart(&head,2);
insertStart(&head,3);
insertLast(&head,10);
insertLast(&head,20);
insertPosition(2, 100, &head);
// no need for '&' as head need not be changed
// only doing traversal
display(head);
return 0;
}
Output:
In Forward Direction
3 2 100 1 10 20
In Backward direction
20 10 1 2 3
BAB III
PENUTUP
Demikianlah Makalah ini saya buat dengan sebaik-baiknya. Terima kasih buat Orang
tua yang selalu mendukung saya baik materil maupun moril,dan terima kasih untuk abang
dan kakak assisten laboratorium paket applikasi, juga terima kasih buat kawan-kawan
yang telah membantu dalam mengerjakan makalah ini.semoga makalah ini dapat berguna
buat kita semua dan buat angkatan ke depannya kelak. lebih dan kurangnya saya mohon
maaf, kepada abang dan kakak saya ucapkan terima kasih.
Wassalammu’alaikum Wr.Wb.
DAFTAR PUSTAKA
 https://repository.unikom.ac.id/35514/1/Bab%20VI%20-
%20Double%20Linked%20List.pdf
 https://socs.binus.ac.id/2017/03/15/doubly-linked-list/
 file:///C:/Users/dikis/Downloads/Double%20Linked%20List%20Circulate.pdf
 https://www.rizkidoank.com/2016/10/17/double-linked-
list/#:~:text=Pengertian%20Double%20Linked%20List%20adalah,node%20seb
elum%20dan%20node%20sesudahnya.
 https://prepinsta.com/data-structures/doubly-linked-list-in-c/
 https://bluejundi.wordpress.com/2009/05/05/contoh-program-double-linked-list-
dalam-bahasa-c/

More Related Content

What's hot

Pertemuan 5 Stack atau Tumpukan
Pertemuan 5 Stack atau TumpukanPertemuan 5 Stack atau Tumpukan
Pertemuan 5 Stack atau Tumpukan
Endang Retnoningsih
 
Pertemuan 10 Kunjungan Pada Pohon Biner
Pertemuan 10 Kunjungan Pada Pohon BinerPertemuan 10 Kunjungan Pada Pohon Biner
Pertemuan 10 Kunjungan Pada Pohon Biner
Endang Retnoningsih
 
Queue
Queue Queue
Algoritma dan Pemrograman C++ (Perulangan)
Algoritma dan Pemrograman C++ (Perulangan)Algoritma dan Pemrograman C++ (Perulangan)
Algoritma dan Pemrograman C++ (Perulangan)
Nabil Muhammad Firdaus
 
MAKALAH SINGLE LINKED LIST DALAM BAHASA.docx
MAKALAH SINGLE LINKED LIST DALAM BAHASA.docxMAKALAH SINGLE LINKED LIST DALAM BAHASA.docx
MAKALAH SINGLE LINKED LIST DALAM BAHASA.docx
Dikicandra6
 
Makalah
MakalahMakalah
Makalah
emilia_dy
 
JAWABAN Struktur data soal-latihan-2
JAWABAN Struktur data soal-latihan-2JAWABAN Struktur data soal-latihan-2
JAWABAN Struktur data soal-latihan-2
Bina Sarana Informatika
 
Power Point Induksi Matematika
Power Point Induksi MatematikaPower Point Induksi Matematika
Power Point Induksi Matematika
nanasaf
 
MAKALAH STACK (TUMPUKAN )
MAKALAH STACK (TUMPUKAN )MAKALAH STACK (TUMPUKAN )
MAKALAH STACK (TUMPUKAN )
istiqlal
 
Soal uas struktur data
Soal uas struktur dataSoal uas struktur data
Soal uas struktur data
Bina Sarana Informatika
 
Circular linked list
Circular linked listCircular linked list
Circular linked list
Laxer Pratama
 
Pengertian dan Representasi Graph
Pengertian dan Representasi GraphPengertian dan Representasi Graph
Pengertian dan Representasi Graph
Zaldy Eka Putra
 
Jawaban Struktur data soal-latihan
Jawaban Struktur data soal-latihanJawaban Struktur data soal-latihan
Jawaban Struktur data soal-latihan
Bina Sarana Informatika
 
Edo A.G - Rangkaian Aritmatika
Edo A.G - Rangkaian AritmatikaEdo A.G - Rangkaian Aritmatika
Edo A.G - Rangkaian Aritmatika
Edo A.G
 
Laporan Praktikum Algoritma
Laporan Praktikum AlgoritmaLaporan Praktikum Algoritma
Laporan Praktikum Algoritma
EnvaPya
 
Jawaban latihan soal STRUKTUR DATA
Jawaban latihan soal STRUKTUR DATAJawaban latihan soal STRUKTUR DATA
Jawaban latihan soal STRUKTUR DATA
Bina Sarana Informatika
 
Penyelesaian sistem persamaan linear dengan metode gauss
Penyelesaian sistem persamaan linear dengan metode gaussPenyelesaian sistem persamaan linear dengan metode gauss
Penyelesaian sistem persamaan linear dengan metode gaussLitami
 
8. Multi List (Struktur Data)
8. Multi List (Struktur Data)8. Multi List (Struktur Data)
8. Multi List (Struktur Data)
Kelinci Coklat
 
Induksi Matematik.ppt
Induksi Matematik.pptInduksi Matematik.ppt
Induksi Matematik.ppt
AriyaIda
 
Materi sorting(pengurutan)-Dasar-Dasar Pemprograman
Materi sorting(pengurutan)-Dasar-Dasar PemprogramanMateri sorting(pengurutan)-Dasar-Dasar Pemprograman
Materi sorting(pengurutan)-Dasar-Dasar Pemprograman
Reskidtc
 

What's hot (20)

Pertemuan 5 Stack atau Tumpukan
Pertemuan 5 Stack atau TumpukanPertemuan 5 Stack atau Tumpukan
Pertemuan 5 Stack atau Tumpukan
 
Pertemuan 10 Kunjungan Pada Pohon Biner
Pertemuan 10 Kunjungan Pada Pohon BinerPertemuan 10 Kunjungan Pada Pohon Biner
Pertemuan 10 Kunjungan Pada Pohon Biner
 
Queue
Queue Queue
Queue
 
Algoritma dan Pemrograman C++ (Perulangan)
Algoritma dan Pemrograman C++ (Perulangan)Algoritma dan Pemrograman C++ (Perulangan)
Algoritma dan Pemrograman C++ (Perulangan)
 
MAKALAH SINGLE LINKED LIST DALAM BAHASA.docx
MAKALAH SINGLE LINKED LIST DALAM BAHASA.docxMAKALAH SINGLE LINKED LIST DALAM BAHASA.docx
MAKALAH SINGLE LINKED LIST DALAM BAHASA.docx
 
Makalah
MakalahMakalah
Makalah
 
JAWABAN Struktur data soal-latihan-2
JAWABAN Struktur data soal-latihan-2JAWABAN Struktur data soal-latihan-2
JAWABAN Struktur data soal-latihan-2
 
Power Point Induksi Matematika
Power Point Induksi MatematikaPower Point Induksi Matematika
Power Point Induksi Matematika
 
MAKALAH STACK (TUMPUKAN )
MAKALAH STACK (TUMPUKAN )MAKALAH STACK (TUMPUKAN )
MAKALAH STACK (TUMPUKAN )
 
Soal uas struktur data
Soal uas struktur dataSoal uas struktur data
Soal uas struktur data
 
Circular linked list
Circular linked listCircular linked list
Circular linked list
 
Pengertian dan Representasi Graph
Pengertian dan Representasi GraphPengertian dan Representasi Graph
Pengertian dan Representasi Graph
 
Jawaban Struktur data soal-latihan
Jawaban Struktur data soal-latihanJawaban Struktur data soal-latihan
Jawaban Struktur data soal-latihan
 
Edo A.G - Rangkaian Aritmatika
Edo A.G - Rangkaian AritmatikaEdo A.G - Rangkaian Aritmatika
Edo A.G - Rangkaian Aritmatika
 
Laporan Praktikum Algoritma
Laporan Praktikum AlgoritmaLaporan Praktikum Algoritma
Laporan Praktikum Algoritma
 
Jawaban latihan soal STRUKTUR DATA
Jawaban latihan soal STRUKTUR DATAJawaban latihan soal STRUKTUR DATA
Jawaban latihan soal STRUKTUR DATA
 
Penyelesaian sistem persamaan linear dengan metode gauss
Penyelesaian sistem persamaan linear dengan metode gaussPenyelesaian sistem persamaan linear dengan metode gauss
Penyelesaian sistem persamaan linear dengan metode gauss
 
8. Multi List (Struktur Data)
8. Multi List (Struktur Data)8. Multi List (Struktur Data)
8. Multi List (Struktur Data)
 
Induksi Matematik.ppt
Induksi Matematik.pptInduksi Matematik.ppt
Induksi Matematik.ppt
 
Materi sorting(pengurutan)-Dasar-Dasar Pemprograman
Materi sorting(pengurutan)-Dasar-Dasar PemprogramanMateri sorting(pengurutan)-Dasar-Dasar Pemprograman
Materi sorting(pengurutan)-Dasar-Dasar Pemprograman
 

Similar to MAKALAH DOUBLE LINKED LIST BAHASA C.docx

PPT STRUKTUR DATA(1).pptx
PPT STRUKTUR DATA(1).pptxPPT STRUKTUR DATA(1).pptx
PPT STRUKTUR DATA(1).pptx
JendralSweet
 
Linked list
Linked listLinked list
Stack with linked list(algodat)
Stack with linked list(algodat)Stack with linked list(algodat)
Stack with linked list(algodat)
Marlintika Marlintika
 
Linked list
Linked listLinked list
Linked list
Tenia Wahyuningrum
 
Laporan Praktikum Struktur Data Modul 3
Laporan Praktikum Struktur Data Modul 3Laporan Praktikum Struktur Data Modul 3
Laporan Praktikum Struktur Data Modul 3azmi007
 
Bab 5 linked list
Bab 5 linked listBab 5 linked list
Bab 5 linked list
Fahuda E
 
Bab 6 singly_linked_list
Bab 6 singly_linked_listBab 6 singly_linked_list
Bab 6 singly_linked_list
arii_manroe
 
Modul 3 strukdat
Modul 3 strukdatModul 3 strukdat
Modul 3 strukdat
Vincentius Kristanto
 
Modul 2
Modul 2Modul 2
POWER POINT STRUKTUR DATA AMIK BSI PURWOKERTO
POWER POINT STRUKTUR DATA AMIK  BSI PURWOKERTOPOWER POINT STRUKTUR DATA AMIK  BSI PURWOKERTO
POWER POINT STRUKTUR DATA AMIK BSI PURWOKERTO
Amalia Puspita Sari
 
Persentasi linked list
Persentasi linked listPersentasi linked list
Persentasi linked list
Irsyad Casanova
 
Persentasi linked list
Persentasi linked listPersentasi linked list
Persentasi linked list
Irsyad Casanova
 
MAKALAH LINKED LIST DALAM BAHASA C.docx
MAKALAH LINKED LIST DALAM BAHASA C.docxMAKALAH LINKED LIST DALAM BAHASA C.docx
MAKALAH LINKED LIST DALAM BAHASA C.docx
Dikicandra6
 
Pertemuan 4 revisijan2013-mhs
Pertemuan 4 revisijan2013-mhsPertemuan 4 revisijan2013-mhs
Pertemuan 4 revisijan2013-mhs
Bina Sarana Informatika
 
3 Linked List
3   Linked List3   Linked List
3 Linked List
ahmad haidaroh
 
5 6 single-linked_list
5 6 single-linked_list5 6 single-linked_list
5 6 single-linked_list
Wandi Parlente
 
9.double linked list circular
9.double linked list circular9.double linked list circular
9.double linked list circular
Hitesh Wagle
 
Tistrukdat6
Tistrukdat6Tistrukdat6
Tistrukdat6
Antonius Rachmat C
 

Similar to MAKALAH DOUBLE LINKED LIST BAHASA C.docx (20)

PPT STRUKTUR DATA(1).pptx
PPT STRUKTUR DATA(1).pptxPPT STRUKTUR DATA(1).pptx
PPT STRUKTUR DATA(1).pptx
 
Linked list
Linked listLinked list
Linked list
 
Stack with linked list(algodat)
Stack with linked list(algodat)Stack with linked list(algodat)
Stack with linked list(algodat)
 
Linked list
Linked listLinked list
Linked list
 
Laporan Praktikum Struktur Data Modul 3
Laporan Praktikum Struktur Data Modul 3Laporan Praktikum Struktur Data Modul 3
Laporan Praktikum Struktur Data Modul 3
 
Bab 5 linked list
Bab 5 linked listBab 5 linked list
Bab 5 linked list
 
Bab 6 singly_linked_list
Bab 6 singly_linked_listBab 6 singly_linked_list
Bab 6 singly_linked_list
 
Modul 3 strukdat
Modul 3 strukdatModul 3 strukdat
Modul 3 strukdat
 
Modul 2
Modul 2Modul 2
Modul 2
 
POWER POINT STRUKTUR DATA AMIK BSI PURWOKERTO
POWER POINT STRUKTUR DATA AMIK  BSI PURWOKERTOPOWER POINT STRUKTUR DATA AMIK  BSI PURWOKERTO
POWER POINT STRUKTUR DATA AMIK BSI PURWOKERTO
 
Persentasi linked list
Persentasi linked listPersentasi linked list
Persentasi linked list
 
Persentasi linked list
Persentasi linked listPersentasi linked list
Persentasi linked list
 
MAKALAH LINKED LIST DALAM BAHASA C.docx
MAKALAH LINKED LIST DALAM BAHASA C.docxMAKALAH LINKED LIST DALAM BAHASA C.docx
MAKALAH LINKED LIST DALAM BAHASA C.docx
 
Pertemuan 4 revisijan2013-mhs
Pertemuan 4 revisijan2013-mhsPertemuan 4 revisijan2013-mhs
Pertemuan 4 revisijan2013-mhs
 
3 Linked List
3   Linked List3   Linked List
3 Linked List
 
teori Struktur data full
teori Struktur data fullteori Struktur data full
teori Struktur data full
 
Pertemuan 3 ok
Pertemuan 3 okPertemuan 3 ok
Pertemuan 3 ok
 
5 6 single-linked_list
5 6 single-linked_list5 6 single-linked_list
5 6 single-linked_list
 
9.double linked list circular
9.double linked list circular9.double linked list circular
9.double linked list circular
 
Tistrukdat6
Tistrukdat6Tistrukdat6
Tistrukdat6
 

More from Dikicandra6

MAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docx
MAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docxMAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docx
MAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docx
Dikicandra6
 
MAKALAH PERULANGAN BAHASA C ( Diki Candra ).docx
MAKALAH PERULANGAN BAHASA C ( Diki Candra ).docxMAKALAH PERULANGAN BAHASA C ( Diki Candra ).docx
MAKALAH PERULANGAN BAHASA C ( Diki Candra ).docx
Dikicandra6
 
MAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docx
MAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docxMAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docx
MAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docx
Dikicandra6
 
MAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docx
MAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docxMAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docx
MAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docx
Dikicandra6
 
MAKALAH DATA STRUKTURE (Diki Candra).docx
MAKALAH DATA STRUKTURE (Diki Candra).docxMAKALAH DATA STRUKTURE (Diki Candra).docx
MAKALAH DATA STRUKTURE (Diki Candra).docx
Dikicandra6
 
MAKALAH POINTER (DIKI CANDRA) (1).docx
MAKALAH POINTER (DIKI CANDRA) (1).docxMAKALAH POINTER (DIKI CANDRA) (1).docx
MAKALAH POINTER (DIKI CANDRA) (1).docx
Dikicandra6
 
MAKALAH FUNGSI DALAM BAHASA C.docx
MAKALAH FUNGSI DALAM BAHASA C.docxMAKALAH FUNGSI DALAM BAHASA C.docx
MAKALAH FUNGSI DALAM BAHASA C.docx
Dikicandra6
 
MAKALAH REKRUSIF (DIKI CANDRA).docx
MAKALAH REKRUSIF (DIKI CANDRA).docxMAKALAH REKRUSIF (DIKI CANDRA).docx
MAKALAH REKRUSIF (DIKI CANDRA).docx
Dikicandra6
 

More from Dikicandra6 (8)

MAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docx
MAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docxMAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docx
MAKALAH ARRAY BAHASA C (DIKI CANDRA) (2).docx
 
MAKALAH PERULANGAN BAHASA C ( Diki Candra ).docx
MAKALAH PERULANGAN BAHASA C ( Diki Candra ).docxMAKALAH PERULANGAN BAHASA C ( Diki Candra ).docx
MAKALAH PERULANGAN BAHASA C ( Diki Candra ).docx
 
MAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docx
MAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docxMAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docx
MAKALAH PENGENALAN BAHASA C (Diki Candra) - Copy.docx
 
MAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docx
MAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docxMAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docx
MAKALH PENGKONDISIAN BAHASA PEMROGRAMAN(Diki Candra).docx
 
MAKALAH DATA STRUKTURE (Diki Candra).docx
MAKALAH DATA STRUKTURE (Diki Candra).docxMAKALAH DATA STRUKTURE (Diki Candra).docx
MAKALAH DATA STRUKTURE (Diki Candra).docx
 
MAKALAH POINTER (DIKI CANDRA) (1).docx
MAKALAH POINTER (DIKI CANDRA) (1).docxMAKALAH POINTER (DIKI CANDRA) (1).docx
MAKALAH POINTER (DIKI CANDRA) (1).docx
 
MAKALAH FUNGSI DALAM BAHASA C.docx
MAKALAH FUNGSI DALAM BAHASA C.docxMAKALAH FUNGSI DALAM BAHASA C.docx
MAKALAH FUNGSI DALAM BAHASA C.docx
 
MAKALAH REKRUSIF (DIKI CANDRA).docx
MAKALAH REKRUSIF (DIKI CANDRA).docxMAKALAH REKRUSIF (DIKI CANDRA).docx
MAKALAH REKRUSIF (DIKI CANDRA).docx
 

MAKALAH DOUBLE LINKED LIST BAHASA C.docx

  • 1. MAKALAH FUNGSI DAN STRUKTUR DATA BAHASA C OLEH: DIKI CANDRA NIM 2022903430010 D4 TEKNOLOGI REKAYASA KOMPUTER JARINGAN POLITEKNIK NEGERI LHOKSEUMAWE 2022/2023
  • 2. BAB I PENDAHULUAN 1.1 LATAR BELAKANG Linked List adalah suatu struktur data linier. linked list dibentuk secara dinamik. Pada saat awal program dijalankan elemen linked list belum data. Elemen linked list (disebut node) dibentuk sambil jalan sesuai instruksi. sebuah node linked list diakses dengan menggunakan pointer yang mengacu ke node tersebut. Banyak yang mengira Double Linked List Circulate adalah Double Linked List Circulate pointer next dan prev nya menunjuk ke dirinya sendiri secara circular. Memang benar demikian tapi Double Linked List Circulate tidak hanya itu saja B. Rumusan Masalah Pada makalah ini saya akan mejelaskan tentang double linked list C. Tujuan  Untuk memenuhi tugas dari dosen pada mata kuliah struktur data.  Agar pembaca mengerti dan apa yang dimaksud dengan struktur array, serta paham dalam penggunaan, penerapan dan pengaplikasiannya. D. Manfaat Manfaat yang diperoleh dari makalah tersebut adalah sebagai berikut: 1. Pembaca  Menjadikan pembaca makalah semata-mata agar pembaca memahami dasar- dasar pemrograman.  Untuk memotivasi pembaca untuk membuat makalah yang lebih baik dari Ini.
  • 3. 2. Pengarang  C. Untuk memberikan semangat pada mata kuliah yang sedang diambil saat ini.  D. Sebagai titik awal untuk melakukan praktikum agar praktikum selanjutnya dapat dilakukan dengan lebih baik lagi.
  • 4. BAB II PEMBAHASAN 2.1 Pengenalan Pengertian Double Linked List adalah sekumpulan node data yang terurut linear atau sekuensial dengan dua buah pointer yaitu prev dan next. Double Linked List adalah linked list dengan node yang memiliki data dan dua buah reference link (biasanya disebut next dan prev) yang menunjuk ke node sebelum dan node sesudahnya, Pada implementasinya, terdapat dua variasi double linked list yaitu circular dan non-circular layaknya pada single linked list. Operasi pada Double Linked List Double linked list memiliki beberapa operasi dasar pada list, misalkan penyisipan, penghapusan, menampilkan maju, dan menampilkan mundur. Insert First Penyisipan di awal list, sehingga pointer head juga akan berpindah ke elemen baru. Insert Last Penyisipan di akhir list, sehingga pointer tail juga akan berpindah ke elemen baru. Insert After / Before Penyisipan after/before kurang lebih sama satu sama lain. Pada kasus diatas berlaku juga insert before 3. Delete First Penghapusan di awal list, pointer head akan berpindah ke node selanjutnya,sementara node awal akan di dealokasi. Delete Last Penghapusan di akhir list, pointer tail akan berpindah ke node sebelumnya,sementara node akhir akan di dealokasi. Delete Node Penghapusan node dengan data tertentu, pada kasus diatas yaitu delete node 2.
  • 5. 2.2 Penjelasan Doubly Linked List Dalam pembahasan artikel sebelumnya telah diperkenalkan Single Linked List, yakni linked list dengan sebuah pointer penghubung. Dalam artikel ini, dibahas pula varian linked list dengan 2 pointer penunjuk, yakni Doubly linked list yang memilki pointer penunjuk 2 arah, yakni ke arah node sebelum (previos/prev) dan node sesudah (next). Representasi sebuah doubly linked list dapat dilihat pada gambar berikut ini: Di dalam sebuah linked list, ada 2 pointer yang menjadi penunjuk utama, yakni pointer HEAD yang menunjuk pada node pertama di dalam linked list itu sendiri dan pointer TAIL yang menunjuk pada node paling akhir di dalam linked list. Sebuah linked list dikatakan kosong apabila isi pointer head adalah NULL. Selain itu, nilai pointer prev dari HEAD selalu NULL, karena merupakan data pertama. Begitu pula dengan pointer next dari TAIL yang selalu bernilai NULL sebagai penanda data terakhir. Beberapa operasi yang biasanya ada di dalam sebuah doubly linked list pada dasarnya sama dengan yang ada di dalam single linked list, yakni: Double Linked List adalah suatu linked list yang mempunyai 2 penunjuk yaitu penunjuk ke simpul sebelumnya dan ke simpul berikutnya. Perhatikan gambar di bawah ini :
  • 6. Deklarasi secara umum double linked list : Contoh : Jadi satu simpul di double linked list adalah sebagai berikut : Dari gambar di atas, untuk setiap simpul terdiri dari 3 buah field yaitu medan sambungan kiri (prev), medan data (info), dan medan sambungan kanan (next). Beberapa operasi yang dapat dilakukan dalam double linked list adalah : 1. Penciptaan Penciptaan adalah memberikan nilai nil terhadap variabel pointer awal dan variabel pointer akhir.
  • 7. 2. Penyisipan 2.a Penyisipan di depan/awal Operasi ini berguna untuk menambahkan satu simpul baru di posisi pertama. Langkah pertama untuk penambahan data adalah pembuatan simpul baru dan mengisinya dengan data pada field info-nya. Pointer yang menunjuk ke simpul tersebut dipanggil dengan nama baru. Kondisi setelah ada pembuatan simpul baru tersebut adalah : Ada 2 kondisi yang harus diperhatikan dalam penambahan data di awal yaitu : a. Ketika linked list masih kosong Kalau kondisi linked list masih kosong, maka simpul baru akan menjadi simpul awal dan sekaligus simpul akhir dari double linked list. Perhatikan gambar di bawah ini :
  • 8.  Kondisi sebelum disisipkan  Kondisi setelah operasi penyisipan Operasi penyisipan pertama kali ketika linked list masih kosong adalah dengan mengisikan alamat pointer baru ke pointer awal dan pointer akhir. Dan memberikan nilai nil pada medan sambungan kiri (prev) dan medan sambungan kanan(next). Lihat gambar di bawah ini: b. Ketika linked list tidak kosong Misalnya mula-mula keadaan list sebagai berikut:
  • 9. Proses penyisipan simpul di awal linked list adalah :  Tempatkan sebuah pointer baru di alamat yang bertipe record untuk double linked list, kemudian medan sambungan kirinya diberi harga nil.  Hubungkan medan sambungan kanan dari simpul yang ditunjuk oleh pointer baru ke simpul yang ditunjuk oleh pointer awal.  Hubungkan medan sambungan kiri (prev) dari simpul yang ditunjuk oleh pointer awal ke simpul yang baru.  Pindahkan pointer awal ke simpul yang baru
  • 10. Maka bentuk linked list setelah terjadi penyisipan di awal adalah: 2.b. Penyisipan di tengah Operasi penyisipan data di tengah linked list adalah suatu operasi menambah data di posisi tertentu di dalam linked list. Karena double linked list memiliki dua pointer sambungan, maka penyisipan bisa dilakukan sebelum data tertentu atau sesudah data tertentu, berbeda dengan single linked list yang hanya memiliki satu pointer sambungan yaitu sambungan kanan(next). Untuk proses tersebut ada 2 hal yang harus diperhatikan yaitu :  Kondisi linked list masih kosong prosesnya sama seperti penyisipan di depan/awal.  Kondisi linked list sudah mempunyai data (tidak kosong) Mula-mula keadaan linked list sebagai berikut: Misalnya akan menyisipkan data 6 sebelum data 9 (untuk menyisipkan data setelahnya lihat kembali pada single linked list) Langkah untuk penyisipan data ketika list tidak kosong adalah:  Cari data yang akan disisipkan setelahnya pada double linked (data 9), dimana simpul yang ada data 9 ditunjuk oleh pointer bantuan (bantu).
  • 11. Pointer bantu bisa berada di simpul yang ada data 9, karena melalui proses pencarian (searching). Metode searching yang digunakan bisa sequential search dengan boolean atau sequential search tanpa sentinel.  Jika data yang dicari ditemukan, maka akan terjadi penyisipan dengan langkah sebagai berikut: - Tempatkan pointer baru pada sebuah simpul baru berupa double linked yang akan disisipkan. - Sisipkan simpul yang baru atau data yang baru disebelum simpul yang dicari tadi, dengan langkah: a. Medan sambungan kanan (next) dan medan sambungan kiri (prev) dari simpul yang baru dihubungkan ke simpul yang ada data 9 dengan simpul yang ada data 7. b. Hubungkan medan sambungan kanan (next) dari simpul tetangga kirinya bantu ke simpul yang baru.
  • 12. c. Terakhir hubungkan medan sambungan kiri (prev) dari simpul yang ditunjuk oleh bantu ke simpul yang baru. Maka bentuk double linked list setelah mengalami penyisipan di tengah seperti gambar berikut: 2.c. Penyisipan di belakang/akhir Operasi ini berguna untuk menambahkan elemen baru di posisi akhir. Langkah pertama untuk penambahan data adalah pembuatan elemen baru dan pengisian nilai infonya. Pointer yang menunjuk ke data tersebut dipanggil dengan nama baru. Kondisi di setelah ada pembuatan elemen baru tersebut adalah : Ada 2 kondisi yang harus diperhatikan dalam penambahan data di akhir yaitu :  Kondisi linked list masih kosong prosesnya sama seperti penyisipan di depan/awal.  Ketika linked list sudah mempunyai data Mula-mula list sebagai berikut:
  • 13. Proses penambahan data di akhir linked list adalah :  Tempatkan pointer baru pada sebuah simpul double linked list yang baru, karena simpul yang baru ini nantinya menjadi simpul yang terakhir, maka medan sambungan dari simpul yang baru diberi harga nil.  Hubungkan medan sambungan kanan (next) dari simpul yang ditunjuk oleh pointer akhir ke simpul yang baru.  Hubungkan medan sambungan kiri(prev) dari simpul yang baru ke simpul yang ditunjuk oleh pointer akhir.  Pindahkan pointer akhir ke simpul yang baru
  • 14. 3. Penghapusan a. Penghapusan di awal Operasi ini berguna untuk menghapus data pada posisi pertama. Ada 3 keadaan yang mungkin terjadi ketika akan melakukan proses hapus yaitu :  Kondisi linked list masih kosong Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.  Kondisi linked list hanya memiliki 1 data Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1 data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir diberi harga nil. Untuk lebih jelas perhatikan urutan penghapusannya di bawah ini : - Kondisi list sebelum dihapus - Kondisi list setelah ada proses penghapusan Kemudian pointer awal dan akhir diisi dengan nil.  Kondisi linked list memiliki lebih dari satu data atau satu simpul Untuk operasi penghapusan data di posisi pertama pada double linked list yang mempunyai data lebih dari satu buah adalah :  Tempatkan pointer bantuan (phapus) ke simpul (alamat) yang ditunjuk oleh pointer awal.
  • 15.  Pindahkan pointer awal ke simpul tetangga kanannya (next)  Sambungan kiri (prev) dari simpul yang ditunjuk oleh pointer awal diberi harga nil  Selamatkan data yang akan dihapus ke dalam variabel elemen, kemudian hapus simpul yang ditunjuk oleh pointer phapus  Setelah simpul dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini: b. Penghapusan di tengah Untuk melakukan proses penghapusan di tengah linked list, ada 3 kondisi yang perlu diperhatikan yaitu : a. Kondisi ketika linked list masih kosong atau ketika posisi hapus lebih kecil dari 1. Ketika kondisi ini terjadi, maka proses penghapusan tidak bisa dilakukan karena data masih kosong atau karena posisi hapus diluar jangkauan linked list (posisi kurang dari 1). b. Kondisi ketika list memiliki satu simpul atau posisi hapus sama dengan satu (hapus data pertama)
  • 16. Ketika kondisi ini terjadi, maka proses yang dilakukan adalah proses penghapusan di posisi awal (hapus_awal). c. Kondisi ketika list lebih dari satu simpul atau posisi hapus lebih besar dari satu. Misalkan akan menghapus simpul yang ke-3: Hubungan sambungan kanan (next) dari simpul tetangga kirinya phapus dengan simpul tetangga kanannya phapus. Kemudian hubungkan sambungan kiri dari tetangga kanannya phapus ke simpul tetangga kirinya phapus. Simpan data yang akan dihapus ke dalam sebuah variabel elemen, kemudian simpul yang ditunjuk oleh phapus dapat dihapus Setelah terjadi penghapusan di tengah, maka linked list seperti gambar berikut:
  • 17. c. Penghapusan di akhir Operasi ini berguna untuk menghapus data pada posisi terakhir. Ada 3 keadaan yang mungkin terjadi ketika akan melakukan proses hapus yaitu : a. Kondisi linked list masih kosong Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong. b. Kondisi linked list hanya memiliki satu data atau satu simpul Penghapusan di akhir prosesnya sama seperti penghapusan di depan c. Kondisi linked list memiliki lebih dari satu data atau lebih dari 1 simpul Untuk operasi penghapusan data di posisi terakhir pada double linked list yang mempunyai data lebih dari 1 buah adalah :  Tempatkan pointer bantuan (phapus) di simpul yang terakhir  Pindahkan pointer akhir ke simpul sebelumnya  Field kanan dari pointer akhir diberi harga nil  Simpan data yang akan dihapus ke variabel elemen, kemudian hapus simpul yang ditunjuk leh pointer phapus.
  • 18.  Setelah simpul dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini. 4. Penelusuran/traversal Prosesnya secara umum sama seperti penelusuran pada single liked list. 5. Pencarian /Seaching Pencarian dilakukan dengan memeriksa data yang ada dalam linked list dengan data yang dicari. Pencarian dilakukan dari data pertama sampai data ditemukan atau pointer pencari (bantu) telah mencapai akhir dari list yang menandakan bahwa data yang dicari tidak ditemukan. Agar lebih jelas perhatikan ilustrasi di bawah ini, dengan contoh data adalah : Ada 2 kondisi yang dihasilkan oleh proses pencarian yaitu a. Pencarian dimana data yang dicari dapat ditemukan Kasus : data yang akan dicari adalah data 9. - Tempatkan pointer bantuan (bantu) di simpul pertama dan beri harga pada variabel posisi dengan angka 1
  • 19. - Jika field info yang ditunjuk oleh pointer bantu tidak sama dengan data yang dicari, maka pointer bantu pindah ke simpul berikutnya dan variabel posisi harganya bertambah 1, ulang terus menerus sampai data yang dicari ditemukan atau sampai seluruh list ditelusuri. - Jika ditemukan, maka akan ada pernyataan “data yang dicari ada pada simpul ke sekian”, tetapi jika data yang dicari tidak ditemukan, maka akan ada pernyataan “data yang dicari tidak ditemukan/tidak ada”. 6. Pengurutan/sorting Proses penyusunan data acak menjadi tersusun baik secara ascending ataupun secara descending pada dasarnya sama seperti pada single linked list, hanya saja pada double linked list dapat dilakukan dari kiri ke kanan atau dari kanan ke kiri dalam hal menyusuri list. Misalkan akan mengurutkan data acak secara ascending dengan menggunakan metode selection sort yang jenisnya minimum sort: Proses pengurutannya adalah : Bandingkan data di simpul yg ditunjuk oleh pointer p2 dengan data di simpul yang ditunjuk oleh pointer min, jika lebih kecil pindahkan pointer min ke simpul yang ditunjuk oleh pointer p2, kemudian pointer p2 pindah ke simpul tetangga kanannya, ulangi sampai pointer p2 bernilai nil (asumsi data terkecil sudah ditemukan dan simpulnya ditunjuk oleh pointer min).
  • 20. Setelah itu tukarkan data terkecil tadi dengan data di simpul yang ditunjuk oleh pointer p1. Tahap 1: Tahap 2:
  • 21. Tahap 3: Data acak akhirnya tersusun secara ascending sebagai berikut:
  • 22. 7. Penghancuran/destroy Proses penghancuran bisa dengan cara memanggil modul/subrutin penghapusan di awal atau penghapusan di akhir secara terus menerus sampai list kosong, atau dengan proses penghancuran seperti pada single linked list. 2.3 Contoh Program Double Linked List Contoh 1: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> struct node { int data; int key; struct node *next; struct node *prev; }; //this link always point to first Link struct node *head = NULL; //this link always point to last Link struct node *last = NULL; struct node *current = NULL; //is list empty bool isEmpty() { return head == NULL; } int length() {
  • 23. int length = 0; struct node *current; for(current = head; current != NULL; current = current->next){ length++; } return length; } //display the list in from first to last void displayForward() { //start from the beginning struct node *ptr = head; //navigate till the end of the list printf("n[ "); while(ptr != NULL) { printf("(%d,%d) ",ptr->key,ptr->data); ptr = ptr->next; } printf(" ]"); } //display the list from last to first void displayBackward() { //start from the last struct node *ptr = last; //navigate till the start of the list printf("n[ "); while(ptr != NULL) { //print data printf("(%d,%d) ",ptr->key,ptr->data);
  • 24. //move to next item ptr = ptr ->prev; } } //insert link at the first location void insertFirst(int key, int data) { //create a link struct node *link = (struct node*) malloc(sizeof(struct node)); link->key = key; link->data = data; if(isEmpty()) { //make it the last link last = link; } else { //update first prev link head->prev = link; } //point it to old first link link->next = head; //point first to new first link head = link; } //insert link at the last location void insertLast(int key, int data) { //create a link struct node *link = (struct node*) malloc(sizeof(struct node)); link->key = key; link->data = data; if(isEmpty()) {
  • 25. //make it the last link last = link; } else { //make link a new last link last->next = link; //mark old last node as prev of new link link->prev = last; } //point last to new last node last = link; } //delete first item struct node* deleteFirst() { //save reference to first link struct node *tempLink = head; //if only one link if(head->next == NULL){ last = NULL; } else { head->next->prev = NULL; } head = head->next; //return the deleted link return tempLink; } //delete link at the last location struct node* deleteLast() { //save reference to last link struct node *tempLink = last; //if only one link if(head->next == NULL) {
  • 26. head = NULL; } else { last->prev->next = NULL; } last = last->prev; //return the deleted link return tempLink; } //delete a link with given key struct node* delete(int key) { //start from the first link struct node* current = head; struct node* previous = NULL; //if list is empty if(head == NULL) { return NULL; } //navigate through list while(current->key != key) { //if it is last node if(current->next == NULL) { return NULL; } else { //store reference to current link previous = current; //move to next link current = current->next; } } //found a match, update the link
  • 27. if(current == head) { //change first to point to next link head = head->next; } else { //bypass the current link current->prev->next = current->next; } if(current == last) { //change last to point to prev link last = current->prev; } else { current->next->prev = current->prev; } return current; } bool insertAfter(int key, int newKey, int data) { //start from the first link struct node *current = head; //if list is empty if(head == NULL) { return false; } //navigate through list while(current->key != key) { //if it is last node if(current->next == NULL) { return false; } else { //move to next link current = current->next; } } //create a link
  • 28. struct node *newLink = (struct node*) malloc(sizeof(struct node)); newLink->key = newKey; newLink->data = data; if(current == last) { newLink->next = NULL; last = newLink; } else { newLink->next = current->next; current->next->prev = newLink; } newLink->prev = current; current->next = newLink; return true; } void main() { insertFirst(1,10); insertFirst(2,20); insertFirst(3,30); insertFirst(4,1); insertFirst(5,40); insertFirst(6,56); printf("nList (First to Last): "); displayForward(); printf("n"); printf("nList (Last to first): "); displayBackward(); printf("nList , after deleting first record: "); deleteFirst(); displayForward(); printf("nList , after deleting last record: "); deleteLast(); displayForward();
  • 29. printf("nList , insert after key(4) : "); insertAfter(4,7, 13); displayForward(); printf("nList , after delete key(4) : "); delete(4); displayForward(); } Output : List (First to Last): [ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ] List (Last to first): [ (1,10) (2,20) (3,30) (4,1) (5,40) (6,56) ] List , after deleting first record: [ (5,40) (4,1) (3,30) (2,20) (1,10) ] List , after deleting last record: [ (5,40) (4,1) (3,30) (2,20) ] List , insert after key(4) : [ (5,40) (4,1) (7,13) (3,30) (2,20) ] List , after delete key(4) : [ (5,40) (4,13) (3,30) (2,20) ] Contoh 2: #include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node *next; struct Node *prev; }; void insertStart(struct Node** head, int data){ // creating memory for newNode struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); // assigning newNode's next as the current head // Assign data & and make newNode's prev as NULL
  • 30. newNode->data = data; newNode->next = *head; newNode->prev = NULL; // if list already had item(s) // We need to make current head previous node as this new node if(*head != NULL) (*head)->prev = newNode; // change head to this newNode *head = newNode; } void display(struct Node* node) { struct Node* end; printf("nIn Forward Directionn"); while (node != NULL) { printf(" %d ", node->data); end = node; node = node->next; } printf("nIn Backward direction n"); while (end != NULL) { printf(" %d ", end->data); end = end->prev; } } int main() { struct Node* head = NULL; // Need '&' i.e. address as we need to change head insertStart(&head,1); insertStart(&head,2); insertStart(&head,3); // no need for '&' as head need not be changed // only doing traversal display(head); return 0; } Output : In Forward Direction 3 2 1 In Backward direction 1 2 3
  • 31. Contoh 3: Input : #include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node *next; struct Node *prev; }; void insertStart(struct Node** head, int data){ // creating memory for newNode struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); // assigning newNode's next as the current head // Assign data & and make newNode's prev as NULL newNode->data = data; newNode->next = *head; newNode->prev = NULL; // if list already had item(s) // We need to make current head previous node as this new node if(*head != NULL) (*head)->prev = newNode; // change head to this newNode *head = newNode; } void insertLast(struct Node** head, int data){ struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; //need this if there is no node present in linked list at all if(*head==NULL){ *head = newNode; newNode->prev = NULL; return; } struct Node* temp = *head; // traverse till the last node while(temp->next!=NULL) temp = temp->next;
  • 32. // assign last node's next to this new Node temp->next = newNode; // assign this new Node's previous to last node(temp) newNode->prev = temp; } void display(struct Node* node) { struct Node* end; printf("nIn Forward Directionn"); while (node != NULL) { printf(" %d ", node->data); end = node; node = node->next; } printf("nIn Backward direction n"); while (end != NULL) { printf(" %d ", end->data); end = end->prev; } } int main() { struct Node* head = NULL; // Need '&' i.e. address as we need to change head insertStart(&head,1); insertStart(&head,2); insertStart(&head,3); insertLast(&head,10); insertLast(&head,20); // no need for '&' as head need not be changed // only doing traversal display(head); return 0; } Output: In Forward Direction 3 2 1 10 20 In Backward direction 20 10 1 2 3
  • 33. Contoh 4: Input: #include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node *next; struct Node *prev; }; void insertStart(struct Node** head, int data){ // creating memory for newNode struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); // assigning newNode's next as the current head // Assign data & and make newNode's prev as NULL newNode->data = data; newNode->next = *head; newNode->prev = NULL; // if list already had item(s) // We need to make current head previous node as this new node if(*head != NULL) (*head)->prev = newNode; // change head to this newNode *head = newNode; } void insertLast(struct Node** head, int data){ struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; //need this if there is no node present in linked list at all if(*head==NULL){ *head = newNode; newNode->prev = NULL; return; } struct Node* temp = *head; // traverse till the last node while(temp->next!=NULL) temp = temp->next;
  • 34. // assign last node's next to this new Node temp->next = newNode; // assign this new Node's previous to last node(temp) newNode->prev = temp; } int calcSize(struct Node* node){ int size=0; while(node!=NULL){ node = node->next; size++; } return size; } void insertPosition(int pos, int data, struct Node** head){ int size = calcSize(*head); //If pos is 0 then should use insertStart method //If pos is less than 0 then can't enter at all //If pos is greater than size then bufferbound issue if(pos<1 || size < pos) { printf("Can't insert, %d is not a valid positionn",pos); } else{ struct Node* temp = *head; struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; // traverse till pos while(--pos) { temp=temp->next; } // assign prev/next of this new node newNode->next = temp->next; newNode->prev = temp; // change next of temp node temp->next = newNode; } } void display(struct Node* node) { struct Node* end; printf("nIn Forward Directionn"); while (node != NULL) { printf("%d ", node->data);
  • 35. end = node; node = node->next; } printf("nnIn Backward direction n"); while (end != NULL) { printf("%d ", end->data); end = end->prev; } } int main() { struct Node* head = NULL; // Need '&' i.e. address as we need to change head insertStart(&head,1); insertStart(&head,2); insertStart(&head,3); insertLast(&head,10); insertLast(&head,20); insertPosition(2, 100, &head); // no need for '&' as head need not be changed // only doing traversal display(head); return 0; } Output: In Forward Direction 3 2 100 1 10 20 In Backward direction 20 10 1 2 3
  • 36. BAB III PENUTUP Demikianlah Makalah ini saya buat dengan sebaik-baiknya. Terima kasih buat Orang tua yang selalu mendukung saya baik materil maupun moril,dan terima kasih untuk abang dan kakak assisten laboratorium paket applikasi, juga terima kasih buat kawan-kawan yang telah membantu dalam mengerjakan makalah ini.semoga makalah ini dapat berguna buat kita semua dan buat angkatan ke depannya kelak. lebih dan kurangnya saya mohon maaf, kepada abang dan kakak saya ucapkan terima kasih. Wassalammu’alaikum Wr.Wb.
  • 37. DAFTAR PUSTAKA  https://repository.unikom.ac.id/35514/1/Bab%20VI%20- %20Double%20Linked%20List.pdf  https://socs.binus.ac.id/2017/03/15/doubly-linked-list/  file:///C:/Users/dikis/Downloads/Double%20Linked%20List%20Circulate.pdf  https://www.rizkidoank.com/2016/10/17/double-linked- list/#:~:text=Pengertian%20Double%20Linked%20List%20adalah,node%20seb elum%20dan%20node%20sesudahnya.  https://prepinsta.com/data-structures/doubly-linked-list-in-c/  https://bluejundi.wordpress.com/2009/05/05/contoh-program-double-linked-list- dalam-bahasa-c/