Anda di halaman 1dari 7

KEGIATAN PRAKTIKUM 5

REKURSI
Impelementasikan kode program berikut:

// Recursive CPP program to recursively insert


// a node and recursively print the list.
// Source: geeksforgeeks.com
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node* next;
};

// Allocates a new node with given data


Node *newNode(int data)
{
Node *new_node = new Node;
new_node->data = data;
new_node->next = NULL;
return new_node;
}

// Function to insert a new node at the


// end of linked list using recursion.
Node* insertEnd(Node* head, int data)
{
// If linked list is empty, create a
// new node (Assuming newNode() allocates
// a new node with given data)
if (head == NULL)
return newNode(data);

// If we have not reached end, keep traversing


// recursively.
else
head->next = insertEnd(head->next, data);
return head;
}

void traverse(Node* head)


{
if (head == NULL)
return;

// If head is not NULL, print current node


// and recur for remaining list
cout << head->data << " ";

traverse(head->next);
}

// Driver code
int main()
{
Node* head = NULL;
head = insertEnd(head, 6);
head = insertEnd(head, 8);
head = insertEnd(head, 10);
head = insertEnd(head, 12);
head = insertEnd(head, 14);
traverse(head);
}
Bentuklah kelompok yang beranggotakan maksimal 3 orang, lalu kerjakan tugas-tugas berikut!

1. Lakukan penelusuran terhadap eksekusi statement: head = insertEnd(head, 14). Tuliskan hasil
penelusuran tersebut dengan detail.

Dengan menggunakan teknik modifikasi sedikit , maka akan menghasilkan output seperti berikut

insertEnd(head,6)
6
insertEnd(head,8)
6 8
insertEnd(head,10)
6 8 10
insertEnd(head,12)
6 8 10 12
insertEnd(head,14)
6 8 10 12 14
6 8 10 12 14
hasil tranverse diatas

Dikarenakan pada fungsi insertEnd adalah rekursif , maka hasil tersebut yang terpakai adalah yang diatas
sebagai acuannya (yang lainnya adalah rekursif dari bawahnya). Disana lihatlah ada perubahan antara
perintah setelah insertEnd(head,14) dan bandingkan dengan InsertEnd(head,12)
disitu ada pertambahan di nodenya

insertEnd(head,12)
6 8 10 12
insertEnd(head,14)
6 8 10 12 14

Node* insertEnd(Node* head, int data){


if(head == NULL){
return newNode(data);
}
else{
head->next = insertEnd(head->next, data);
}
return head;
}

1. Cek jika node itu NULL


2a jika.benar , buat node baru
2b.Jika tidak benar , panggil fungsi dengan parameter node sebelahnya
(jump to 1).
3.kembalikan nilai node yang paling awal.
2. Lakukan penelusuran terhadap eksekusi statement: traverse(head). Tuliskan hasil penelusuran tersebut
dengan detail.

void traverse(Node* head){


if(head == NULL) return;
cout<< head->data <<” ”;
traverse(head->next);
}

1. Cek jika node itu NULL


2a. jika benar maka keluar dari fungsi
3. tuliskan data node
4. panggil fungsi sendiri dengan node berikutnya

3. Implementasikan fungsi rekursif untuk menambahkan data pada linked list setelah nilai (key) tertentu. Jika
nilai (key) tersebut tidak ditemukan, maka data ditambahkan di akhir linked list. Tuliskan hasil implementasi
Anda. Bentuk fungsi tersebut adalah:

void insertAfterKey(Node* p, int key, int data){


Node* masukkan = new Node;
if(p->data == key){
if(p->next==NULL){
masukkan->next=NULL;
masukkan->data=data;
}
else{
masukkan->data=data;
masukkan->next=p->next;
p->next=masukkan;
}
}
else{
if(p->next==NULL){
masukkan->data = data;
masukkan->next = NULL;
p->next = masukkan;
}
else{
insertAfterKey(p->next,key,data);
}
}
}

4. Implementasikan fungsi rekursif untuk menghapus suatu node dengan nilai tertentu pada linked list. Tuliskan
hasil implementasi Anda. Bentuk fungsi tersebut adalah:

void deleteKey(Node* prev, Node* p, int key)


{
//prev digunakan untuk menunjuk ke node sebelum node yang akan dihapus
//p digunakan untuk menunjuk ke node yang akan dihapus
....
}
void deleteKey(Node* prev,Node* p, int key){
Node *masukan=new Node;
if(p->data==key){
masukan->data = p->data;
masukan->next = p->next;
p->data = p->next->data;
p->next = p->next->next;
free(masukan);
deleteKey(prev->next,p,key);
return;
}
if(prev->next!=NULL){
if(prev->next->data == key){
masukan->data = prev->next->data;
masukan->next = prev->next;
prev->next = prev->next->next;
free(masukan);
}
else{
deleteKey(prev->next,p,key);
}
}
else return;
}

5. Lakukan pengujian terhadap fungsi-fungsi yang telah diimplementasikan dengan fungsi main() berikut, lalu
tuliskan hasil jalannya program.

int main()
{
Node* head = NULL;
head = insertEnd(head, 6);
head = insertEnd(head, 8);
head = insertEnd(head, 10);
head = insertEnd(head, 12);
head = insertEnd(head, 14);
traverse(head);
insertAfterKey(head, 12, 13);
insertAfterKey(head, 8, 9);
insertAfterKey(head, 15, 16);
cout << "\n";
traverse(head);
cout << "\n";
deleteKey(head, head, 12);
traverse(head);
return 0;
}
outputnya

6 8 10 12 14
6 8 9 10 12 13 14 16
6 8 9 10 13 14 16

6. Lakukan penelusuran terhadap statement insertAfterKey(head, 8, 9) dan deleteKey(head,


head, 12), lalu tuliskan hasil penelusuran Anda.

dengan memodifikasinya maka



sebelum tanda insertAfterKey(head,8,9);
6 8 10 12 13 14
sesudah tanda insertAfterKey(head,8,9)
6 8 9 10 12 13 14

sebelum tanda deleteKey(head,head,12);


6 8 9 10 12 13 14 16
sesudah tanda deleteKey(head,head,12);
6 8 9 10 13 14 16

Lihat saja pada kasus insert after key. Disitu ada pertambahan nilai yakni 9 setelah bernilai 8. Algoritmanya
yakni dengan

void insertAfterKey(Node* p, int key, int data){


Node* masukkan = new Node;
if(p->data == key){
if(p->next==NULL){
masukkan->next=NULL;
masukkan->data=data;
}
else{
masukkan->data=data;
masukkan->next=p->next;
p->next=masukkan;
}
}
else{
if(p->next==NULL){
masukkan->data = data;
masukkan->next = NULL;
p->next = masukkan;
}
else{
insertAfterKey(p->next,key,data);
}
}
}
void insertAfterKey(Node* p, int key, int data){
Node* masukkan = new Node;
if(p->data == key){
if(p->next==NULL){
masukkan->next=NULL;
masukkan->data=data;
}
else{
masukkan->data=data;
masukkan->next=p->next;
p->next=masukkan;
}
}
else{
if(p->next==NULL){
masukkan->data = data;
masukkan->next = NULL;
p->next = masukkan;
}
else{
insertAfterKey(p->next,key,data);
}
}
}

1.cek jika data awal adalah key


2a.cek jika ujungnya kosong
3a.a.isi aja ujungnya
3a.b masukan saja ujungnya
2b.cek jika ujung kosong
3b.a isi aja
3b.b fungsi rekursif dengan parameter sebelah dari node
7. Tuliskan jawaban Anda pada fail dengan nama: Nama Kelompok_laporan_Praktikum_5.pdf. Kumpulkan
melalui newlms selambatnya tanggal 12 Maret 2021, Pukul 23:59

Anda mungkin juga menyukai