Tag Archive: Program C++


Untuk membuat stack menggunakan linked list

Coba tulis seperti ini :

#include<stdio.h>
#include<stdlib.h>

typedef int ItemType;
typedef struct simpul node;
struct simpul
{
	ItemType item;
	node *next;
};

struct Stack{
	node *TOS;
};

node *baru;

void awal()
{
	puts("===================================================");
	puts("=         PROGRAM STACK DENGAN LINKED LIST        =");
	puts("===================================================\n");
	puts("NRP   :  7411030828");
	puts("Nama  :  M.Faishal Imam Choiri\n");
}

void allocate_node(ItemType x)
{
	baru = (node *) malloc (sizeof(node));
	if(baru==NULL)
	{
		printf("Alokasi Gagal\n");
		exit(1);
	}
	else
	{
		baru->item=x;
		baru->next=NULL;
	}
}

void inisialisasi(Stack *s)
{
	s->TOS = NULL;
}

int kosong(Stack *s)
{
	return s->TOS==NULL;
}

void push(Stack *s)
{
	baru->next = s->TOS;
	s->TOS = baru;
}

ItemType pop(Stack *s)
{
	node *temp;
	if(kosong(s))
	{
		printf("Data Kosong\n");
		return ' ';
	}
	else
	{
		temp = s->TOS;
		s->TOS = s->TOS->next;
		return temp->item;
		free(temp);
		temp=NULL;
	}
}

void tampil(Stack *s)
{
	Stack bantu;
	bantu = *s;
	printf("\nData Simpul ==>  ");
	while(bantu.TOS!=NULL)
	{
		printf("%d ", bantu.TOS->item);
		bantu.TOS = bantu.TOS->next;
	}
	printf("\n\n");
}

void main()
{
	int pilih, data;
	char lagi='y';
	Stack ujung;

	inisialisasi(&ujung);
	while(lagi=='y')
	{
		system("CLS");
		awal();
		//tampil(&ujung);
		printf("Menu Pilihan : \n");
		printf("1. Push\n");
		printf("2. Pop\n");
		printf("3. Tampilkan Stack\n");
		printf("\nPilih No          : ");
		scanf("%d", &pilih);
		switch(pilih)
		{
		case 1:
			printf("Masukkan data     : ");
			scanf("%d", &data);
			allocate_node(data);
			push(&ujung);
			break;
		case 2:
			pop(&ujung);
			break;
		case 3:
			tampil(&ujung);
			break;
		}
		fflush(stdin);
		printf("Lagi (y/t) ? ");
		scanf("%c", &lagi);
	}
}

Untuk penjelasan akan saya jelaskan lain waktu.

Dan contoh programnya bisa di donwload DISINI

Mengubah INFIX menjadi POSTFIX menggunakan STACK pada Visual Studio C++

Untuk mengubah notasi infix menjadi postfix digunakan stack untuk menyimpan operator dengan beberapa aturan sebagai berikut

  1. Sediakan stack untuk menyimpan operator (tipe : char)
  2. Algoritma mengubah notasi infix menjadi postfix

[1].    Baca setiap karakter notasi infix dari awal [2].    Bila operand maka langsung dicetak [3].    Bila tanda ‘(‘ masukkan stack [4].    Bila tanda ‘)’ pop dan cetak semua isi stack sampai TOS = ‘(‘. Pop juga tanda ‘(‘ ini, tetapi tidak usah dicetak [5].    Bila operator : jika stack kosong atau derajad operator lebih tinggi dibanding derajad TOS, push operator ke dalam stack. Jika tidak, pop dan cetak; kemudian ulangi pembandingan dengan TOS. Kemudian di-push [6].    Jika akhir notasi infix telah tercapai, dan stack masih belum kosong, pop semua isi stack dan cetak hasilnya Contoh notasi infix : ( A + B ) / (( C – D ) * E ^ F) Ilustrasi pengubahan notasi infix di atas menjadi notasi postfix secara lengkap tersaji dalam tabel sebagai berikut:

Karakter dibaca Isi Tumpukan Karakter tercetak Hasil Notasi Postfix Yang Terbentuk
( (
A ( + A A
+ ( +
B B A B
) + A B +
/ /
( / (
( / ( (
C / ( ( C A B + C
/ ( ( –
D / ( ( – D A B + C D
) / ( A B + C D –
* / ( *
E / ( * E A B + C D – E
^ / ( * ^
F / ( * ^ F A B + C D – E F
) / ( * ^ A B + C D – E F ^
/ ( * A B + C D – E F ^ *
/
/ A B + C D – E F ^ */

Dari ilustrasi di atas, bisa kita lihat bahwa notasi postfix dari ungkapan: ( A + B ) / (( C – D ) * E ^ F) adalah A B + C D – E F ^ */ Untuk Contoh Programnya bisa DOWNLOAD DISINI

Membuat Program SINGLE LINKED LIST dengan statement untuk fungsi sisip sebelum simpul, sisip setelah simpul dan hapus tengah dengan ketentuan sebagai berikut :

  • Untuk fungsi sisip sebelum simpul, jika data harus disisip di awal list maka akan mengubah posisi head. Demikian juga jika simpul tertentu yang dimaksud tidak ada maka ada pesan simpul baru tidak dapat disisipkan.  Selain kondisi tersebut, lakukan sisip di tengah.
  • Untuk fungsi sisip setelah simpul, jika simpul tertentu yang dimaksud tidak ada maka ada pesan simpul baru tidak dapat disisipkan.  Selain kondisi tersebut, lakukan sisip di tengah.
  • Untuk fungsi hapus tengah, apabila yang dihapus posisi awal list maka akan mengubah posisi head.  Demikian juga jika data yang akan dihapus tidak ada maka ada pesan simpul tidak ada.  Selain kondisi tersebut, lakukan hapus simpul tengah.

Untuk Contoh Programnya bisa di download DISINI

Program Double Linked List pada C++

Double Linked List adalah :

Sebuah struktur data yang memiliki 2 pointer penunjuk, sehingga bisa saling terhubung antara elemen satu dengan elemen lainnya.

dengan menggunakan struktur data seperti berikut :

  • data
  • pointer penunjuk elemen setelahnya (next)
  • pointer penunjuk elemen sebelumnya (prev)

Linked List biasa disebut simpul atau node.

dalam program ini diperlukan beberapa library yaitu :

#include<stdio.h>
#include<stdlib.h>

untuk merepresentasikannya bisa seperti ini

typedef struct simpul node;
struct simpul
{
	int data;
	node *prev;
	node *next;
};

lalu membuat variabel global untuk head, tail, dan baru

node *head = NULL, *tail = NULL, *baru;

lalu buat fungsi untuk alokasi memori, dan disini diperlukan stdlib.h

void allocate_node (int x)
{
	baru = (node *) malloc (sizeof(node));
	if(baru==NULL)
	{
		printf("Alokasi Gagal\n");
		exit(1);
	}
	else
	{
		baru->data=x;
		baru->next=NULL;
		baru->prev=NULL;
	}
}

setelah simpul baru dialokasikan, maka simpul baru bisa dibuat :

	head = tail = baru;

ada beberapa fungsi yang diperlukan untuk menambahkan (menyisipkan) simpul baru, yaitu :

  • sisip awal
  • sisip akhir
  • sisip sebelum
  • sisip sesudah

dan untuk menghapus simpul, diperlukan beberapa fungsi, yaitu :

  • hapus awal
  • hapus akhir
  • hapus simpul

Untuk menyisipkan fungsi-fungsinya adalah :

  • fungsi buat list
void buat_list()
{
	printf("Data Masih Kosong, List akan dibuat dengan data tersebut\n");
	system("PAUSE");
	head = tail = baru;
}
  • fungsi sisip awal
void sisip_awal()
{
	if(head==NULL && tail==NULL)
		buat_list();
	else
	{
		baru->next=head;
		head->prev=baru;
		head=baru;
	}
}
  • fungsi sisip akhir
void sisip_akhir()
{
	if(head==NULL && tail==NULL)
		buat_list();
	else
	{
		baru->prev=tail;
		tail->next=baru;
		tail=baru;
	}

}
  • fungsi sisip sebelum
void sisip_sebelum(int s)
{
	node *before=head;
	int cek=0;
	if(before->next==NULL)
		cek=1;
	else
	{
		while(before->next->data!=s)
		{
			before=before->next;
			if(before->next==NULL)
			{
				cek = 1;
				break;
			}
		}
	}
	if(cek==0)
	{
		baru->prev = before;
		baru->next = before->next;
		before->next->prev = baru;
		before->next = baru;
	}
	else
		gatot();
}
  • fungsi sisip sesudah
void sisip_sesudah(int s)
{
	node *after=tail;
	int cek=0;
	if(after->prev == NULL)
		cek=1;
	else
	{
		while(after->prev->data!=s)
		{
			after=after->prev;
			if(after->prev==NULL)
			{
				cek = 1;
				break;
			}
		}
	}
	if(cek==0)
	{
		baru->next = after;
		baru->prev = after->next;
		after->prev->next = baru;
		after->prev = baru;
	}
	else
		gatot();
}

Lalu untuk menghapus diperlukan beberapa fungsi, yaitu :

  • hapus simpul
void free_node(node *p)
{
	free(p);
	p=NULL;
	printf("DATA TERHAPUS\n");
}
  • hapus satu
void hapus_satu()
{
	node *hapus = head;
	head = NULL;
	tail = NULL;
	free_node(hapus);
}
  • hapus awal
void hapus_awal()
{
	node *hapus = head;
	head->next->prev = NULL;
	head =  head->next;
	free_node(hapus);
}
  • hapus akhir
void hapus_akhir()
{
	node *hapus = tail;
	tail->prev->next = NULL;
	tail =  tail->prev;
	free_node(hapus);
}
  • hapus simpul tertentu
void hapus_tengah(int s)
{
	node *hapus=head;
	int cek=0;
	while(hapus->data!=s)
	{
		if(hapus->next==NULL)
		{
			cek=1;
			break;
		}
		hapus = hapus->next;
	}
	if(cek==0)
	{
		hapus->prev->next = hapus->next;
		hapus->next->prev = hapus->prev;
		free_node(hapus);
	}
	else
		gadel();
}

untuk menampilkan pesan diperlukan fungsi tambahan :

void gatot()
{
	printf("SIMPUL BARU TIDAK DAPAT DISISIPKAN\n");
	system("PAUSE");
}

void gadel()
{
	printf("TIDAK ADA DATA YANG DIHAPUS\n");
	system("PAUSE");
}

Dan juga untuk menampilkan data yang berada pada list bisa di representasikan seperti ini :

void tampil()
{
	node *p= head;
	printf("\nData Simpul ==>  ");
	while(p!=NULL)
	{
		printf("%d ", p->data);
		p=p->next;
	}
	printf("\n\n");
}

Dan pada main bisa menggunakan code seperti ini :

void main()
{
	head=baru;
	int pilih, data, s;
	char lagi='y';
	while(lagi=='y')
	{
		system("CLS");
		awal();
		tampil();
		printf("Menu Pilihan : \n");
		printf("1. Sisip Awal\n");
		printf("2. Sisip Akhir\n");
		printf("3. Sisip Sebelum Simpul\n");
		printf("4. Sisip Sesudah Simpul\n");
		printf("5. Hapus Awal\n");
		printf("6. Hapus Akhir\n");
		printf("7. Hapus Tengah\n");
		printf("\nPilih No            : ");
		scanf("%d", &pilih);
		switch(pilih)
		{
		case 1 :
			printf("Masukkan data       : ");
			scanf("%d", &data);
			allocate_node(data);
			sisip_awal();
			break;
		case 2 :
			printf("Masukkan data       : ");
			scanf("%d", &data);
			allocate_node(data);
			sisip_akhir();
			break;
		case 3 :
			printf("Masukkan data       : ");
			scanf("%d", &data);
			allocate_node(data);
			if(head==NULL && tail==NULL)
				buat_list();
			else
			{
				printf("Dimasukkan sebelum  : ");
				scanf("%d",&s);
				if(s==head->data)
					sisip_awal();
				else
					sisip_sebelum(s);
			}
			break;
		case 4 :
			printf("Masukkan data       : ");
			scanf("%d", &data);
			allocate_node(data);
			if(head==NULL && tail==NULL)
				buat_list();
			else
			{
				printf("Dimasukkan sesudah  : ");
				scanf("%d",&s);
				if(s==tail->data)
					sisip_akhir();
				else
					sisip_sesudah(s);
			}
			break;
		case 5 :
			if(head == NULL && tail == NULL)
				gadel();
			else if(head == tail)
				hapus_satu();
			else
				hapus_awal();
			break;
		case 6 :
			if(head == NULL && tail == NULL)
				gadel();
			else if(head == tail)
				hapus_satu();
			else
				hapus_akhir();
			break;
		case 7 :
			printf("Data yang dihapus   : ");
			scanf("%d", &data);
			if(head == NULL && tail == NULL)
				gadel();
			else if(data == head->data && data == tail->data && head == tail)
				hapus_satu();
			else if(data == head->data)
				hapus_awal();
			else if(data == tail->data)
				hapus_akhir();
			else
				hapus_tengah(data);
			break;
		}
		fflush(stdin);
		printf("Lagi (y/t) ? ");
		scanf("%c", &lagi);
	}
}

system(“PAUSE”) digunakan untuk menghentikan program sejenak.
system(“CLS”) digunakan untuk menghapus layar.
kedua command tersebut membutuhkan <stdlib.h> sama hal nya dengan penggunaan alokasi memori yang menggunakan malloc() , sizeof() , dan free() .

untuk download programnya bisa di download DISINI

Pengertian shift pada kasus ini yaitu, menjadikan sebuah bilangan desimal inputan menjadi bilangan biner, lalu setelah menjadi biner, akan dilakukan dequeue lalu di enqueue sebanyak shift.

contoh :

bilangan desimal : 25

di shift : 3

maka hasilnya adalah : 7

Kenapa kok bisa 7 ??????

nah, caranya seperti ini……!!!

dari bilangan desimal 25 dikonversikan menjadi biner menjadi 11001

setelah dikonversikan, maka program di shift sebanyak 3x

11001 —> shift pertama, angka 1 yang terakhir di dequeue lalu di enqueue sehingga menjadi 11100

11100 —> shift kedua, angka 0 yang terakhir di dequeue lalu di enqueue sehingga menjadi 01110

01110 —> shift ketiga, angka 0 yang terakhir di dequeue lalu di enqueue sehingga menjadi 00111

setelah selesai menjadi bilangan biner 00111 akan dikonversikan menjadi desimal

1   —>  20 x 1    = 1

1   —>  21 x 1    = 2

1   —>  22 x 1    = 4

0   —>  23 x 0  = 0

0   —>  24 x 0  = 0

———————–  +

                         7

Untuk Skrip Dan Juga Contoh Programnya bisa di download DISINI