LINKED LIST TUJUAN UMUM Memahami konsep linked list TUJUAN KHUSUS Mempelajari prasarat linked list, pointer, sruct to pointer Linked list Insert, delete
LINKED LIST Variabel bertipe data pointer adalah variabel yang isinya alamat (address) dari variabel lainnya Contoh: int a, b; /* a dan b adalah variabel integer*/ int *pa, *pb; /* pa dan pb adalah variabel pointer*/ Saat ini isi dari pa dan pb belum ditentukan, dengan assigment berikut: pa = &a; pb = &b; Maka pa berisi alamat a dan pb berisi alamat b Bial alamat a = 400 dan b = 402, maka pa berisi 400 dan pb berisi 402 400 a 400 pa 402 b 402 pb Variabel a dan b dapa diisi secara tidak langsung (onderct assigment) memalui pa dan pb yaitu dengan : *pa = 30; *pb = 20 400 30 a 400 pa 402 20 b 402 pb
Lebih Jauh tentang Pointer Reference operator (&) int A; P = &A; P merupakan alamat dari variabel A andy = 25; fred = andy ted = &andy; Pertama kita memberikan nilai 25 pada variabel andy, dimana setiap variabel yang dideklarasikan selalu mempunyai alamat di memori dalam hal ini dimisalkan 1776 Kedua mengkopi isi dari variabel andy ke fred Ketiga mengkopi ke ted reference atau alamat dari variabel andy Dereference operator (*) Pointer dapat digunakan untuk mengisi nilai dari variabel yang ditunjuk *ted = 75 & is the reference operator and can be read as "address of" * is the dereference operator and can be read as "value pointed by"
Variabel pointer dapat dibuat atau diciptakan secara dinamis, yaitu mengalokasikan suatu tempat di memori ketika program sedang berjalan Dengan kemampuan seperti ini maka penggunaan variabel pointer tidak hanya sekedar indirect assigment seperti contoh di atas, melainkan dapat membuat suatu struktur data di mana banyak atau kurang sesuai dengan kebutukan Struktur tersebut di antaranya adalah Linked List Struktur Linked List Setiap elemen terdiri dari data dan pointer, bagian data akan berisi informasi, bagian pointer akan berisi alamat yang akan mengaitkan satu elemen dengan elemen lainnya DATA POINTER Elemen Oleh karena itu diperlukan deklarasi untuk pointer: Head, Current dan Struct node *Head, *, * Current; - Pointer Head selalu menunjuk ke node awal - Pointer selalu menunjuk ke node akhir - Pointer Current dapat bergerak dari node awal hingga node akhir
Pointer Current bergerak sesuai dengan arah anak panah Node yang sedang ditunjuk oleh current disebut node aktif Linked list dapat dibangun dengan cara: 1 Insert depan, node baru selalu berada di depan 2 Insert belakang, node baru selalu berada di belakang 3 Insert setelah posissi current pointer
// my first pointer #include <iostream> using namespace std; int main () int firstvalue, secondvalue; int * mypointer; mypointer = &firstvalue; *mypointer = 10; mypointer = &secondvalue; *mypointer = 20; cout<<"firstvalue is "<<firstvalue<<endl; cout<< "secondvalue is "<<secondvalue<< endl; return 0; // more pointers #include <iostream> using namespace std; int main () int firstvalue = 5, secondvalue = 15; int *p1, *p2; p1=&firstvalue; p2=&secondvalue; *p1= 10; *p2= *p1; p1 = p2; *p1 = 20; cout<<"firstvalue is"<<firstvalue<< endl; cout<<"secondvalue endl; return 0; is"<<secondvalue<<
// more pointers #include <iostream> using namespace std; int main () int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0; // pointer to functions #include <iostream> using namespace std; int addition (int a, int b) return (a+b); int subtraction (int a, int b) return (a-b); int (*minus)(int,int) = subtraction; int operation (int x, int y, int (*functocall)(int,int)) int g; g = (*functocall)(x,y); return (g); int main () int m,n; m = operation (7, 5, addition); n = operation (20, m, minus); cout <<n; return 0;
INSERT DEPAN struct node char data; struct node *next; ; struct node *head, *current, *tail; void create( ) head = current = NULL; void insert_depan(char data) Struct node *p;/*temporary node*/ p=(struct node*)malloc(sizeof(struct node)); p->data = data; p->next = head; head = current = p; void main( ) char c; create( ); do cout << Input Data (AZ): ; cin >> c; insert_depan(c); while(c!= ); )
Proses Insert Depan Create( ); HEAD CURR NULL NULL Insert( A ); p =(stuct node*)malloc(sizeof(struct node)); P p->data=data; p->next=head; P A P A NULL head= current=p; HEAD CURR P A NULL Insert( B ); p =(stuct node*)malloc(sizeof(struct node)); P p->data=data P B
p->next=head; head = current = p HEAD CURR P B A HEAD CURR P B A NULL NULL
INSERT BELAKANG struct node char data; struct node *next; ; struct node *head, *current, *tail; void create( ) head = current = tail = NULL; void insert_belakang(char data) Struct node *p;/*temporary node*/ p=(struct node*)malloc(sizeof(struct node)); p->data = data; p->next = NULL; if (head == NULL) head = current= tail = p; else tail->next = p; tail = p;; head = current = p; void main( ) char c; create( ); do cout << Input Data (AZ): ; cin >> c; insert_belakang(c); while(c!= );
Proses Insert Belakang Insert( A ); p =(stuct node*)malloc(sizeof(struct node)); P p->data=data; p->next=null; P A P A NULL if (head == NULL) head = current = tail = p; else tail->next = p;tail = p;; HEAD CURR P A NULL Insert( B ); p =(stuct node*)malloc(sizeof(struct node)); P p->data=data; p->next=null; P B P B NULL
if (head == NULL) head = current = tail = p; else tail->next = p;tail = p;; HEAD CURR P HEAD CURR P A B NULL A B NULL
Operasi pada Linked List 1 Create( ) Menciptakakn linked list baru dalam keadaan kosong 2 Insert(elemen_type e) Menambahkan satu elemen ke dalama linked list di bagian depan *) 3 Empty( ) Memeriksa apakah linked list dalam keadaan kosong 4 Retrieve(elemen_type *e) Membaca informasi dari node yang sedang ditunjuk oleh current pointer ke variabel e 5 Update(elemen_type e) Mengubah informasi dari node yang sedang ditunjuk oleh currentpointer dengan data dari variabel e 6 Find_First( ) Memindahkan current pointer node awal 7 Find Next(fail) Memindahkan current pointer node berikutnya, bila node berikutnya adalah node terakhi, maka operasi ini tidak berfungsi 8 Delete( ) Menghapus node yang ditunjuk oleh current pointer, kemudian current pointer direset ke posisi awal 9 Clear( ) Menghapus seluruh node
Implementasi operasi Delete void delete() struct node *p; if (current == head) head =head ->next; else p=head; while (p->next!=current) p=p->next; p=->current->next; ; Free(current); Current = head;
PROSES DELETE 1 Posisi Current = Head HEAD CURR A B C D E NULL head = head->next; CURR HEAD A B C D E NULL free(current); CURR HEAD B C D E NULL current = head; HEAD CURR B C D E NULL
2 Posisi Current Head HEAD CURR A B C D E NULL p =head; while (p->next!= current) p = p->next; HEAD P P P CURR A B C D E NULL p ->next = current->next; HEAD P CURR A B C D E NULL free(current); HEAD P CURR A B C E NULL
current = head; HEAD CURR A B C E NULL Latihan: 1 Buat modul untuk melakukan operasi: Insert (after current), Find_First, Find_Next, Update, Retrieve, Delete, Empty, dan Clear
Empty void empty() if (head = NULL) ;return 0; return (1); Find First Void findfirst() current = head; Find Next void findnext() if (current->next!=null) current = current->next; Retrieve void retrieve(e) e = current->isi; Update void update(e) current->isi = e; Delete Current void delete() int *x; if (current!= head) x = head; while (x->next!= current) x= x->next; x->next =curent->next; else head = head->next; free(current); current = head;
Clear void clear(); while (head!=null) current = head; head = head ->next; free(current);
Double Linked List Struktur double linked list mempunyai bentuk umum: Head Current Next NULL Data NULL Prev Deklarasi untuk Node: struct node int data; struct node *next; struct node *prev; ; Double linked list dapat dibangun dengan 2 cara: 1 Insert Before; node baru berada sebelum posisi current pointer 2 Insert After; node baru berada setelah posisi current pointer
Implementasi Circular Double Linked list struct node int data; struct node *next; struct node *prev; ; struct node *head, *current; int n; /*jumlah node*/ void create( ) head = current = NULL; n=0; void insert_after(int data) struct node *p; /*temporary node*/ p =(struct node*)malloc(sizeof(struct node)); p->data=data; if(head==null) head = p; p->next = p; p->prev=p; else current->next->prev = p; p->next =current->next; p->prev=current; current->next=p; current=p; n++;
void insert_before(int data) if head == NULL) current =current->prev; insert_after(data); if (current->next == head) head = current; void delete( ) struct node *p; p=current; current->prev->next=current->next; current->next->prev=current->prev; current=current->next; if (n==1) head= NULL; elseif (head=p) head=current; n--;free(p); void find_next( ); current=current->next; void find_prev( ) current=current->prev;