110 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "a_station.h"
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
struct station* create_station(){
 | 
						|
   struct station* station = (struct station*)calloc(1,sizeof(struct station));
 | 
						|
   station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*));
 | 
						|
   station->track_count = STATION_SIZE;
 | 
						|
   return station;
 | 
						|
}
 | 
						|
 | 
						|
void destroy_station(struct station* station){
 | 
						|
    for(int i = 0; i < station->track_count; i++){
 | 
						|
        //get one linked list from station
 | 
						|
        struct car* this = station->tracks[i];
 | 
						|
        while(this != NULL){
 | 
						|
            struct car* delete = this;
 | 
						|
            this = delete->next;
 | 
						|
            free(delete);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    free(station->tracks);
 | 
						|
    free(station);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
int select_track(struct station* station, const char* target){
 | 
						|
    unsigned int hash = 0;
 | 
						|
    for(int i = 0; target[i] != '\0'; i++){
 | 
						|
       //i used "lose lose" function, because it's simple and clear
 | 
						|
       hash += target[i]; 
 | 
						|
    }
 | 
						|
    //change hash, so that it will be between 0 and station->track_count
 | 
						|
    hash = hash % station->track_count;
 | 
						|
    return hash;
 | 
						|
}
 | 
						|
 | 
						|
void add_target_capacity(struct station* station,const char* target, int capacity){
 | 
						|
    //find hash
 | 
						|
    int track = select_track(station, target);
 | 
						|
 | 
						|
    //get right linked list(with help of hash)
 | 
						|
    struct car* start = station->tracks[track];
 | 
						|
    while(start != NULL){
 | 
						|
        int x = strcmp(start->value, target);
 | 
						|
        //if the "wagon" track is similar to the target, then increment capacity 
 | 
						|
        if(x == 0){
 | 
						|
            start->capacity = start->capacity + capacity;
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        start = start->next;
 | 
						|
    }
 | 
						|
 | 
						|
    //if track is empty, create new "wagon"
 | 
						|
    if(station->tracks[track] == NULL){
 | 
						|
        struct car* new = calloc(1, sizeof(struct car));
 | 
						|
        strcpy(new->value, target);
 | 
						|
        new->capacity = capacity;
 | 
						|
        new->next = start;
 | 
						|
        station->tracks[track] = new;
 | 
						|
        /*if(new->next){
 | 
						|
            return;
 | 
						|
        }*/
 | 
						|
    }
 | 
						|
    return;   
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
int get_target_capacity(struct station* station,const char* target){
 | 
						|
    //find hash
 | 
						|
    int track = select_track(station, target);
 | 
						|
    
 | 
						|
    //get right linked list
 | 
						|
    struct car* start = station->tracks[track];
 | 
						|
    while(start != NULL){
 | 
						|
        int x = strcmp(start->value, target);
 | 
						|
        //if the target is similar to "wagon", than get the capacity 
 | 
						|
        if(x == 0){
 | 
						|
            return start->capacity;
 | 
						|
        }
 | 
						|
        start = start->next;
 | 
						|
    }      
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
//count all tracks
 | 
						|
int count_targets(struct station* station){
 | 
						|
    int targets = 0;
 | 
						|
    for(int i = 0; i < STATION_SIZE; i++){
 | 
						|
        if(station->tracks[i] != NULL){
 | 
						|
            targets++;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return targets;
 | 
						|
}
 | 
						|
//count capacity in all tracks
 | 
						|
int count_capacity(struct station* station){
 | 
						|
    int capacity = 0;
 | 
						|
    for(int i = 0; i < STATION_SIZE; i++){
 | 
						|
        //get one linked list and count there capacity      
 | 
						|
        struct car* this = station->tracks[i];
 | 
						|
        if(this != NULL){
 | 
						|
            capacity = capacity + this->capacity;
 | 
						|
            this = this->next;
 | 
						|
        }       
 | 
						|
    }
 | 
						|
    return capacity;
 | 
						|
}
 | 
						|
 |