DLL(Double Linked List)
Double Linked List
Double linked list adalah single linked list yang memiliki 2
arah. Tidak seperti single linked list yang hanya bergeser dari head ke tail,
double linked list bisa begeser ke arah sebaliknya
Keuntungan Double linked List
1.
Implementasinya tidak jauh berbeda dari Single
linksed list
2.
Mampu bergeser dua arah
3.
Deletion lebih mudah dilakukan, karena tidak
perlu menggunakan pointer node dan pointer node sebelum yang akan dihapus.
Double linked list hanya butuh pointer node yang ingin dihapus
4.
Bisa di allocate dan di deallocate dengan lebih
mudah
5.
Salah satu data structures yang paling efisien
jika pergeseran dengan dua arah dibutuhkan
Aplikasinya
Navigasi
Back/forward
pages di browser
Undo/redo
#include<stdio.h>
#include<conio.h>
void
insertAtBeginning(int);
void
insertAtEnd(int);
void
insertAtAfter(int,int);
void
deleteBeginning();
void
deleteEnd();
void
deleteSpecific(int);
void
display();
struct
Node
{
int data;
struct Node *previous, *next;
}*head
= NULL;
void
main()
{
int choice1, choice2, value, location;
clrscr();
while(1)
{
printf("\n*********** MENU
*************\n");
printf("1. Insert\n2. Delete\n3.
Display\n4. Exit\nEnter your choice: ");
scanf("%d",&choice1);
switch()
{
case 1: printf("Enter the value
to be inserted: ");
scanf("%d",&value);
while(1)
{
printf("\nSelect from the following Inserting
options\n");
printf("1. At Beginning\n2. At End\n3. After a
Node\n4. Cancel\nEnter your choice: ");
scanf("%d",&choice2);
switch(choice2)
{
case 1: insertAtBeginning(value);
break;
case 2: insertAtEnd(value);
break;
case 3: printf("Enter the location after
which you want to insert: ");
scanf("%d",&location);
insertAfter(value,location);
break;
case 4: goto EndSwitch;
default:
printf("\nPlease select correct Inserting option!!!\n");
}
}
case 2: while(1)
{
printf("\nSelect from the following Deleting
options\n");
printf("1. At Beginning\n2. At End\n3. Specific
Node\n4. Cancel\nEnter your choice: ");
scanf("%d",&choice2);
switch(choice2)
{
case 1: deleteBeginning();
break;
case 2: deleteEnd();
break;
case 3: printf("Enter the Node value to be
deleted: ");
scanf("%d",&location);
deleteSpecic(location);
break;
case 4: goto EndSwitch;
default:
printf("\nPlease select correct Deleting option!!!\n");
}
}
EndSwitch: break;
case 3: display();
break;
case 4: exit(0);
default: printf("\nPlease select
correct option!!!");
}
}
}
void
insertAtBeginning(int value)
{
struct Node *newNode;
newNode = (struct
Node*)malloc(sizeof(struct Node));
newNode -> data = value;
newNode -> previous = NULL;
if(head == NULL)
{
newNode -> next = NULL;
head = newNode;
}
else
{
newNode -> next = head;
head = newNode;
}
printf("\nInsertion success!!!");
}
void
insertAtEnd(int value)
{
struct Node *newNode;
newNode = (struct Node*)malloc(sizeof(struct
Node));
newNode -> data = value;
newNode -> next = NULL;
if(head == NULL)
{
newNode -> previous = NULL;
head = newNode;
}
else
{
struct Node *temp = head;
while(temp -> next != NULL)
temp = temp -> next;
temp -> next = newNode;
newNode -> previous = temp;
}
printf("\nInsertion
success!!!");
}
void
insertAfter(int value, int location)
{
struct Node *newNode;
newNode = (struct Node*)malloc(sizeof(struct
Node));
newNode -> data = value;
if(head == NULL)
{
newNode -> previous = newNode ->
next = NULL;
head = newNode;
}
else
{
struct Node *temp1 = head, temp2;
while(temp1 -> data != location)
{
if(temp1 -> next == NULL)
{
printf("Given node is not
found in the list!!!");
goto EndFunction;
}
else
{
temp1 = temp1 -> next;
}
}
temp2 = temp1 -> next;
temp1 -> next = newNode;
newNode -> previous = temp1;
newNode -> next = temp2;
temp2 -> previous = newNode;
printf("\nInsertion
success!!!");
}
EndFunction:
}
void
deleteBeginning()
{
if(head == NULL)
printf("List is Empty!!! Deletion
not possible!!!");
else
{
struct Node *temp = head;
if(temp -> previous == temp ->
next)
{
head = NULL;
free(temp);
}
else{
head = temp -> next;
head -> previous = NULL;
free(temp);
}
printf("\nDeletion
success!!!");
}
}
void
deleteEnd()
{
if(head == NULL)
printf("List is Empty!!! Deletion
not possible!!!");
else
{
struct Node *temp = head;
if(temp -> previous == temp ->
next)
{
head = NULL;
free(temp);
}
else{
while(temp -> next != NULL)
temp = temp -> next;
temp -> previous -> next = NULL;
free(temp);
}
printf("\nDeletion
success!!!");
}
}
void
deleteSpecific(int delValue)
{
if(head == NULL)
printf("List is Empty!!! Deletion
not possible!!!");
else
{
struct Node *temp = head;
while(temp -> data != delValue)
{
if(temp -> next == NULL)
{
printf("\nGiven node is not
found in the list!!!");
goto FuctionEnd;
}
else
{
temp = temp -> next;
}
}
if(temp == head)
{
head = NULL;
free(temp);
}
else
{
temp -> previous -> next = temp
-> next;
free(temp);
}
printf("\nDeletion
success!!!");
}
FuctionEnd:
}
void
display()
{
if(head == NULL)
printf("\nList is Empty!!!");
else
{
struct Node *temp = head;
printf("\nList elements are:
\n");
printf("NULL <--- ");
while(temp -> next != NULL)
{
printf("%d <===>
",temp -> data);
}
printf("%d ---> NULL", temp
-> data);
}
}
Insertion
Insertion untuk code tersebut dapat dilakukan dengan 3 cara:
1.
Insert depan
2.
Insert Akhir
3.
Insert di lokasi yang spesifik
Insert Depan
1.
Buat newNode dengan value yang diinginkan dan
newNode->previous sebagai NULL
2.
Cek apakah daftar kosong/Head==NULL
3.
Jika kosong, maka assign Null ke
newNode->next dan newNode ke Head
4.
Jika tidak kosong, maka assign Head ke
newNode->next dan newNode ke Head
Insert Akhir
1.
Buat newNode dengan value yang diinginkan dan
newNode->previous sebagai NULL
2.
Cek apakah daftar kosong/Head==NULL
3.
Jika kosong, maka assign Null ke
newNode->next dan newNode ke Head
4.
Jika tidak kosong, maka bentuk pointer node temp
dan inisialisasi dengan Head
5.
Temp akan bergeser terus sampai ke node terakhir
pada daftar/temp->next == NULL
6.
Assign newNode ke temp->next dan temp ke
newNode->previous
Insert di lokasi yang spesifik
1.
Buat newNode dengan value yang diisi
2.
Cek apakah daftar kosong
3.
Jika kosong, maka assign NULL ke
newNode->previous dan newNode->next dan set newNode ke Head
4.
Jika tidak kosong, maka bentuk pointer node temp1
dan temp2 dan inisialisasi temp1 dengan Head
5.
temp1 akan tetap bergeser sampai lnode yang akan
diisi dengan newNode
6.
temp1 akan selalu cek apakah temp1 sampai ke
node terakhir. Jika sampai ke node terakhir. Maka cetak 'Given node is not
found in the list!!! Insertion not possible!!!' dan function selesai. Jika
tidak, maka temp1 akan lanjut bergeser
7.
Assign temp1 → next ke temp2, newNode ke temp1 → next, temp1 ke newNode →
previous, temp2 ke newNode →
next dan newNode ke temp2 →
previous.
Deletion
Deletion
dalam code tersebut dapat dilakukan dengann 3 cara:
1.
Delete dari depan
2.
Delete dari terakhir
3.
Delete di lokasi yang spesifik
Delete depan
1.
Cek apakah daftar tersebut kosong/Head == NULL
2.
Jika kosong, maka munculkan 'List is Empty!!!
Deletion is not possible' dan function selesai
3.
Jika tidak kosong, maka bentuk pointer node temp
dan inisialisasi dengan Head
4.
Cek apakah daftar hanya berisi 1 node
(temp->previous==temp->next)
5.
Jika True, maka set Head ke NULL dan hapus
temp(memenuhi kondisi empty)
6.
Jika False, maka assign temp->next ke Head,
NULL ke head->previous dan hapus temp
Delete Akhir
1.
Cek apakah daftar tersebut kosong/Head == NULL
2.
Jika kosong, maka munculkan 'List is Empty!!!
Deletion is not possible' dan function selesai
3.
Jika tidak kosong, maka bentuk pointer node temp
dan inisialisasi dengan Head
4.
Cek apakah daftar hanya berisi 1 node
(temp->previous==temp->next)
5.
Jika True, maka set Head ke NULL dan hapus
temp(memenuhi kondisi empty)
6.
Jika False, maka temp akan terus bergeser sampai
node terakhir/temp->next==NULL
7.
Assign NULL ke temp->previous->next dan
hapus temp
Delete di lokasi yang spesifik
1.
Cek apakah daftar tersebut kosong/Head == NULL
2.
Jika kosong, maka munculkan 'List is Empty!!!
Deletion is not possible' dan function selesai
3.
Jika tidak kosong, maka bentuk pointer node temp
dan inisialisasi dengan Head
4.
Temp akan terus bergeser sampai node yang ingin
dihapus atau node terakhir
5.
Jika sampai ke node terakhir, muncul 'Given node
not found in the list! Deletion not possible!!!' dan function selesai
6.
Jika sampai ke node yang ingin dihapus, cek
apakah daftar tersebut hanya berisi satu node
7.
Jika hanya berisi satu node dan node itu yang
ingin dihapus, maka set Head ke Null dan hapus temp (free(temp))
8.
Jika berisi banyak node, maka cek apakah temp
adalah node depan/temp==Head
9.
Jika temp adalah node depan, maka geser head ke
node selanjutnya (Head = Head →
next), set Head dari previous ke NULL (Head → previous = NULL) dan hapus temp
1 Jika temp bukan node depan, maka cek apakah temp
adalah node terakhir/temp->next==NULL
1 Jika temp adalah node terakhir, maka set temp
dari previous dari next ke NULL/ temp →
previous → next =
NULL, dan hapus temp (free(temp))
1 Jika temp bukan node depan dan terakhir, maka set
temp dari previous dari next ke temp dari next (temp → previous → next = temp → next), temp dari next dari previous ke
temp dari previous (temp →
next →
previous = temp →
previous) dan dhapus temp (free(temp)).
Display
Cara
menampilkan elemen yang ada dalam daftar tersebut adalah:
1.
Cek apakah daftar kosong/Head==NULL
2.
Jika kosong, maka munculkan 'List is Empty!!!'
dan function selesai
3.
Jika tidak kosong, maka membentuk pointer temp
dan dimulai dengan Head
4.
Munculkan 'NULL <--- '
5.
Munculkan temp->data dengan tanda
panah(<---->) sampai temp mencapai node terakhir
6.
Munculkan, temp -> data dengan panah menunjuk
ke NULL (temp → data
---> NULL)
Komentar
Posting Komentar