Bu çalışmada ilk giren ilk çıkar (FIFO) mantığı ile çalışan kuyruk veri yapısının basit bir uygulaması yer almaktadır. Bankada kuyruklar bulunmaktadır ve sıranın en önündekine her birim zamanda hizmet edilir. Hizmet süresi sıfır olan eleman sıradan çıkar. Yeni gelen müşteriler bekleme süresi en kısa olan kuyruğa eklenir.

Kaynak Kodlar:

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

int N;
int MAX;

struct queue{
int front, rear, count, weight;
int *values;
};
typedef queue * vezne;

vezne createQueue(){
vezne myQueue = (vezne) malloc(sizeof(struct queue));
myQueue->values = (int *) malloc(sizeof(int)*MAX);
myQueue->front = 0;
myQueue->rear = -1;
myQueue->count = 0;
myQueue->weight=0;
return myQueue;
}

int isFull(vezne myQueue){
 if(myQueue->count==MAX)
 return 1;
 else
 return 0;
}

int isEmpty(vezne myQueue){
 if(myQueue->count==0)
 return 1;
 else
 return 0;
}

void append(int newElement,vezne myQueue){
 if(isFull(myQueue)){
 printf("Ekleme Yapilamaz\n");
 return;
 }
 else{
 myQueue->count++;
 myQueue->rear = ( (myQueue->rear + 1) % MAX );
 myQueue->values[myQueue->rear] = newElement;
 myQueue->weight+= newElement;
 }
}

int serve(vezne myQueue){
 int serve;
 if(isEmpty(myQueue)){
 printf("Eleman Yok\n");
 return -1;
 }
 else{
 myQueue->count--;
 serve = myQueue->values[myQueue->front];
 myQueue->front = ( (myQueue->front + 1) % MAX);
 return serve;
 }
}

int getMinQueue(vezne *banka){
 int min=0;
 for(int i=N-1;i>=0;i--)
 if(!isFull(banka[i]))
 min=i;
 for(int i=0;i<N;i++)
 if(banka[i]->weight < banka[min]->weight && !isFull(banka[i]))
 min=i;
 return min;
}

void timeElapse(vezne *banka){
 int timeLeft;
 for(int i=0;i<N;i++){
 if(banka[i]->count == 0) continue;
 timeLeft = banka[i]->values[banka[i]->front]-1;
 banka[i]->weight--;
 if(timeLeft>0){
 banka[i]->values[banka[i]->front] = timeLeft;}
 else{
 serve(banka[i]);}
 }
}

void printQueues(vezne *banka){
 for(int i=0; i<N; i++){
 int cnt=0;
 printf("\nSira %d: ",i);
 for(int j=banka[i]->front; cnt<banka[i]->count;j=(j+1)%MAX){
 printf("%5d",banka[i]->values[j]);
 cnt++;
 }
 }
 printf("\n");

}

int main(){

 vezne *banka;
 int m=5;
 int x=20;
 int toplamIslem = 0;
 int yeniMusteri;
 int minQueue;
 int zaman = 0;
 srand(time(NULL));

 printf("Max islem suresi m= ");scanf("%d",&m);
 printf("Max islem yuku x= ");scanf("%d",&x);
 printf("Max kuyruk uzunlugu t= ");scanf("%d",&MAX);
 printf("Vezne Sayisi N= ");scanf("%d",&N);
 banka = (vezne *) malloc(sizeof(vezne)*N);

 for(int i=0; i<N; i++)
 banka[i]=createQueue();

 while(toplamIslem<x){
 yeniMusteri = rand()%(m+1);
 printf("\n---\nYeni Musteri: %d \n",yeniMusteri);
 if(yeniMusteri!=0)
 {
 if(toplamIslem+yeniMusteri>x) break;
 toplamIslem+=yeniMusteri;
 minQueue = getMinQueue(banka);
 append(yeniMusteri,banka[minQueue]);
 }
 printf("\nZaman: t+%d\n",zaman);
 printQueues(banka);
 printf("\nToplam Islem: %d\n\n",toplamIslem);
 system("pause");
 timeElapse(banka);
 zaman++;
 }
 printf("\nYeni musteri girisi kapanmistir.\n");

 system("pause");
 return 0;
}

Siz de yorum ekleyin

Arşivler
Meta