Skip to content

Instantly share code, notes, and snippets.

@dsamarin
Created November 22, 2012 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dsamarin/4130485 to your computer and use it in GitHub Desktop.
Save dsamarin/4130485 to your computer and use it in GitHub Desktop.
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
struct node;
struct edge;
struct node {
char *name;
struct edge *edges;
};
struct edge {
struct node *node;
struct edge *next;
};
static struct edge * create_edge (struct node *to) {
struct edge *edge = malloc (sizeof *edge);
if (edge) {
edge->node = to;
edge->next = NULL;
}
return edge;
}
static void add_edge (struct edge **to, struct edge *edge) {
if (to && edge) {
edge->next = *to;
*to = edge;
}
}
int main (void) {
static char *elements[] = { "alpha", "bravo", "charlie", "delta" };
int size = sizeof elements / sizeof *elements;
struct node *nodes[size];
for (int i = 0; i < size; i++) {
nodes[i] = malloc (sizeof *nodes);
if (!nodes[i]) return EXIT_FAILURE;
nodes[i]->name = elements[i];
nodes[i]->edges = NULL;
}
for (int a = 0; a < size; a++) {
for (int b = a + 1; b < size; b++) {
char code;
int better, worse;
printf ("Which is better? [A]: %s [B]: %s $ ", nodes[a]->name, nodes[b]->name);
while (isspace (code = getchar ()));
code = tolower (code);
if (code == 'a') {
better = a;
worse = b;
} else if (code == 'b') {
better = b;
worse = a;
} else {
return EXIT_FAILURE;
}
add_edge (&nodes[better]->edges, create_edge (nodes[worse]));
}
}
for (int i = 0; i < size; i++) {
struct edge *edge;
printf ("\n%s is better than:\n", nodes[i]->name);
edge = nodes[i]->edges;
if (edge) {
while (edge) {
printf ("\t - %s\n", edge->node->name);
edge = edge->next;
}
} else {
puts ("\tjack-squat");
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment