hasilnya......
---------------------------------------------------------------------------------------------------------------
/*
Nama Program : Josepus Problem
Deskripsi Program : aplikasi di gunakan untuk pemilihan ketua kelas, dimana user menginputkan nama-nama calon ketua kelas,
yang selanjutkan akan dipilih menggunakan algoritma josepus, selain nama-nama calon ketua kelas user juga
memberikan masukan interval yang digunakan unutk menghapus/mengurangi calon ketua kelas.user dapat memilih
akan memulai interval dari salah satu calon yang telah diinputkan.
Disclaimer :
Versi : Versi 1.0.0
Author : Tegar Palyus Fiqar 1213200034
*/
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
struct node
{
struct node *next;//alamat penyimpanan ke node selanjutnya.
char nama[20];//menyimpan nama2 ketua kelas, max 20 karakter.
}*start;//awalan dari list
typedef struct node *nodepointer;//typedata yang digunakan.
void tambah(char namanama[])//digunakan untuk menabah node pada list.
{
nodepointer tmp=(struct node *)malloc(sizeof(struct node));//mendeklasikan dan mengalokasi memory untuk node baru.
nodepointer pindah;
pindah=start;//awal untuk memulai.
if(tmp==NULL)
{
printf("maaf terlalu banyak");
return;//jika memory yang dialokasikan tidak cukup
}
while ((pindah->next)!=NULL)
{
pindah=pindah->next;//proses "pindah" node dari awal hingga akhir.
}
strcpy(tmp->nama,namanama);//mengkopi nama kedalam var nama-nama
tmp->next=NULL;
pindah->next=tmp;
}
int main()
{
char pilihan[20];
start=(nodepointer)malloc(sizeof(struct node));//mengalokasikan memory yang akan digunakan
printf("\t\tPemilihan ketua kelas menggunakan josepus \n\n\n");
printf("masukan nama calon ketua kelas : (maksimum 20 karakter)\n");//memasukan nama yang pertama
printf("\t");
scanf("%s",start->nama);
start->next=NULL;
printf("\nsilahkan tambah nama ketua kelas atau jika ingin diakhiri masukan ""stop"" \n");// memasukan nama yang kedua
printf("\t");
scanf("%s",pilihan);
while (strcmp(pilihan,"stop")!=0)//syarat untuk berhinti input nama ketua kelas
{
tambah(pilihan);
printf("\nsilahkan tambah nama ketua kelas atau jika ingin diakhiri masukan ""stop"" \n");// memasukan nama yang selanjutnya
printf("\t");
scanf("%s",pilihan);
}
nodepointer pindah=start;
printf("\nYang menjadi calon-calon ketua kelas dengan circular linkedlist adalah :\n\n");
printf("|");
printf(" %s ",pindah->nama);//menampilkan nama2 calon ketua kelas yang pertama.
printf(" %d ",pindah->nama);
printf(" %x ",pindah->nama);
printf("|");
printf("--->");
while ((pindah->next)!=NULL)
{
pindah=pindah->next;
printf("|");
printf(" %s ",pindah->nama);//menampilkan nama2 calon ketua kelas yang kedua dan seterusnya.
printf(" %d ",pindah->nama);
printf(" %x ",pindah->nama);
printf("|");
printf("--->");
}
pindah->next=start;//membuat circular linkedlist
pindah=start;
printf("|");
printf(" %s ",pindah->nama);
printf(" %d ",pindah->nama);
printf(" %x ",pindah->nama);
printf("|");
int hitung;//variabel yang akan digunakan untuk banyaknya interval.
char namaawal[20];//variable yang digunakn sebagai nama awalan yg akan dipilih.
printf("\n\nmasukan interval yang akan di hapus : \n");
printf("\t");
scanf("%d",&hitung);
printf("masukan mulai dari siapa perhitungan intervalnya : \n");
printf("\t");
scanf("%s",&namaawal);
int counter;
counter=0;
while (strcmp(pindah->nama,namaawal)!=0)
{
pindah=pindah->next;
}
int i;
i=1;
while (pindah->next!=pindah)//syarat dalam menentukan akhir dari ketua kelas.
//jika syarat pindah->next!=pindah, maka masih ada beberapa calon,
//akan looping hingga pindah->next==pindah, maka hanya tersisah 1 ketua kelas.
{
counter++;
//if(counter==hitung)// menghapus next node.
if(counter==hitung-1)
{
nodepointer tmp=pindah->next;
pindah->next=tmp->next;
printf("\nyang tidak terpilih menjadi ketua kelas ke-%d adalah ""%s"" %d",i,tmp->nama,tmp->nama);
free(tmp);//hingga ruang kosong pada memory
counter=0;
i++;
}
pindah=pindah->next;
}
printf("\nyang menjadi ketua kelas adalah ""%s"" %d\n\n",pindah->nama,pindah->nama);
system("pause");
}
hasilnya......
No comments:
Post a Comment