T0616 ALGORITMA DAN PEMROGRAMAN (24-25) SUBANDIJO UNIVERSITAS BINA NUSANTARA FAKULTAS ILMU KOMPUTER JAKARTA, 2005 7/11/2017 T0616 - Algoritma dan Pemrograman 1 SELF REFERENTIAL STRUCTURE • • • • • • • DEFINISI STACK VS HEAP MEMORI. ALOKASI DAN DEALOKASI MEMORI HEAP LINKED LIST DESAIN NODE ALOKASI NODE OPERASI-OPERASI 7/11/2017 T0616 - Algoritma dan Pemrograman 2 DEFINISI • SELF REFERENTIAL STRUCTURE: TIPE STRUKTUR YANG MEMUAT ANGGOTA YANG MENUNJUK TIPE STRUKTUR YANG SETIPE DENGAN INDUKNYA D MANA IA BERADA. STRUCT TAG { MEMBER 1; MEMBER 2; … STRUCT TAF *NAME; } • APLIKASI: LINKED-LIST, TREE, GRAPH. 7/11/2017 T0616 - Algoritma dan Pemrograman 3 STACK VS HEAP MEMORI • PROGRAM MENGGUNAKAN MEMORI STACK SAAT FUNGSI DIPANGGIL DAN DIBEBASKAN SAAT FUNGSI SELESAI DIEKSEKUSI. ALOKASI DAN DEALOKASI SECARA OTOMATIS SEHINGGA BERSIFAT STATIS. • ALOKASI DAN DEALOKASI MEMORI HEAP DITENTUKAN OLEH PEMROGRAM SEHINGGA BERSIFAT DINAMIS. 7/11/2017 T0616 - Algoritma dan Pemrograman 4 ALOKASI DAN DEALOKASI HEAP MEMORI • ALOKASI MENGGUNAKAN FUNGSI MALLOC(): • VOID *MALLOC(SIZE_T SIZE); • FUNGSI INI MENGEMBALIKAN POINTER GENERIK SEHINGGA HARUS DI TYPE CAST SEBELUM DIBERIKAN KEPADA VARIABEL POINTER YANG DIALOKASIKAN. • DEALOKASI MENGGUNAKAN FUNGSI FREE() 7/11/2017 T0616 - Algoritma dan Pemrograman 5 LINKED LIST VARIAN LINKED LIST • • • • 7/11/2017 SINGLY LINGKED LIST CIRCULAR SINGLY LINKED LIST DOUBLY LINKED LIST CIRCULAR DOUBLY LINKED LIST T0616 - Algoritma dan Pemrograman 6 SINGLY LINKED LIST • LNKED LIST ADALAH STRUKTUR DATA DINAMIS YANG TERDIRI DARI SEJUMLAH RECORDS DISEBUT NODE, UNTUK MENAMPUNG DATA DAN DIHUBUNGKAN SATU SAMA LAIN MENGGUNAKAN POINTER. • NODE PERTAMA DISEBUT HEAD DAN DIGUNAKAN SEBAGAI IDENTIFIER LIST. 7/11/2017 T0616 - Algoritma dan Pemrograman 7 DESAIN NODE • BENTUK STRUCT UNTUK MEMAKETKAN DATA typedef struct node { int data; // data portion to store information struct node *next; // pointer ("link") to the next node } node_t; • VARIABEL DIDEKLARASIKAN SBB: • • • • 7/11/2017 node_t node_Rec; node_t *head; typedef node_t *node_ptr; node_ptr head; T0616 - Algoritma dan Pemrograman 8 DESAIN NODE • REPRESENTASI NODE TUNGGAL 7/11/2017 T0616 - Algoritma dan Pemrograman 9 ALOKASI NODE • SAAT DATA BARU AKAN DISISIPKAN NODE BARU PERLU DIBENTUK MENGGUNAKAN FUNGSI MALLOC() SBB: • newPtr newPtr = (node_t *) malloc(sizeof(node_t)); = (node_t*)malloc(sizeof(node_t)); • FUNGSI UNTUK MENGKAPSULKAN SEMUA FUNGSIONALITAS ALOKASI NODE ADALAH SBB: node_t * Allocate() { node_t *newNode; newNode = (node_t *) malloc(sizeof(node_t)); 7/11/2017 T0616 - Algoritma dan Pemrograman 10 ALOKASI NODE if(newNode == NULL) prinf(“ERROR”); else newNode -> next = NULL.; newPtr = (node_t*)malloc(sizeof(node_t)); return newNode; } • APLIKASI FUNGSI ADALAH SBB: • node_t *myNode; • myNode = Allocate(); 7/11/2017 T0616 - Algoritma dan Pemrograman 11 OPERASI-OPERASI • OPERASI-OPERASI PADA LINKED-LIST • • • • • 7/11/2017 INISIALISASI INSERT NODE - UNSORTED LINKED LIST TRAVERSAL SEARCH NODE DELETE NODE T0616 - Algoritma dan Pemrograman 12 INISIALISASI • ISI HEAD DENGAN NULL. void Initialize(node_t **ptr) { *ptr = NULL; } • MENGGUNAKAN DEFINISI HEAD DI DEPAN, FUNGSI DAPAT DIPANGGIL SBB: • Initialize(&head); 7/11/2017 T0616 - Algoritma dan Pemrograman 13 INSERT NODE • INSERT NODE BARU DI DEPAN void InsertFront (node_t **head, node_t newRecord) { node_t* newNode; //pointer ke new node newNode Allocate(); if (newNode == NULL) { printf(“ERROR”); return; } newNode -> data = newRecord.id; newNode -> next + *head; *head = newNode; } 7/11/2017 T0616 - Algoritma dan Pemrograman 14 INSERT NODE 7/11/2017 T0616 - Algoritma dan Pemrograman 15 LINKED LIST TRAVERSAL • FUNGSI DisplayList() UNTUK MENAMPILKAN ISI NODE. void DisplayList(node_t *head) { node_t *current; current = head; while (current != NULL) { printf(“Data = %d\n”, current->data); current = current -> next; } 7/11/2017 T0616 - Algoritma dan Pemrograman 16 TRAVERSAL NODE 7/11/2017 T0616 - Algoritma dan Pemrograman 17 SEARCH NODE • MIRIP TRAVERSAL KECUALI ADANYA TUGAS TAMBAHAN YAITU MEMBANDINGKAN DATA DI NODE DENGAN DATA “KEY”. node_t *Find(node_t *head, node_t keyRecord) { node_t *current: bool found; current = head; found = false; while ((current != NULL) && (!found)) { if(current->data == keyRecord.data) found = true; else current = current -> next; } return current; } 7/11/2017 T0616 - Algoritma dan Pemrograman 18 SEARCH NODE 7/11/2017 T0616 - Algoritma dan Pemrograman 19 DELETE NODE • ALGORITMA DELETE NODE DI DALAM LIST • MENGGUNAKAN find() TANDAI NODE YANG AKAN DIHAPUS DENGAN current POINTER. • CARI NODE SEBELUMNYA, TANDAI SEBAGAI previous. • BYPASS LINK KE current NODE DENGAN MENGUBAH previous NODE LINK KE current NODE LINK. current NODE DI SKIP DARI RANGKAIAN. • FREE MEMORI YANG DIGUNAKAN OLEH POINTER current. 7/11/2017 T0616 - Algoritma dan Pemrograman 20 DELETE NODE • ALGORITMA DELETE NODE DI HEAD • SET current KE head NODE. • PINDAHKAN head POINTER KE NODE BERIKUTNYA. • FREE current NODE POINTER. 7/11/2017 T0616 - Algoritma dan Pemrograman 21 DELETE NODE void DeleteNode(node_t **head, node_t keyRecord) { node_t *delNode; // node to delete node_t *previous; // node before the deleted node delNode = Find(*head, keyRecord); // find our node to delete if (delNode == NULL) { printf("Record not found.\n"); return; } if (delNode == *head) { *head = delNode->next; free((void*)delNode); } 7/11/2017 T0616 - Algoritma dan Pemrograman 22 DELETE NODE else { previous = *head; while (previous->next != delNode) { previous = previous->next; } previous->next = delNode->next; if (delNode != NULL) { free((void*)delNode); // free the memory delNode = NULL; } } } 7/11/2017 T0616 - Algoritma dan Pemrograman 23 DELETE NODE 7/11/2017 T0616 - Algoritma dan Pemrograman 24 DELETE NODE 7/11/2017 T0616 - Algoritma dan Pemrograman 25 THE END “...ALL YOU NEED IS LOVE…” 7/11/2017 T0616 - Algoritma dan Pemrograman 26
© Copyright 2024 Paperzz