diff --git a/README.md b/README.md index b82802ae34f59d282a83088cb224ab9d685bd978..f6cf8d65bd192d1e65ce26ce47fc27bb4202f22b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # Assignment 4 - Interfaces, Stacks, Queues, Generics, and Merge Sort. Project uses Assignment 3 solution. -## Due: 11-10-2015 ## Author - +Brandon Rodriguez ## Description @@ -67,11 +66,12 @@ Be sure to think about what the time complexity for the bucket sort will be. Thi ## Outside Resources Used - +https://msdn.microsoft.com/en-us/library/y2ky8xsk%28v=vs.110%29.aspx +* Figured out exactly how the base CompareTo method works. ## Known Problems, Issues, And/Or Errors in the Program - +Appears to be functioning corerctly? ...maybe? ## Assignment 3 Description for reference diff --git a/cis237assignment4/Droid.cs b/cis237assignment4/Droid.cs index 0e16ea79cdd820f86e308e530753455aab09695a..eb749ef221b8234cf0f284eadcb42b36a811b632 100644 --- a/cis237assignment4/Droid.cs +++ b/cis237assignment4/Droid.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Abstract class for Droids. Handles "higher level" thinking/rules. @@ -20,7 +20,7 @@ namespace cis237assignment3 protected decimal totalCostDecimal; // Full cost of droid, including all extra features. protected decimal costPerFeatureDecimal = 10; // Standard cost per most features. protected int numberOfItemsInt; // Number of individual items influencing droid price. - + public string droidTypeString; // All the necessary variables for material selection. protected string selectedMaterialString; @@ -155,9 +155,9 @@ namespace cis237assignment3 /// </summary> public virtual void CalculateFeatures() { - selectedModelDecimal = 10; - selectedMaterialDecimal = 10; - selectedColorDecimal = 10; + selectedModelDecimal = costPerFeatureDecimal * 10; + selectedMaterialDecimal = costPerFeatureDecimal * 5; + selectedColorDecimal = costPerFeatureDecimal * 1; CalculateBaseCost(); } @@ -182,7 +182,22 @@ namespace cis237assignment3 Environment.NewLine; } + /// <summary> + /// Impliments CompareTo with droids, using the totalCost property. + /// </summary> + /// <param name="obj">Object to compare.</param> + /// <returns>Returns less than 0, 0, or greater than 0.</returns> + public int CompareTo(object obj) + { + Droid passedDroid = (Droid)obj; + decimal thisTotalCost = this.totalCostDecimal; + decimal passedTotalCost = passedDroid.totalCostDecimal; + return thisTotalCost.CompareTo(passedTotalCost); + } + #endregion + + } } diff --git a/cis237assignment4/DroidCollection.cs b/cis237assignment4/DroidCollection.cs index 205cc8aef5cbc21c47888a3fc2b9cf5c5b42b6ce..aeba207894fb19c85a921efa5dc99f520b384e9a 100644 --- a/cis237assignment4/DroidCollection.cs +++ b/cis237assignment4/DroidCollection.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { class DroidCollection { @@ -80,8 +80,8 @@ namespace cis237assignment3 tempArray[indexInt] = droidCollection[indexInt]; indexInt++; } - droidCollection = tempArray; } + droidCollection = tempArray; } #endregion @@ -118,6 +118,94 @@ namespace cis237assignment3 } } + /// <summary> + /// Attempt at bucket sort. + /// </summary> + public void SortBucket() + { + GenericLinkedList<IDroid> Protocol_Stack = new GenericLinkedList<IDroid>(); + GenericLinkedList<IDroid> Utility_Stack = new GenericLinkedList<IDroid>(); + GenericLinkedList<IDroid> Janitor_Stack = new GenericLinkedList<IDroid>(); + GenericLinkedList<IDroid> Astromech_Stack = new GenericLinkedList<IDroid>(); + + GenericLinkedList<IDroid> Droid_Queue = new GenericLinkedList<IDroid>(); + + indexInt = 0; + while (indexInt < droidListSizeInt) + { + switch (((Droid)droidCollection[indexInt]).droidTypeString) + { + case "Protocol": + Protocol_Stack.Add(droidCollection[indexInt]); + break; + case "Utility": + Utility_Stack.Add(droidCollection[indexInt]); + break; + case "Janitor": + Janitor_Stack.Add(droidCollection[indexInt]); + break; + case "Astromech": + Astromech_Stack.Add(droidCollection[indexInt]); + break; + } + indexInt++; + } + + // Technically not needed, but added to be able to see that the list is empty before being popped off the queue. For debugging purposes. Remove in final version. + indexInt = 0; + while (indexInt < droidListSizeInt) + { + droidCollection[indexInt] = null; + indexInt++; + } + + + // Take droids off stacks. + while (Astromech_Stack.HeadNode != null) + { + Droid_Queue.Add(Astromech_Stack.HeadNode.Data); + Astromech_Stack.Delete(1); + } + + while (Janitor_Stack.HeadNode != null) + { + Droid_Queue.Add(Janitor_Stack.HeadNode.Data); + Janitor_Stack.Delete(1); + } + + while (Utility_Stack.HeadNode != null) + { + Droid_Queue.Add(Utility_Stack.HeadNode.Data); + Utility_Stack.Delete(1); + } + + while (Protocol_Stack.HeadNode != null) + { + Droid_Queue.Add(Protocol_Stack.HeadNode.Data); + Protocol_Stack.Delete(1); + } + + + // Pop off queue and back into array. + // Probably currently works as a stack. Likely in reversed order right now. Fix later. + indexInt = 0; + while (Droid_Queue.HeadNode != null) + { + droidCollection[indexInt] = Droid_Queue.HeadNode.Data; + Droid_Queue.Delete(1); + indexInt++; + } + + } + + /// <summary> + /// Attempt at merged sort. + /// </summary> + public void SortMergedSort() + { + MergedSort.Sort(droidCollection, droidListSizeInt); + } + #endregion } diff --git a/cis237assignment4/Droid_Astromech.cs b/cis237assignment4/Droid_Astromech.cs index a2151289dedf17d92a5cfc14ab8324e14f6e5ccb..37c706d9a50c1d8d852dab9041b5f6cea481b09f 100644 --- a/cis237assignment4/Droid_Astromech.cs +++ b/cis237assignment4/Droid_Astromech.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Class for Droids of type Astromech. @@ -53,6 +53,7 @@ namespace cis237assignment3 HasFireExtinguisher = hasFireExtinguisher; NumberOfShips = numberOfShips; numberOfItemsInt = 8; + droidTypeString = "Astromech"; } #endregion diff --git a/cis237assignment4/Droid_Janitor.cs b/cis237assignment4/Droid_Janitor.cs index 15f4fd8f97548db7b7184042cbe6644c9e5a0dd0..178f9e17a68f6c5a472d3cd35423868c8e88bbd9 100644 --- a/cis237assignment4/Droid_Janitor.cs +++ b/cis237assignment4/Droid_Janitor.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Class for Droids of type Janitor. @@ -53,6 +53,7 @@ namespace cis237assignment3 HasTrashCompactor = hasTrashCompactor; HasVacuum = hasVacuum; numberOfItemsInt = 8; + droidTypeString = "Janitor"; } #endregion diff --git a/cis237assignment4/Droid_Protocol.cs b/cis237assignment4/Droid_Protocol.cs index f492d49905ff994ac54728e0d3e385e71d438bd2..7f9c8f0da45eef1e3f8bc6fc25510c01b5661f5e 100644 --- a/cis237assignment4/Droid_Protocol.cs +++ b/cis237assignment4/Droid_Protocol.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Class for Droids of type Protocol. @@ -52,6 +52,7 @@ namespace cis237assignment3 { NumberOfLanguages = numberOfLanguages; numberOfItemsInt = 4; + droidTypeString = "Protocol"; } #endregion diff --git a/cis237assignment4/Droid_Utility.cs b/cis237assignment4/Droid_Utility.cs index a76a9fbca178ce65037515c82943c33fc7ef1891..75aaead54c6b4c74fb2f7410fd63f9ff2476cdf4 100644 --- a/cis237assignment4/Droid_Utility.cs +++ b/cis237assignment4/Droid_Utility.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Class for Droids of type Utility. @@ -54,6 +54,7 @@ namespace cis237assignment3 HasComputerConnection = hasComputerConnection; HasArm = hasArm; numberOfItemsInt = 6; + droidTypeString = "Utility"; } #endregion diff --git a/cis237assignment4/GenericLinkedList.cs b/cis237assignment4/GenericLinkedList.cs new file mode 100644 index 0000000000000000000000000000000000000000..aeb130d2f5fecc73e8e713d61ac0220c1fdb5463 --- /dev/null +++ b/cis237assignment4/GenericLinkedList.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cis237assignment4 +{ + /// <summary> + /// Code coppied over from inclass. Too tired to be able to figure out how it works. Seems to function correctly? + /// I think it currently functions as a stack....maybe. O..or is it a queue? Confused. Can't decipher code. + /// </summary> + /// <typeparam name="T"></typeparam> + class GenericLinkedList<T> + { + + #region Variables + + //private GenericNode<T> headNode; // First position in list. ...not needed? Not sure where we establish head node without this variable. + private GenericNode<T> currentNode; // Current position in list. + private GenericNode<T> lastNode; // Last position in list? + + #endregion + + + #region Constructor + + public GenericLinkedList() + { + HeadNode = null; + } + + #endregion + + + #region Properties + + public GenericNode<T> HeadNode + { + set; + get; + } + + #endregion + + + #region Methods + + public void Add(T content) + { + GenericNode<T> node = new GenericNode<T>(); + + node.Data = content; + + if (HeadNode == null) + { + HeadNode = node; + } + else + { + lastNode.Next = node; + } + lastNode = node; + } + + public bool Delete(int Position) + { + currentNode = HeadNode; + if (Position == 1) + { + HeadNode = currentNode.Next; + currentNode.Next = null; + currentNode = null; + return true; + } + else + { + if (Position > 1) + { + GenericNode<T> tempNode = HeadNode; + GenericNode<T> previousTempNode = null; + + int count = 0; + while (tempNode != null) + { + if (count == Position - 1) + { + previousTempNode.Next = tempNode.Next; + + if (tempNode.Next == null) + { + lastNode = previousTempNode; + } + + tempNode.Next = null; + return true; + } + count++; + previousTempNode = tempNode; + tempNode = tempNode.Next; + } + } + } + return false; + } + + public GenericNode<T> Retrieve(int Position) + { + GenericNode<T> tempNode = HeadNode; + GenericNode<T> returnNode = null; + + int count = 0; + while (tempNode != null) + { + if (count == Position - 1) + { + return tempNode; + break; // ...why is there a break after a return? Doesn't make sense. + } + count++; + tempNode = tempNode.Next; + } + return returnNode; + } + + #endregion + } +} diff --git a/cis237assignment4/GenericNode.cs b/cis237assignment4/GenericNode.cs new file mode 100644 index 0000000000000000000000000000000000000000..b8a5d5981eda6e4d0fe7d1b7aef308da1de9365f --- /dev/null +++ b/cis237assignment4/GenericNode.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cis237assignment4 +{ + class GenericNode<T> + { + public GenericNode<T> Next + { + set; + get; + } + + public T Data + { + set; + get; + } + } +} diff --git a/cis237assignment4/IDroid.cs b/cis237assignment4/IDroid.cs index 8e2783adc934ede9acaca099cbd1c6e3016fc3b6..4963f98f2143f4af0a502390c22e2f0fac319d0d 100644 --- a/cis237assignment4/IDroid.cs +++ b/cis237assignment4/IDroid.cs @@ -6,13 +6,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Interface for all droid objects. /// Acts as a "universal blueprint/contract" of sorts. /// </summary> - interface IDroid + interface IDroid : IComparable { /// <summary> /// Calculates total cost of droid. diff --git a/cis237assignment4/MergedSort.cs b/cis237assignment4/MergedSort.cs new file mode 100644 index 0000000000000000000000000000000000000000..68b3f403c9309c146e71c3a409228c754becab27 --- /dev/null +++ b/cis237assignment4/MergedSort.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cis237assignment4 +{ + class MergedSort + { + private static IDroid[] tempArray; + + /// <summary> + /// Creates the temp array and starts the recursive mergeSorting. + /// </summary> + /// <param name="droidCollection">Collection of Droids to sort.</param> + /// <param name="sizeInt">Total size of collection.</param> + public static void Sort(IDroid[] droidCollection, int sizeInt) + { + tempArray = new IDroid[sizeInt]; + SortArray(droidCollection, 0, sizeInt - 1); + } + + /// <summary> + /// First half of recursion. + /// "Sorts" the array by dividing it up into smaller and smaller sections. + /// </summary> + /// <param name="droidCollection">Passed in collection of Droids to sort.</param> + /// <param name="lowInt">Current low int of section.</param> + /// <param name="highInt">Current high int of section.</param> + private static void SortArray(IDroid[] droidCollection, int lowInt, int highInt) + { + // If higher is less or equal to lower, then back out of recursion to stop sorting (that specific section). + if (highInt <= lowInt) + { + return; + } + + int midInt = lowInt + (highInt - lowInt) / 2; // Determine middle int. Not sure why it uses an average plus low? + SortArray(droidCollection, lowInt, midInt); // Sort left half. + SortArray(droidCollection, midInt + 1, highInt); // Sort right half. + MergeArray(droidCollection, lowInt, midInt, highInt); // Combined separated sections. + + } + + /// <summary> + /// Merges the separated sections back into a fully sorted array. + /// </summary> + /// <param name="droidCollection">Passed in collection of Droids to sort.</param> + /// <param name="lowInt">Current low int of section.</param> + /// <param name="midInt">Current middle int of section.</param> + /// <param name="hightInt">Current high int of section.</param> + private static void MergeArray(IDroid[] droidCollection, int lowInt, int midInt, int hightInt) + { + int leftHolder = lowInt; + int rightHolder = midInt + 1; + + for (int index = lowInt; index <= hightInt; index++) + { + if (droidCollection[index] != null) + { + tempArray[index] = droidCollection[index]; + } + } + + for (int index = lowInt; index <= hightInt; index++) + { + // If left side is done but right is not. + if (leftHolder > midInt) + { + droidCollection[index] = tempArray[rightHolder++]; + } + else + { + // If right side is done but left is not. + if (rightHolder > hightInt) + { + droidCollection[index] = tempArray[leftHolder++]; + } + // Else actually compare the current left holder and right holder values. + else + { + if (tempArray[rightHolder].CompareTo(tempArray[leftHolder]) <= 0) + { + droidCollection[index] = tempArray[rightHolder++]; + } + else + { + droidCollection[index] = tempArray[leftHolder++]; + } + } + } + } + } + } +} diff --git a/cis237assignment4/Program.cs b/cis237assignment4/Program.cs index 6e1ec0a6c5ad2dcd3ae70c8842e4e4a2df074c7b..6fd3bbd5e036a70f9f132c69b9d5fe141c3cb0d6 100644 --- a/cis237assignment4/Program.cs +++ b/cis237assignment4/Program.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { class Program { diff --git a/cis237assignment4/RunProgram.cs b/cis237assignment4/RunProgram.cs index 05d8fbd283682759ae8a83910339d59d37c71726..4717c54e516da2e56e7e953e38d711b6d7579689 100644 --- a/cis237assignment4/RunProgram.cs +++ b/cis237assignment4/RunProgram.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Handles main operations of program. @@ -71,6 +71,7 @@ namespace cis237assignment3 private void Run() { ResetList(); + AddTestingDroids(); while (runProgram) { // Resets/initializes menu bool to allow user to stay in menus. @@ -82,6 +83,92 @@ namespace cis237assignment3 } } + /// <summary> + /// Force create a bunch of droids on start for testing. Purposely in random order, both in DROID_TYPE and cost. + /// </summary> + private void AddTestingDroids() + { + droidCollection.AddDroid(new Droid_Astromech("Tin", "TI-84", "White", true, false, true, false, 1)); + droidCollection.DroidList[0].CalculateFeatures(); + droidCollection.DroidList[0].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Astromech("Steel", "CAT5", "Black", false, true, false, true, 3)); + droidCollection.DroidList[1].CalculateFeatures(); + droidCollection.DroidList[1].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Protocol("Tin", "TI-84", "White", 1)); + droidCollection.DroidList[2].CalculateFeatures(); + droidCollection.DroidList[2].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Protocol("Steel", "CAT5", "Black", 3)); + droidCollection.DroidList[3].CalculateFeatures(); + droidCollection.DroidList[3].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Protocol("Titanium", "M7", "Blue", 7)); + droidCollection.DroidList[4].CalculateFeatures(); + droidCollection.DroidList[4].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Janitor("Tin", "TI-84", "White", true, false, true, false, true)); + droidCollection.DroidList[5].CalculateFeatures(); + droidCollection.DroidList[5].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Janitor("Steel", "CAT5", "Black", false, true, false, true, false)); + droidCollection.DroidList[6].CalculateFeatures(); + droidCollection.DroidList[6].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Utility("Unobtanium", "M7", "Green", true, false, true)); + droidCollection.DroidList[7].CalculateFeatures(); + droidCollection.DroidList[7].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Janitor("Titanium", "M7", "Blue", true, true, true, true, true)); + droidCollection.DroidList[8].CalculateFeatures(); + droidCollection.DroidList[8].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Protocol("Mythril", "TI-84", "Red", 15)); + droidCollection.DroidList[9].CalculateFeatures(); + droidCollection.DroidList[9].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Protocol("Unobtanium", "M7", "Green", 1)); + droidCollection.DroidList[10].CalculateFeatures(); + droidCollection.DroidList[10].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Utility("Tin", "TI-84", "White", true, false, true)); + droidCollection.DroidList[11].CalculateFeatures(); + droidCollection.DroidList[11].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Utility("Steel", "CAT5", "Black", false, true, false)); + droidCollection.DroidList[12].CalculateFeatures(); + droidCollection.DroidList[12].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Astromech("Mythril", "TI-84", "Red", false, false, false, false, 7)); + droidCollection.DroidList[13].CalculateFeatures(); + droidCollection.DroidList[13].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Astromech("Unobtanium", "M7", "Green", true, false, true, false, 9)); + droidCollection.DroidList[14].CalculateFeatures(); + droidCollection.DroidList[14].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Utility("Titanium", "M7", "Blue", true, true, true)); + droidCollection.DroidList[15].CalculateFeatures(); + droidCollection.DroidList[15].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Utility("Mythril", "TI-84", "Red", false, false, false)); + droidCollection.DroidList[16].CalculateFeatures(); + droidCollection.DroidList[16].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Janitor("Mythril", "TI-84", "Red", false, false, false, false, false)); + droidCollection.DroidList[17].CalculateFeatures(); + droidCollection.DroidList[17].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Janitor("Unobtanium", "M7", "Green", true, false, true, false, true)); + droidCollection.DroidList[18].CalculateFeatures(); + droidCollection.DroidList[18].CalculateTotalCost(); + + droidCollection.AddDroid(new Droid_Astromech("Titanium", "M7", "Blue", true, true, true, true, 5)); + droidCollection.DroidList[19].CalculateFeatures(); + droidCollection.DroidList[19].CalculateTotalCost(); + } + /// <summary> /// Handles Main Menu Selection. /// </summary> @@ -102,6 +189,9 @@ namespace cis237assignment3 ResetList(); break; case "5": + SortList(); + break; + case "6": Exit(); break; case "esc": @@ -113,6 +203,23 @@ namespace cis237assignment3 } } + private void SortList() + { + UserInterface.Menus.DisplaySorting(); + userInputString = UserInterface.GetUserInput(); + switch (userInputString) + { + case "1": + droidCollection.SortBucket(); + break; + case "2": + droidCollection.SortMergedSort(); + break; + case "esc": + break; + } + } + /// <summary> /// User selection to add a new droid to list. /// </summary> diff --git a/cis237assignment4/UserInterface.cs b/cis237assignment4/UserInterface.cs index fa4c614d7421c8cb0651e465db6ca77a92a3596c..1648c5295cb66c6d6b8642eccf4584a056d9f5f0 100644 --- a/cis237assignment4/UserInterface.cs +++ b/cis237assignment4/UserInterface.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cis237assignment3 +namespace cis237assignment4 { /// <summary> /// Handles all display to user and reading of user input. @@ -158,7 +158,19 @@ namespace cis237assignment3 " 2) Display Full Reciept" + Environment.NewLine + " 3) Display Single Item" + Environment.NewLine + " 4) New Customer" + Environment.NewLine + - " 5) Exit"); + " 5) Sort Stuff" + Environment.NewLine + + " 6) Exit"); + } + + public static void DisplaySorting() + { + ResetMenuDisplay(); + + Console.WriteLine( + " Sorting type:" + Environment.NewLine + + " 1) Sort by Type (Bucket Sort)" + + " 2) Sort by Cost (Merged Sort)" + ); } /// <summary> diff --git a/cis237assignment4/cis237assignment4.csproj b/cis237assignment4/cis237assignment4.csproj index 99c404d8f0f7badd1a683905822c70fb15a0bd6c..b2ff7df90c71627b62b36fa5cc8ad6125ff5b812 100644 --- a/cis237assignment4/cis237assignment4.csproj +++ b/cis237assignment4/cis237assignment4.csproj @@ -47,7 +47,10 @@ <Compile Include="Droid_Janitor.cs" /> <Compile Include="Droid_Protocol.cs" /> <Compile Include="Droid_Utility.cs" /> + <Compile Include="GenericLinkedList.cs" /> + <Compile Include="GenericNode.cs" /> <Compile Include="IDroid.cs" /> + <Compile Include="MergedSort.cs" /> <Compile Include="Program.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="RunProgram.cs" />