I don't even know. why does nothing work????
This commit is contained in:
232
Assignment 10/main.c
Normal file
232
Assignment 10/main.c
Normal file
@ -0,0 +1,232 @@
|
||||
/*
|
||||
* Student: S.K. Soekhlal
|
||||
* Number: 4860632
|
||||
* Assignment: 5.1 + 5.2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "salloc.h"
|
||||
#include "city.h"
|
||||
#include "road.h"
|
||||
|
||||
#define MAX_STRING_LENGTH 50
|
||||
|
||||
|
||||
/*
|
||||
* Locate city with name city_name on the map
|
||||
*/
|
||||
City *find_city (City *list_of_cities, char *city_name)
|
||||
{
|
||||
City *c = list_of_cities;
|
||||
while (c != NULL)
|
||||
{
|
||||
if (strcmp (c->name, city_name) == 0)
|
||||
return c;
|
||||
|
||||
c = c->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Delete a map
|
||||
*/
|
||||
static void delete_map (City *map)
|
||||
{
|
||||
City *map_copy;
|
||||
|
||||
while (map != NULL)
|
||||
{
|
||||
map_copy = map;
|
||||
map = map->next;
|
||||
delete_city (map_copy);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Build the map datastructure
|
||||
*/
|
||||
static City *create_map (FILE *data_file)
|
||||
{
|
||||
int num_of_cities, i;
|
||||
int length_of_road;
|
||||
char city_begin[MAX_STRING_LENGTH + 1];
|
||||
char city_end[MAX_STRING_LENGTH + 1];
|
||||
int num_of_roads;
|
||||
char city_name[MAX_STRING_LENGTH + 1];
|
||||
|
||||
City *map = NULL;
|
||||
|
||||
/* Read in city-names */
|
||||
fscanf (data_file, "%d", &num_of_cities);
|
||||
|
||||
for (i = 0; i < num_of_cities; i++)
|
||||
{
|
||||
|
||||
City *city;
|
||||
City *c;
|
||||
|
||||
fscanf (data_file, "%s", city_name);
|
||||
|
||||
if (find_city (map, city_name) != NULL)
|
||||
{
|
||||
fprintf (stderr, "City %s already on the map\n", city_name);
|
||||
delete_map (map);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
city = new_city (safe_strdup (city_name));
|
||||
|
||||
if (map == NULL)
|
||||
/* This is the first city of the map */
|
||||
map = city;
|
||||
else {
|
||||
/* Find last of city list */
|
||||
c = map;
|
||||
while (c->next) c = c->next;
|
||||
/* And append new city there */
|
||||
c -> next = city;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
fscanf (data_file, "%d", &num_of_roads);
|
||||
|
||||
for (i = 0; i < num_of_roads; i++){
|
||||
|
||||
City *city;
|
||||
Road *c;
|
||||
Road *road;
|
||||
Road *origin;
|
||||
Road *destination;
|
||||
|
||||
|
||||
fscanf(data_file,"%s %s %d", city_begin,city_end, &length_of_road);
|
||||
|
||||
|
||||
origin = (Road*)find_city(map,city_begin);
|
||||
destination = (Road*)find_city(map,city_end);
|
||||
|
||||
|
||||
road = new_road((City*)origin, (City*)destination, (int)length_of_road);
|
||||
|
||||
city = (City*)origin;
|
||||
if (city->roads == NULL){
|
||||
/* This is the first road of the city*/
|
||||
city->roads = road;
|
||||
}
|
||||
else {
|
||||
/* Find last of road list */
|
||||
c = city->roads;
|
||||
while (c->next) c = c->next;
|
||||
/* And append new road there */
|
||||
c -> next = road;
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
static void print_city_roads (City *map)
|
||||
{
|
||||
City *city;
|
||||
Road *road;
|
||||
|
||||
for (city = map; city != NULL; city = city->next)
|
||||
{
|
||||
printf ("Roads from city %s:\n", city->name);
|
||||
|
||||
for (road = city->roads; road != NULL; road=road->next) {
|
||||
printf (" to city %s", road->destination->name);
|
||||
printf (" (length %d)\n", road->length);
|
||||
}
|
||||
}
|
||||
free(city);
|
||||
free(road);
|
||||
}
|
||||
|
||||
|
||||
static void find_shortest_roads (City *map)
|
||||
{
|
||||
|
||||
char buf[MAX_STRING_LENGTH];
|
||||
char *destination;
|
||||
int length;
|
||||
int smallest_length;
|
||||
City *city;
|
||||
Road *road;
|
||||
|
||||
scanf("%s", buf);
|
||||
city = find_city(map,buf);
|
||||
road = city->roads;
|
||||
smallest_length = road->length;
|
||||
destination = road->destination->name;
|
||||
while(strcmp(buf,"0") != 0){
|
||||
int a = 1;
|
||||
city = find_city(map,buf);
|
||||
if(road == NULL){
|
||||
printf("There is no road from city %s\n",buf);
|
||||
}else{
|
||||
for (road = city->roads; road != NULL; road=road->next) {
|
||||
if(a || road->length <= smallest_length){
|
||||
smallest_length = road->length;
|
||||
destination = road->destination->name;
|
||||
a=0;/*to set smallest length to some value*/
|
||||
}
|
||||
/*shortest road found*/
|
||||
}
|
||||
length = smallest_length;
|
||||
printf("Shortest road from city %s is to city %s: %d\n", buf, destination, length);
|
||||
}
|
||||
scanf("%s", buf);
|
||||
}
|
||||
free(city);
|
||||
free(road);
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
FILE *data_file = NULL;
|
||||
City *map = NULL;
|
||||
|
||||
/* Check arguments */
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf (stderr, "Usage: %s <datafile>\n", argv[0]);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Open data-file */
|
||||
if ((data_file = fopen (argv[1], "r")) == NULL)
|
||||
{
|
||||
fprintf (stderr, "Error opening file <%s>\n", argv[1]);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Create map-data-structure */
|
||||
if ((map = create_map (data_file)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "No map data found\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
print_city_roads (map);
|
||||
|
||||
find_shortest_roads (map);
|
||||
|
||||
/* Outit */
|
||||
if (data_file != NULL)
|
||||
fclose (data_file);
|
||||
if (map != NULL)
|
||||
delete_map (map);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Reference in New Issue
Block a user