Rabu, 09 Mei 2012

Contoh Circular Linked List

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


struct node{
        int data;
        struct node *next;       
};

typedef struct node node;

node *pList = NULL;

node *alokasiNodeBaru(){
  node *pNew = NULL;
  pNew = (node *) malloc(sizeof(node));
  return(pNew);
}


void tambahAwal(node *pNew){
     node *temp;
     if(pList == NULL){
              pNew->next = pNew;
              pList = pNew;
     }
     else{
              //cari node yang menunjuk ke pList
              temp = pList;
              while(temp->next != pList){
                    temp = temp->next;          
              }
             
              temp->next = pNew;
              pNew->next = pList;
              pList = pNew;  
     }
}



void cetak(){
     node *pWalker = pList;
     node *pNext = NULL;
     while(pNext != pList){
         printf("pWalker = %d, ", pWalker->data);
         pNext = pWalker->next;
         pWalker = pNext;
         printf("pWalker->next = %d \n", pWalker->data);         
     }

}


void tambahTengah(node *pNew){
     node *pWalker;
     pWalker=pList;
     int nilai,sisip;
     printf("masukkan nilai yang ingin ditambahkan: "); scanf("%d",&nilai);
     pNew->data = nilai;
     cetak();
     printf("data disisipkan setelah nilai : "); scanf("%d",&sisip);
     while(pWalker!=NULL && pWalker->data!=sisip){
                         pWalker=pWalker->next; }
                      
     if(pWalker->next==pList) printf("\ndata tidak ditemukan");
     else {pNew->next=pWalker->next;
           pWalker->next=pNew; }
     cetak();

}

void tambahAkhir(node *pNew){
     node *pPre;
     pPre=pList;
     int nilai;
     printf("masukkan nilai yang ingin ditambahkan: "); scanf("%d",&nilai);
     pNew->data = nilai;
     while(pPre->next!=pList){
                         pPre=pPre->next; }
     pNew->next=pList;
     pPre->next=pNew;
                            
}

void hapusAwal(){
     node *pEnd, *pHapus;
     pEnd=pList;
     pHapus=pList;
     while(pEnd->next!=pList){
                              pEnd=pEnd->next;}
     pEnd->next=pHapus->next;
     pList=pList->next;
     free(pHapus);
}

void hapusTengah(){
     node *pCari,*pPre;int hapus;
     pPre=pList;
     pCari=pList;
     cetak();
     printf("masukkan bilangan yang ingin dihapus: "); scanf("%d",&hapus);
     while(pCari->data!=hapus){
                               pCari=pCari->next; }
     while(pPre->next!=pCari){
                              pPre=pPre->next;}
     pPre->next=pCari->next;
     free(pCari);
    
}

void hapusAkhir(){
     node *pEnd,*pPre;
     pEnd=pList;
     pPre=pList;
     while(pEnd->next!=pList){
                              pEnd=pEnd->next;}
     while(pPre->next!=pEnd){
                             pPre=pPre->next;}
     pPre->next=pList;
     free(pEnd);
}
    
    
int main(int argc, char *argv[])
{
  node *pNew; int pilih,bil;
  do{system("cls");
   printf("----------MENU-----------");
    printf("\n1.tambah awal");
    printf("\n2.tambah tengah");
    printf("\n3.tambah akhir");
    printf("\n4.hapus awal ");
    printf("\n5.hapus tengah");
    printf("\n6.hapus akhir");
    printf("\n7.cetak");
    printf("\n8.exit");
    printf("\npilihan : ");scanf("%d",&pilih);
   
    if(pilih==1){pNew=alokasiNodeBaru();
                 printf("masukkan bilangan: ");
                 scanf("%d",&bil);
                 pNew->data=bil;
                 tambahAwal(pNew);
                 }
    else if(pilih==2){pNew=alokasiNodeBaru();
                 tambahTengah(pNew);
                 }
    else if(pilih==3){pNew=alokasiNodeBaru();
                 tambahAkhir(pNew);
                 }
    else if(pilih==4){hapusAwal();}
    else if(pilih==5){hapusTengah();}
    else if(pilih==6){hapusAkhir();}
    else if(pilih==7){cetak();getch();}
                
                
                
}while(pilih!=8);
 
 
  /*
  cetak();
  pNew = alokasiNodeBaru();
  tambahTengah(pNew);
  */
  printf("\n");
  system("PAUSE");   
  return 0;
}

Soal Pendahuluan



1.      Jelaskan  Perbedaan thread dan proses?
Proses:  Gabungan dari ruang virtual memori, kode, data, dan resource sistem
Thread: Kode yang secara serial akan diproses per satu proses
Perbedaan Proses dan Thread
Proses adalah program sedang dieksekusi. Sedangkan thread adalah alur kontrol dari suatu proses. Perbedaan antara proses dan thread adalah :
-          Thread menggunakan secara bersama ruang alamat dari proses yang menciptakannya. Proses memiliki ruang alamat sendiri-sendiri.
-          Thread memiliki akses langsung ke segemen data dari prosesnya. Masing-masing proses memiliki salinan segmen data dari parent process-nya.
-          Thread dapat saling komunikasi dengan thread lain dalam satu process. Antar proses harus menggunakan komunikasi antar proses.
-           Thread hampir tidak memiliki overhead. Proses memiliki overhead.
-          Thread dapat memiliki pengaruh kontrol yang besar terhadap thread lain dalam satu proses. Proses hanya dapat mengendalikan proses anakannya.
-          Perubahan pada thread utama seperti pembatalan atau perubahan prioritas dapat mempengaruhi tingkah laku thread lain dalam satu proses. Perubahan pada parent proses tidak mempengaruhi proses anakan.

-           Prosesor mengeksekusi thread, bukan proses, jadi tiap aplikasi setidaknya memiliki satu proses, dan tiap proses paling tidak memiliki satu thread eksekusi yang dinamakan primary thread. Sebuah proses dapat memiliki banyak thread selain primary thread
2.      Cari tahu  tentang DAEMON, jelaskan dan berikan  contohnya?
            Daemon merupakan background prosess yang didesain agar dapat menjalankan suatu proses secara otomatis kerena tidak memiliki terminal pengontrol, dengan sedikit atau tanpa hubungan lansung dengan pengguna (User Interface). Biasanya daemon bekerja pada waktu yang sangat lama dengan fungsi mendengarkan dan meunggu request dan menjalankan responya berupa proses. Salah satu contohnya adalah apache webserver http web daemon (httpd).
3.      Gambarkan proses terjadinya thread?
                  Thread dibuat saat suatu proses akan dieksekusi oleh prosesor, ada 2 macam model thread yaitu  single thread dan multithread.

4.       Cari tahu tentang fork(), jelaskan fungsinya?
            Sistem operasi UNIX mempunyai system call fork yang berfungsi untuk membuat proses baru. Proses yang memanggil system call fork ini akan dibagi jadi dua, proses induk dan proses turunan yang identik. Analoginya seperti pembelahan sel, dimana satu sel membelah jadi dua sel yang identik. Proses induk dan turunan independen satu sama lain dan berjalan bersamaan. Return code dari system call ini adalah suatu integer. Untuk proses anak return code-nya adalah 0 sementara untuk proses induk return code-nya adalah nomor identifikasi proses (PID) dari turunannya. Ada juga system call exec yang berguna untuk membuat proses turunan yang terbentuk memiliki instruksi yang berbeda dengan proses induknya. Dengan kata lain, proses induk dan proses turunan tidak lagi identik tapi masing-masing punya instruksi berbeda.
                                    Berikut adalah contoh penggunaan fork() dengan menggunakan bahasa C. Tipe data pid_t merupakan signed integer yang sebenernya dalam pustaka GNU. Tipe ini adalah int, fungsinya adalah merepresentasikan PID. Program C diatas menggambarkan atau mengilustrasikan UNIX system call. Didalam UNIX Shell akan membaca perintah dari terminal, kemudian perintah tersebut di fork(), dan menghasilkan proses anak, proses anak inilah yang akan mengeksekusi perintah dari shell tersebut, sementara proses induk hanya menunggu dengan menggunakan system call wait() dan mengeksekusi perintah lain saat proses anak terminasi.