Single Linked List - Menghapus dan Menambah Data di Tengah
By
Rachmat Santoso
—
Kamis, 16 Juni 2016
—
Struktur Data
Contoh Program Single Linked List - Menghapus dan Menambah Data di Tengah |
Berikut adalah jawaban komentar pada post Single Linked List pada C++ tentang penghapusan dan penambahan node di tengah.
//SINGLE LINKED LIST NON CIRCULAR + PENGHAPUSAN NODE DI TENGAH
//IDE VS12 Express
//by [RS]
#include <iostream>
#include <conio.h>
#include <iomanip> //setw()
using namespace std;
struct node
{
int data;
node* next; // untuk menghubungkan dengan node lain, tipe data dibuat
sama seperi aturan penggunaan pointer.
};
node* head;
node* tail;
node* curr;
node* curr2;
node* curr3;
node* curr4;
node* entry;
node* del;
node* simpan_pos1;
node* simpan_pos2;
node* simpan_pos3;
void inisialisasi()
{
head = NULL;
tail = NULL;
}
void input(int dt)
{
entry = (node* )malloc(sizeof(node)); //alokasi memori
entry->data = dt;
entry->next = NULL;
if(head==NULL)
{
head = entry;
tail = head;
}
else
{
tail->next = entry;
tail = entry;
}
}
void hapus()
{
int simpan;
if(head==NULL)
{
cout<<"\nlinked list kosong, penghapusan tidak bisa
dilakukan"<<endl;
}
else
{
simpan = head ->data;
cout<<"\ndata yang dihapus adalah "<<simpan<<endl;
//hapus depan
del = head;
head = head->next;
delete del;
}
}
void cetak()
{
curr = head;
if(head == NULL)
cout<<"\ntidak ada data dalam linked list"<<endl;
else
{
cout<<"\nData yang ada dalam linked list adalah"<<endl;
cout<<setw(6);
while(curr!=NULL)
{
cout<<curr->data<<"->";
curr =
curr->next;
}
cout<<"NULL";
cout<<endl;
}
}
int hitung_node()
{
int jumlah = 0;
curr = head;
while(curr!=NULL)
{
jumlah++;
curr=curr->next;
}
return(jumlah);
}
void hapus_tengah()
{
float posisi_tengah;
posisi_tengah =
floor(hitung_node()/2); //'jumlah' dibagi 2, kemudian
dibulatkan ke bawah
int simpan, simpan2;
if(head==NULL)
{
cout<<"\nlinked list kosong, penghapusan tidak bisa
dilakukan"<<endl;
}
else
{
if(hitung_node()<=2){
hapus();
}
else if(hitung_node()==3){
curr2 = head;
simpan_pos1 =
curr2->next;
//menyambungkan node awal dengan node akhir
curr2->next =
curr2->next->next;
simpan2 =
simpan_pos1->data;
cout<<"\ndata yang dihapus adalah "<<simpan2<<endl;
simpan_pos1->next
= NULL;
delete simpan_pos1;
}
else if(hitung_node()>3)
{
curr3 = head;
//menempatkan pointer di posisi "sebelum" tengah
for(float i = 0;
i<posisi_tengah-1; i++){
curr3 =
curr3->next;
simpan_pos2
= curr3;
}
curr4 = head;
//menempatkan pointer di posisi tengah
for(float i = 0;
i<posisi_tengah; i++){
curr4 =
curr4->next;
simpan_pos3
= curr4;
}
simpan =
simpan_pos3->data;
cout<<"\ndata yang dihapus adalah "<<simpan<<endl;
//menyambungkan node sebelum 'node tengah' dengan node
sesudah 'node tengah'
simpan_pos2->next
= simpan_pos3->next;
//hapus node
simpan_pos3->next
= NULL; //memutus hubungan node sebelum dihapus
del =
simpan_pos3;
delete del;
}
}
}
void menu()
{
char pilih, ulang;
int data;
do
{
system("cls");
cout<<"SINGLE LINKED LIST NON CIRCULAR"<<endl;
cout<<"-------------------------------"<<endl;
cout<<"Menu : "<<endl;
cout<<"1. Input data"<<endl;
cout<<"2. Hapus data"<<endl;
cout<<"3. Cetak data"<<endl;
cout<<"4. Hapus tengah"<<endl;
cout<<"5. Exit"<<endl;
cout<<"Masukkan pilihan Anda : ";
cin>>pilih;
switch(pilih)
{
case '1' :
cout<<"\nMasukkan data : ";
cin>>data;
input(data);
break;
case '2' :
hapus();
break;
case '3' :
cetak();
break;
case '4' :
hapus_tengah();
break;
case '5' :
exit(0);
break;
default :
cout<<"\nPilih ulang"<<endl;
}
cout<<"\nKembali ke menu?(y/n)";
cin>>ulang;
}while(ulang=='y' || ulang=='Y');
}
int main()
{
inisialisasi();
menu();
return EXIT_SUCCESS;
}
Output
1. Sebelum dihapus
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak data
4. Hapus tengah
5. Exit
Masukkan pilihan Anda : 3
Data yang ada dalam linked list adalah
1->2->3->4->5->NULL
Kembali ke menu?(y/n)
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak data
4. Hapus tengah
5. Exit
Masukkan pilihan Anda : 4
data yang dihapus adalah 3
Kembali ke menu?(y/n)
3. Setelah dihapus
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak data
4. Hapus tengah
5. Exit
Masukkan pilihan Anda : 3
Data yang ada dalam linked list adalah
1->2->4->5->NULL
Kembali ke menu?(y/n)
Untuk penambahan node di
tengah caranya hampir sama dengan penghapusan, yaitu mengarahkan ke posisi node
tengah terlebih dahulu. Setelah berada di posisi node tengah, kemudian sisipkan
node tambahan tersebut. Lihat kembali gambar ilustrasi pada post Single Linked List pada C++ untuk mempermudah
pemahaman penghapusan dan penambahan node.
[RS]
Klik Like & Share jika postingan ini bermanfaat
Apa tanggapan Anda?
Berikan tanggapan Anda melalui kolom komentar yang telah disediakan.
- Gunakan bahasa yang sopan;
- Saat menjadikan postingan pada blog ini sebagai referensi, jangan lupa mencantumkan sumbernya (link dari blog ini).
Jika blog ini bermanfaat jangan lupa memberikan 'like' atau 'share' untuk mendapatkan update terbaru.
Terima kasih