Sabtu, 21 Juli 2012

Double Linked List

Elemen-elemen dihubungkan dengan dua pointer dalam satu elemen. Struktur ini menyebabkan list melintas baik ke depan maupun ke belakang.Masing-masing elemen pada double linked list terdiri dari tiga bagian, disamping

data dan pointer next, masing-masing elemen dilengkapi dengan pointer prev yang menunjuk ke elemen sebelumnya. Double linked list dibentuk dengan menyusun sejumlah elemen sehingga pointer next menunjuk ke elemen yang mengikutinya dan pointer prev menunjuk ke elemen yang mendahuluinya. Untuk menunjukkan head dari double linked list, maka pointer prev dari elemen pertama menunjuk NULL. Untuk menunjukkan tail dari double linked list tersebut, maka pointer next dari elemen terakhir menunjuk NULL. Susunan elemen yang dihubungkan dalam bentuk double linked list dapat dilihat pada Gambar di bawah ini
Untuk melintas kembali melalui double linked list, kita gunakan pointer prev dari elemen yang berurutan pada arah tail ke head. Double linked list mempunyai fleksibilitas
yang lebih tinggi daripada single linked list dalam perpindahan pada list. Bentuk ini sangat berguna ketika akan meletakkan suatu elemen pada list dan dapat memilih
dengan lebih bijaksana bagaimana memindahkannya. Sebagai contoh, salah satu fleksibilitas dari double linked list adalah dalam hal memindahkan elemen daripada
menggunakan single linked list.


Contoh Program Double Linked List :
#include <conio.h>
#include <stdio.h>
#include <alloc.h>


typedef struct node t_node;

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

t_node * create(int data);
void forwardprint(t_node * kepala);
void backwardprint(t_node * kepala);
t_node * tambahdepan(t_node * kepala,int data);
t_node * tambahbelakang(t_node * ekor,int data);
t_node * hapusdepan(t_node * kepala);
t_node * hapusbelakang(t_node * ekor);

void main(){
    t_node * kepala = NULL;
   kepala = create(5);

   t_node * ekor = create(6);

    kepala->next = ekor;
   ekor->prev = kepala;

   kepala = tambahdepan(kepala, 4);
   ekor = tambahbelakang(ekor,7);

   forwardprint(kepala);
   kepala = hapusdepan(kepala);
   ekor = hapusbelakang(ekor);
   forwardprint(kepala);

   getch();
}

t_node * create(int data){
     t_node * temp = (t_node*) malloc(sizeof(t_node*));
   temp->next = NULL;
   temp->prev = NULL;
   temp->data = data;
}

void forwardprint(t_node * kepala){
    while(kepala != NULL){
       printf("%d ",kepala->data);
      kepala = kepala->next;
   }
   printf("\n");
}

void backwardprint(t_node * ekor){
    while(ekor != NULL){
       printf("%d ",ekor->data);
      ekor = ekor->prev;
   }
   printf("\n");
}

t_node * tambahdepan(t_node * kepala,int data){
    t_node * baru = create(data);
   baru->next = kepala;
   kepala->prev = baru;
   return baru;
}

t_node * tambahbelakang(t_node * ekor,int data){
   t_node * baru = create(data);
   ekor->next = baru;
   baru->prev = ekor;
   return baru;
}

t_node * hapusdepan(t_node * kepala){
    t_node * temp = NULL;
   if( kepala != NULL){
        temp = kepala->next;
      free(kepala);
   }
   if( temp !=NULL){
      temp->prev = NULL;
   }
   return temp;
}

t_node * hapusbelakang(t_node * ekor){
    t_node * temp = NULL;
   if( ekor != NULL){
        temp = ekor->prev;
      free(ekor);
   }
   if( temp !=NULL){
      temp->next = NULL;
   }
   return temp;
}

Tidak ada komentar:

Posting Komentar