// A simple program for tracking the players in a game
// A demonstration of some of the uses of a Linked List
// Marc Chee, April 2019 (marcchee@cse.unsw.edu.au)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 50
struct node {
struct node *next;
char name[MAX_NAME_LENGTH];
};
struct node *createNode (char newName[], struct node *newNext);
int printPlayers(struct node* listNode);
struct node *insert(struct node* listNode, char newName[]);
struct node *insertAlphabetical(struct node* head, char newName[]);
struct node *removeNode(struct node* head, char name[]);
void freeList(struct node *head);
int main(void) {
// create the list of players
struct node *head = NULL;
head = insertAlphabetical(head, "AndrewT");
head = insertAlphabetical(head, "Jashank");
head = insertAlphabetical(head, "Marc");
head = insertAlphabetical(head, "AndrewB");
head = insertAlphabetical(head, "-BPINK- Someone");
head = insertAlphabetical(head, "Tactical Marc");
head = insertAlphabetical(head, "COMP1511 Pass Cut-off");
// Old list creation code
/*
struct node *head = NULL;
head = insert(head, "AndrewT");
head = insert(head, "Jashank");
head = insert(head, "Marc");
head = insert(head, "AndrewB");
head = insert(head, "-BPINK- Someone");
head = insert(head, "Tactical Marc");
head = insert(head, "COMP1511 Pass Cut-off");
*/
/*
struct node *head = createNode("AndrewT", NULL);
head = createNode("Jashank", head);
head = createNode("Marc", head);
head = createNode("AndrewB", head);
head = createNode("-BPINK- Someone", head);
head = createNode("Tactical Marc", head);
head = createNode("COMP1511 Pass Cut-off", head);
*/
// A game loop that runs until only one player is left
while (printPlayers(head) > 1) {
printf("Who just got knocked out?\n");
char koName[MAX_NAME_LENGTH];
fgets(koName, MAX_NAME_LENGTH, stdin);
koName[strlen(koName) - 1] = '\0';
head = removeNode(head, koName);
}
printf("The winner is: %s\n", head->name);
freeList(head);
return 0;
}
// Create a node using the name and next pointer provided
// Return a pointer to this node
struct node *createNode(char newName[], struct node *newNext) {
struct node *n;
n = malloc(sizeof (struct node));
if (n == NULL) {
printf("Malloc failed, out of memory\n");
exit(1);
}
strcpy(n->name, newName);
n->next = newNext;
return n;
}
// Loop through the list and print out the player names
int printPlayers(struct node* listNode) {
printf("\nThe Players Left in the Game:\n");
int numPlayers = 0;
while (listNode != NULL) {
printf("%s\n", listNode->name);
listNode = listNode->next;
numPlayers++;
}
return numPlayers;
}
// Create and insert a new node into a list after a given listNode
struct node *insert(struct node* listNode, char newName[]) {
struct node *n = createNode(newName, NULL);
if (listNode == NULL) {
// List is empty, n becomes the only element in the list
listNode = n;
n->next = NULL;
} else {
n->next = listNode->next;
listNode->next = n;
}
return listNode;
}
// Insert a node alphabetically
// Return a pointer to the head (possibly a new node)
struct node *insertAlphabetical(struct node* head, char newName[]) {
struct node *previous = NULL;
struct node *n = head;
// Loop through the list and find the right place for the new name
while (n != NULL && newName[0] > n->name[0]) {
previous = n;
n = n->next;
}
struct node *insertionPoint = insert(previous, newName);
if(previous == NULL) {
// we inserted at the start of the list
insertionPoint->next = n;
return insertionPoint;
} else {
return head;
}
}
// Remove a node with the same name as the input string
struct node *removeNode(struct node* head, char name[]) {
struct node *previous = NULL;
struct node *n = head;
// Loop through to try to find the correct node
while (n != NULL && strcmp(name, n->name) != 0) {
previous = n;
n = n->next;
}
if (n != NULL) { // found the node
if (previous == NULL) { // it's the first node
head = n->next;
} else {
previous->next = n->next;
}
free(n);
}
return head;
}
// Loop through a list and free all the allocated memory
void freeList(struct node *head) {
while(head != NULL) {
// keep track of the current node
struct node *thisNode = head;
// move the looping pointer to the next node
head = head->next;
// free the current node
free(thisNode);
}
}
Resource created Tuesday 16 April 2019, 12:28:56 AM.
file: battleList.c