download

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