Linked List Nama Dgn Merge Sort

Pada artikel yang lalu tentang linked list nama, maka kali ini saya coba posting dengan pengurutan Merge. Sesuai dengan namanya yaitu merge (penggabungan), pengurutan ini dilakukan dengan menggabungkan 2 buah array ke dalam 1 buah array. Penasaran tugas struktur data tentang metode-metode pengurutan, karena saat tugas itu saya kebagian yang pengurutan dengan insertion, maka fokus utama saya menyelesaikan pengurutan insertion terlebih dahulu. Namun dari 4 metode pengurutan yang ditugaskan yaitu Insertion Sort, Shell Sort, Merge Sort, dan Quick Sort hanya 2 metoda yang selesai pada tugas struktur data tersebut yaitu Insertion dan Shell Sort. Kata teman-teman sich susah yang Merge dan Quick Sortnya, tapi pas saya coba. Ternyata emang susah pahaminya. Pelan tapi pasti (alon-alon asal kelakon), akhirnya selesai juga pengurutan nama dengan metoda merge sort. Mengerjakannya dari jam 1 – 3 pagi dengan bantuan copy-an buku dari Wahyu dan segelas Nescafe anget, Alhamdulillah selesai. 2 jam, lama yach..maklum telmi…tapi tetep percaya, BISA KARENA BIASA, BIASA KARENA SERING DILAKUKAN.
Langung aja, berikut adalah codenya :

#include "stdio.h"
#include "stdlib.h"
#include "conio2.h"
#define maks_nama 100
#define panjang_nama 100

void create_nama(char *nama);
void destroy_nama(char *nama);
void menu_pilihan(char nama[maks_nama][panjang_nama], int n);
void urut_nama(char nama[maks_nama][panjang_nama], int n);
void search_nama(char nama[maks_nama][panjang_nama], int n);
void isi_nama(char nama[maks_nama][panjang_nama], int *n);
char *nama_terkecil(char nama[maks_nama][panjang_nama], int n);
char *nama_terbesar(char nama[maks_nama][panjang_nama], int n);
void tampil_nama(char nama[maks_nama][panjang_nama], int n);

int main(int argc, char *argv[])
{
	char nama[maks_nama][panjang_nama];
	int i,n;

	create_nama(nama);
	menu_pilihan(nama,n);
	system("PAUSE");
	return 0;
}

void create_nama(char *nama)
{
	int i;

	for(i=0; i<=maks_nama; i++)
	{
		strcpy(&nama[i]," ");
	}
}

void destroy_nama(char *nama)
{
	int i;

	for(i=0; i<=maks_nama; i++)
	{
		strcpy(&nama[i]," ");
	}
}

void menu_pilihan(char nama[maks_nama][panjang_nama], int n)
{
	int pilih,ketemu;

	ketemu = 0;
	while(pilih!=0)
	{
		clrscr();
		gotoxy(17,4);printf("|-------------------------------------------|\n");
		gotoxy(17,5);printf("| MENU PILIHAN |\n");
		gotoxy(17,6);printf("|-------------------------------------------|\n");
		gotoxy(17,7);printf("| [ 1 ] Input Nama |\n");
		gotoxy(17,8);printf("| [ 2 ] Tampil Nama |\n");
		gotoxy(17,9);printf("| [ 3 ] Cari Nama |");
		gotoxy(17,10);printf("| [ 0 ] Keluar |");
		gotoxy(17,11);printf("|-------------------------------------------|");
		gotoxy(17,12);printf("| Pilihan Anda : |");
		gotoxy(17,13);printf("|-------------------------------------------|");
		gotoxy(44,12);scanf("%i",&pilih);
		
		while(pilih3)
		{
			gotoxy(19,15);printf("Anda salah memasukan nomor menu pilihan");
			getch();
			gotoxy(19,15);clreol();
			gotoxy(44,12);clreol();
			gotoxy(61,12);printf("|");
			gotoxy(44,12);scanf("%i",&pilih);

		}

		switch(pilih)
		{
			case 1 : clrscr();
					 isi_nama(nama,&n);
					 break;

			case 2 : clrscr();
					 if(n!=0)
					 tampil_nama(nama,n);
					 else{
						gotoxy(23,12);printf("Anda belum memasukan data, ulangi !!!!");
						getch();
					 }
					 break;

			case 3 : clrscr();
					 if(n!=0)
						search_nama(nama,n);
					 else
					 {
						gotoxy(23,12);printf("Anda belum memasukan data, ulangi !!!!");
						getch();
					 }
						break;
			case 0 : destroy_nama(nama);
					 exit(0);
		}

	}
}

void urut_nama(char nama[maks_nama][panjang_nama], int n) //coba merge sort
{
	char temp[maks_nama][panjang_nama];
	int i,j,ukuran,L1,L2,U1,U2,k;

	ukuran = 1;
	while(ukuran < n)
	{
		L1 = 0;
		k = 0;
		while(L1 + ukuran < n)
		{
			L2 = L1+ukuran;
			U1 = L2 - 1;
			if(L2+ukuran-1 < n)
			U2 = L2+ukuran-1;
			else
			U2 = n - 1;

			i = L1;
			j = L2;
			while((i<=U1) && (j<=U2))
			{
				if(strcmp(nama[i],nama[j])==1)
					strcpy(temp[k],nama[i++]);
				else
					strcpy(temp[k],nama[j++]);

				k++;
			}

		while(i<=U1)
		{
			strcpy(temp[k],nama[i]);
			i++;
			k++;
		}

		while(j<=U2)
		{
			strcpy(temp[k],nama[j]);
			j++;
			k++;
		}

		L1 = U2+1;
	}

	for(i=L1; k<n; i++)
		strcpy(temp[k++],nama[i]);

	for(i=0; i<n; i++)
		strcpy(nama[i],temp[i]);

	ukuran = ukuran * 2;
	
	}
}

void isi_nama(char nama[maks_nama][panjang_nama], int *n)
{
	int i;

	gotoxy(17,4);printf("|-------------------------------------------|");
	gotoxy(17,5);printf("| MENU PILIHAN INPUT NAMA |");
	gotoxy(17,6);printf("|-------------------------------------------|");
	gotoxy(17,7);printf("| Berapa banyak nama : |");
	gotoxy(17,8);printf("|-------------------------------------------|");
	gotoxy(46,7);scanf("%i",n);
	for(i=0; i<*n; i++){
		gotoxy(17,9+i);printf("| Nama ke-%i ",i+1);
		gotoxy(32,9+i);printf(":");
		gotoxy(61,9+i);printf("|");
		gotoxy(35,9+i);fflush(stdin);gets(nama[i]);

	}
	
	gotoxy(17,9+i);printf("|-------------------------------------------|");
	gotoxy(17,9+i+1);printf("| %i nama telah tersimpan ",*n);
	gotoxy(61,9+i+1);printf("|");
	gotoxy(17,9+i+2);printf("|-------------------------------------------|");
	getch();
	
}

void search_nama(char nama[maks_nama][panjang_nama], int n){
	char *nama_cari[maks_nama][panjang_nama];
	int i;

	urut_nama(nama,n);

	gotoxy(17,4);printf("|-------------------------------------------|");
	gotoxy(17,5);printf("| MENU PILIHAN CARI NAMA |");
	gotoxy(17,6);printf("|-------------------------------------------|");
	gotoxy(17,7);printf("| Masukan Nama Yang Dicari |");
	gotoxy(17,8);printf("|");
	gotoxy(61,8);printf("|");
	gotoxy(17,9);printf("|-------------------------------------------|\n");
	gotoxy(35,8);fflush(stdin);gets(*nama_cari);

	i=0;
	while((i<n) && strcmpi(nama_cari,nama[i])==1){
		i++;
	}

	if (strcmpi(nama_cari,nama[i])==0){
		gotoxy(17,10);printf("|");
		gotoxy(22,10);printf(" Nama %s ada pada data ke %i ",nama_cari,i+1);
		gotoxy(61,10);printf("|");
	}else{
		gotoxy(17,10);printf("|");
		gotoxy(22,10);printf(" Nama %s tidak ada pada data ",nama_cari);
		gotoxy(61,10);printf("|");
	}

	gotoxy(17,11);printf("|-------------------------------------------|");
	gotoxy(17,12);printf("| Ada %i nama yang telah tersimpan |",n);
	gotoxy(17,13);printf("|-------------------------------------------|");

	for(i=0; i<=n-1; i++){
		gotoxy(17,14+i);printf("| Nama ke-%i ",i+1);
		gotoxy(36,14+i);printf("%s",&nama[i]);
		gotoxy(34,14+i);printf(":");
		gotoxy(61,14+i);printf("|");
	}
	
	gotoxy(17,14+i);printf("|-------------------------------------------|");
	getch();
}

char *nama_terkecil(char nama[maks_nama][panjang_nama], int n){
	int i;
	char *min[maks_nama][panjang_nama];

	strcpy(&min[maks_nama][panjang_nama],nama[0]);
	for(i=1; i<n; i++){
		if(strlen(nama[i]) <= strlen(&min[maks_nama][panjang_nama])){
			strcpy(&min[maks_nama][panjang_nama],nama[i]);
		}
	}

	return &min[maks_nama][panjang_nama];
}

char *nama_terbesar(char nama[maks_nama][panjang_nama], int n){
	int i;
	char *max[maks_nama][panjang_nama];

	strcpy(&max[maks_nama][panjang_nama],nama[0]);
	for(i=1; i= strlen(&max[maks_nama][panjang_nama])){
		strcpy(&max[maks_nama][panjang_nama],nama[i]);
	}

	return &max[maks_nama][panjang_nama];
}

void tampil_nama(char nama[maks_nama][panjang_nama], int n){

	int i;
	char *max[maks_nama][panjang_nama];
	char *min[maks_nama][panjang_nama];

	clrscr();
	gotoxy(17,4);printf("|-------------------------------------------|");
	gotoxy(17,5);printf("| MENU PILIHAN TAMPIL NAMA |");
	gotoxy(17,6);printf("|-------------------------------------------|");
	urut_nama(nama,n);
	
	for(i=0; i<n; i++){
		gotoxy(17,7+i);printf("| Nama ke-%i %s ",i+1,&nama[i]);
		gotoxy(33,7+i);printf(":");
		gotoxy(61,7+i);printf("|");
	}

	gotoxy(17,7+i);printf("|-------------------------------------------|");
	gotoxy(17,7+i+1);printf("| Nama Terpanjang : %s ",nama_terbesar(nama,i));
	gotoxy(61,7+i+1);printf("|");
	gotoxy(17,7+i+2);printf("|-------------------------------------------|");
	gotoxy(17,7+i+3);printf("| Nama Terpendek : %s ",nama_terkecil(nama,i));
	gotoxy(61,7+i+3);printf("|");
	gotoxy(17,7+i+4);printf("|-------------------------------------------|");
	getch();
}

Hasil pengurutan nama akan terurut secara decending atau menurun.
Masih berkutat dengan masalah pointer, silakan yang mau komentar atau koreksi error sangat dinantikan. Semoga bermanfaat.

Silahkan Komentar...

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s