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