Anda di halaman 1dari 11

LINKED LIST 2

Double Linked List (DBL)


DBL dibentuk dengan menyusun sejumlah elemen sehingga pointer next menunjuk ke elemen
yang mengikutinya dan pointer back menunjuk ke elemen yang mendahuluinya. Gambar
berikut menunjukkan ilustrasi sebuah simpul dalam DBL. Info adalah data yang digunakan
dalam simpul, back adalah pointer yang menunjuk pada simpul sebelumnya dan next adalah
pointer yang menunjuk pada simpul sesudahnya.

Deklarasi Simpul
Cara mendeklarasikan sebuah simpul dalam double linked list adalah sebagai berikut :
Struct DoubleLinkNode
{
Int bil;
Struct DoubleLinkNode *back
Struct DoubleLinkNode *next
};
Struct DoubleLinkNodeRec *Node

Contoh program Double Linked List


#include<stdio.h>
#include<stdlib.h>

//mendefinisikan struktur untuk membentuk suatu DBL


struct node {
struct node *prev;
int data;
struct node *next;
};
//mendefinisikan fungsi untuk menambahkan elemen pada bagian awal
//dari linked list
void TambahDiAwal(struct node **s, int nilai){
struct node *temp;
//membuat struktur node baru
temp = (struct node*)malloc(sizeof(struct node));
//memasukkannya kedalam elemen pertama
temp->prev=NULL;
temp->data=nilai;
temp->next=*s;
(*s)->prev=temp;
*s=temp;
}

//mendefinisikan fungsi untuk menambahkan elemen pada bagian akhir dari linked list
void TambahDiAkhir(struct node **s, int nilai){
struct node *temp, *bantu;

if (*s !=NULL) {
bantu = *s;

//mendapatkan elemen paling akhir sebelum linked list ditambah elemen baru
while (bantu->next !=NULL) {
bantu = bantu->next;
}

//memasukkan elemen ke bagian akhir linked list


temp = (struct node*) malloc (sizeof(struct node));
temp->prev = bantu;
temp->data = nilai;
temp->next = NULL;

//pointer next dari elemen akhir menunjuk ke alamat dari elemen baru
bantu->next = temp;
} else {
*s = (struct node *)malloc(sizeof(struct node));
(*s)->prev = NULL;
(*s)->data = nilai;
(*s)->next = NULL;
}
}

//mendefinisikan fungsi untuk menampikan nilai yang terdapat pada linked list
void TampilkanNilai (struct node *s){
while (s !=NULL) {
printf("%d\n",s->data);
s = s->next;
}
}

//fungsi utama
int main (void){
struct node *ptr;

ptr = NULL; //mula-mula linked list dalam keadaan kosong

//menambahkan elemen ke dalam linked list


TambahDiAkhir (&ptr, 10);
TambahDiAkhir (&ptr, 20);
TambahDiAkhir (&ptr, 30);
//menampilkan nilai yang terdapat dalam linked list
printf("Keadaan semula :\n");
TampilkanNilai(ptr);

//memasukkan elemen ke awal rangkaian


TambahDiAwal(&ptr, 300);

//menampilkan kembali nilai-nilai yang ada dalam linked list


printf("\nSetelah ditambah nilai di awal :\n");
TampilkanNilai(ptr);
return 0;
}

Hasil Keluaran

Latihan :
Buatlah double linked list yang mencetak angka forward/maju dan kebalikannya/reverse
dengan hasil output sebagai berikut :
Circular Linked List
Circular linked list adalah list yang jika ditelusuri maka nantinya akan kembali ke simpul
pertama dan tidak berhenti pada simpul akhir. Kelebihan linked list ini adalah setiap simpul
dari list ini dapat dicapai dari sembarang simpul yang lain.
Circular linked list dapat diilustrasikan sebagai berikut :

Berikut adalah contoh program dari circluar linked list.


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct node{
int data;
struct node *next;
};

typedef struct node node;


node *pList = NULL;
node *alokasiNodeBaru(){
node *pNew = NULL;
pNew = (node *) malloc(sizeof(node));
return(pNew);
}

void tambahAwal(node *pNew){


node *temp;
if(pList == NULL){
pNew->next = pNew;
pList = pNew;
}
else{
//cari node yang menunjuk ke pList
temp = pList;
while(temp->next != pList){
temp = temp->next;
}

temp->next = pNew;
pNew->next = pList;
pList = pNew;
}
}

void cetak(){
node *pWalker = pList;
node *pNext = NULL;
while(pNext != pList){
printf("pWalker = %d, ", pWalker->data);
pNext = pWalker->next;
pWalker = pNext;
printf("pWalker->next = %d \n", pWalker->data);
}

void tambahTengah(node *pNew){


node *pWalker;
pWalker=pList;
int nilai,sisip;
printf("masukkan nilai yang ingin ditambahkan: "); scanf("%d",&nilai);
pNew->data = nilai;
cetak();
printf("data disisipkan setelah nilai : "); scanf("%d",&sisip);
while(pWalker->next!=pList && pWalker->data!=sisip){
pWalker=pWalker->next; }

if(pWalker->next==pList) printf("\ndata tidak ditemukan");


else {pNew->next=pWalker->next;
pWalker->next=pNew; }
cetak();
}

void tambahAkhir(node *pNew){


node *pPre;
pPre=pList;
int nilai;
printf("masukkan nilai yang ingin ditambahkan: "); scanf("%d",&nilai);
pNew->data = nilai;
while(pPre->next!=pList){
pPre=pPre->next; }
pNew->next=pList;
pPre->next=pNew;
}

void hapusAwal(){
node *pEnd, *pHapus;
pEnd=pList;
pHapus=pList;
while(pEnd->next!=pList){
pEnd=pEnd->next;}
pEnd->next=pHapus->next;
pList=pList->next;
free(pHapus);
}

void hapusTengah(){
node *pCari,*pPre;int hapus;
pPre=pList;
pCari=pList;
cetak();
printf("masukkan bilangan yang ingin dihapus: "); scanf("%d",&hapus);
while(pCari->data!=hapus){
pCari=pCari->next; }
while(pPre->next!=pCari){
pPre=pPre->next;}
pPre->next=pCari->next;
free(pCari);
}

void hapusAkhir(){
node *pEnd,*pPre;
pEnd=pList;
pPre=pList;
while(pEnd->next!=pList){
pEnd=pEnd->next;}
while(pPre->next!=pEnd){
pPre=pPre->next;}
pPre->next=pList;
free(pEnd);
}

int main(int argc, char *argv[])


{
node *pNew; int pilih,bil;
do{system("cls");
printf("----------MENU-----------");
printf("\n1.tambah awal");
printf("\n2.tambah tengah");
printf("\n3.tambah akhir");
printf("\n4.hapus awal ");
printf("\n5.hapus tengah");
printf("\n6.hapus akhir");
printf("\n7.cetak");
printf("\n8.exit");
printf("\npilihan : ");scanf("%d",&pilih);
if(pilih==1){pNew=alokasiNodeBaru();
printf("masukkan bilangan: ");
scanf("%d",&bil);
pNew->data=bil;
tambahAwal(pNew);
}
else if(pilih==2){pNew=alokasiNodeBaru();
tambahTengah(pNew);
}
else if(pilih==3){pNew=alokasiNodeBaru();
tambahAkhir(pNew);
}
else if(pilih==4){hapusAwal();}
else if(pilih==5){hapusTengah();}
else if(pilih==6){hapusAkhir();}
else if(pilih==7){cetak();getch();}

}while(pilih!=8);
printf("\n");
system("PAUSE");
return 0;}

Hasil keluaran dari program


Note :
Typedef (type definition) digunakan dalam program ini sebagai keyword untuk menciptakan
alias atau nama lain. Typedef sering dijumpai dalam pendeklarasian tipe data struct.
Contohnya typedef struct nama nama.
Typedef memberikan nama lalin dari “struct nama” menjadi nama” sehingga ketika kita
mendeklarasikan sebuah tipe “struct nama” lebih di mudahkan dalam urusan penulisan.

Anda mungkin juga menyukai