static void Main(string[] args) { int choice, dataType = ListElementTypeChoice(); GenericLinkedList <int> intList = new GenericLinkedList <int>(); GenericLinkedList <double> doubleList = new GenericLinkedList <double>(); GenericLinkedList <string> stringList = new GenericLinkedList <string>(); switch (dataType) { case 1: intList.CreateList(); break; case 2: doubleList.CreateList(); break; case 3: stringList.CreateList(); break; } while (true) { choice = GetMenuChoice(); if (choice is 12) { return; } switch (dataType) { case 1: AppOperations(intList, choice); break; case 2: AppOperations(doubleList, choice); break; case 3: AppOperations(stringList, choice); break; } WriteLine(); } }
static void AppOperations <T>(GenericLinkedList <T> aList, int choice) { int position; T data; object holder = null; switch (choice) { case 1: aList.Display(); break; case 2: Write("Enter the value of the node to be inserted: "); do { try { holder = Convert.ChangeType(ReadLine(), typeof(T)); } catch (Exception) { WriteLine($"Value entered must be {typeof(T).Name}.\n"); Write("Enter the value of the node to be inserted: "); } } while (holder is null); data = (T)holder; aList.InsertAtBeginning(data); break; case 3: Write("Enter the value of the node to be inserted: "); do { try { holder = Convert.ChangeType(ReadLine(), typeof(T)); } catch (Exception) { WriteLine($"Value entered must be {typeof(T).Name}.\n"); Write("Enter the value of the node to be inserted: "); } } while (holder is null); data = (T)holder; aList.InsertAtEnd(data); break; case 4: Write("Enter the value of the node to be inserted: "); do { try { holder = Convert.ChangeType(ReadLine(), typeof(T)); } catch (Exception) { WriteLine($"Value entered must be {typeof(T).Name}.\n"); Write("Enter the value of the node to be inserted: "); } } while (holder is null); data = (T)holder; Write("Enter the position where the node is to be inserted at: "); while (!int.TryParse(ReadLine(), out position)) { WriteLine("Value entered must be an integer.\n"); Write("Enter the position where the node is to be inserted at: "); } aList.InsertAtPosition(data, position); break; case 5: try { data = aList.DeleteFirstNode(); WriteLine($"Value of the node deleted was {data}."); } catch (InvalidOperationException ex) { WriteLine(ex.Message); } break; case 6: try { data = aList.DeleteLastNode(); WriteLine($"Value of the node deleted was {data}."); } catch (InvalidOperationException ex) { WriteLine(ex.Message); } break; case 7: try { Write("Enter the position where the node to be deleted is at: "); while (!int.TryParse(ReadLine(), out position)) { WriteLine("Value entered must be an integer.\n"); Write("Enter the position where the node to be deleted is at: "); } data = aList.DeleteNodeAtPosition(position); WriteLine($"Value of the node deleted was {data}."); } catch (InvalidOperationException ex) { WriteLine(ex.Message); } break; case 8: aList.ReverseList(); break; case 9: Write("Enter the value where a cycle should be inserted: "); do { try { holder = Convert.ChangeType(ReadLine(), typeof(T)); } catch (Exception) { WriteLine($"Value entered must be {typeof(T).Name}.\n"); Write("Enter the value of the node to be inserted: "); } } while (holder is null); data = (T)holder; aList.InsertCycle(data); break; case 10: if (aList.HasCycle()) { WriteLine("The current list has a cycle.\n"); } else { WriteLine("The current list doesn\'t have a cycle.\n"); } break; case 11: aList.RemoveCycle(); break; } WriteLine(); }