Overview

This lab is calisthenics for linked lists. These exercises are just there to get you comfortable with creating and traversing lists.
You will need the following files: in00.txt, in01.txt, in02.txt, in03.txt, in04.txt.

Part 1: Super-simple linked list

Your Part 1 program will read in strings from a file and print them in reverse order (which happens naturally if you use our good friend add2front) along with the count of the number of elements in the list. The filename is input by the user, and you must print an error message and exit if the file isn't found. You must use a linked list for this. If you just declare a giant array and hope it's big enough, your poor instructor will be really discouraged.
~/$ ./part1
Input file is: in00.txt
count is 8
the a cat dog sounds is smelly flatulent
~/$ ./part1
Input file is: in01.txt
count is 23
a let my ring of the fire truth way is that a better scary golden ring the left sight ring out highway alone 
~/$ ./part1
Input file is: asdf
Error! File 'asdf' not found!

Part 2: Linked lists are the same no matter what the data

Your Part 2 program is just like your Part 1 solution, except your data no longer consists of a single word, but rather of a word and an integer value (think of it as "points" for that word). This will be represented in both input and output as (word value). If you do this elegantly, you'll make a new struct for representing pairs and make that the type of data rather than mucking up Node with multiple data members representing "the data". This reinforces the fundamental idea that linked lists are the same no matter what kind of data you put in them.
~/$ ./part2
Input file is: in02.txt
count is 8
(the 1) (a 1) (cat 2) (dog 2) (sounds 2) (is 1) (smelly 3) (flatulent 5) 
~/$ ./part2
Input file is: in03.txt
count is 23
(a 1) (let 3) (my 2) (ring 3) (of 1) (the 1) (fire 3) (truth 3) (way 2) (is 1) (that 1) (a 1) (better 3) (scary 4) (golden 4) (ring 3) (the 1) (left 2) (sight 3) (ring 3) (out 2) (highway 4) (alone 3)

Part 2.5: Split into multiple files!

Hopefully you have written a nice program with multiple structs and nicely chosen functions so that main() is simple and beautiful. Now break this into multiple files: a .cpp for main, a .h for your structs and protptypes, and a .cpp for your function definitions.

Part 3: The user iterates through the list

In the Part 3 program, we let the user move through the list. At each step we print out The user is asked to either "accept" or "reject" the current word/value pair, though we don't actually act on that until Part 5. After the user has gone through the whole list, we print the entire list all at once.
~/$ ./part3
Input file is: in04.txt

Before is: 
Current is: (the 1)
Number after is: 3
[a]ccept or [r]eject: a

Before is: (the 1) 
Current is: (dog 2)
Number after is: 2
[a]ccept or [r]eject: a

Before is: (the 1) (dog 2) 
Current is: (is 1)
Number after is: 1
[a]ccept or [r]eject: a

Before is: (the 1) (dog 2) (is 1) 
Current is: (smelly 3)
Number after is: 0
[a]ccept or [r]eject: a

List is: (the 1) (dog 2) (is 1) (smelly 3)

Part 4: Print pretty & count the score

Your Part 4 program should do just what your Part 3 program did, except that once the user has iterated through the word/value pairs, the program prints out the words of the list only (in order) and separately prints out the sum of all the point values in the list. Use functions to keep your code beautiful!
~/$ ./part4
Input file is: in04.txt

Before is: 
Current is: (the 1)
Number after is: 3
[a]ccept or [r]eject: a

Before is: (the 1) 
Current is: (dog 2)
Number after is: 2
[a]ccept or [r]eject: a

Before is: (the 1) (dog 2) 
Current is: (is 1)
Number after is: 1
[a]ccept or [r]eject: a

Before is: (the 1) (dog 2) (is 1) 
Current is: (smelly 3)
Number after is: 0
[a]ccept or [r]eject: a

List is: the dog is smelly 
Score is: 7

Part 5: Going Further — Making it interesting

In Part 5 we finally acheive what the other stuff was really working toward: a really stupid word game! Now whatever the user [a]ccepts is retained and what the user [r]ejects is thrown out. The goal is, once you're through the list, to have a sentence that makes sense and maximizes the score. As you go along, the "Before is:" message should print only the words [a]ccepted so far, in order. Just the words, mind you, not their point values.

Note: you have two choices for making this work. The first is to actually remove the node for the [r]ejected word from the list. The second is to keep a separate list consisting of the [a]ccepted words. Both have their challenges!

~/$ ./part5
Input file is: in02.txt

Before is: 
Current is: (the 1)
Number after is: 7
[a]ccept or [r]eject: a

Before is: the 
Current is: (a 1)
Number after is: 6
[a]ccept or [r]eject: r

Before is: the 
Current is: (cat 2)
Number after is: 5
[a]ccept or [r]eject: r

Before is: the 
Current is: (dog 2)
Number after is: 4
[a]ccept or [r]eject: a

Before is: the dog 
Current is: (sounds 2)
Number after is: 3
[a]ccept or [r]eject: a

Before is: the dog sounds 
Current is: (is 1)
Number after is: 2
[a]ccept or [r]eject: r

Before is: the dog sounds 
Current is: (smelly 3)
Number after is: 1
[a]ccept or [r]eject: r

Before is: the dog sounds 
Current is: (flatulent 5)
Number after is: 0
[a]ccept or [r]eject: a

List is: the dog sounds flatulent 
Score is: 10