Doubly Linked List is a dynamic data Structure which can grow or shrink in size at runtime. It have 2 pointers to navigate forward and in direction in the list unlike Singly Linked List where we have only 1 pointer to move only in forward direction in the list.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DoublyLinkedList
{
class Node
{
public int Data;
public Node Next;
public Node prev;
}
class List
{
Node Start;
public List()
{
Start = null;
}
/// <summary>
/// Traversing through the List
/// </summary>
public void Traverse()
{
Node current;
current = Start;
if (current == null)
{
Console.WriteLine("List is Empty");
}
while (current != null)
{
Console.Write(current.Data + " - ");
current = current.Next;
}
}
/// <summary>
/// Adding a node in List
/// </summary>
public void Add()
{
int num;
Console.WriteLine("Enter value to Enter");
num = Convert.ToInt32(Console.ReadLine());
Node newNode = new Node();
newNode.Data = num;
if (Start == null)
{
newNode.Next = null;
newNode.prev = null;
Start = newNode;
}
else
{
Node current = Start;
while ((current.Next != null) && (current.Data < newNode.Data))
{
current = current.Next;
}
if ((current.Next == null) && (newNode.Data>current.Data))
{
//Insertion at the end of list
newNode.Next = null;
current.Next = newNode;
newNode.prev = current;
}
else if (current == Start)
{
//Insertion in the beginning of list
newNode.prev = null;
newNode.Next = Start;
Start.prev = newNode;
Start = newNode;
}
else if (current.Next != null)
{
//Insertion somewhere in the middle of List
newNode.Next = current;
newNode.prev = current.prev;
current.prev.Next = newNode;
current.prev = newNode;
}
}
}
/// <summary>
/// Delete a node from List
/// </summary>
public void Delete()
{
Console.WriteLine("Enter Item to Delete");
int num = Convert.ToInt32(Console.ReadLine());
Node current = Start;
if (current == null)
{
Console.WriteLine("List is Empty");
}
else
{
while ((current != null) && (current.Data != num))
{
current = current.Next;
}
if (current == null)
{ Console.WriteLine("Not Found"); }
else if ((current == Start) && (current.Next==null))
{
//Deletion of the only node of the list
Start = null;
}
else if (current == Start)
{
//Deletion from the beginning of list
Start = Start.Next;
Start.prev = null;
}
else if ((current != Start) && (current.Next == null))
{
//Deletion from the end of list
current = current.prev;
current.Next = null;
}
else
{
//somewhere from the middle of list
current.prev.Next = current.Next;
current.Next.prev = current.prev;
}
}
Console.WriteLine("-----------------------------------------");
Traverse();
}
}
class Program
{
static void Main(string[] args)
{
List MyList = new List();
while (true)
{
Console.WriteLine("\nMenu");
Console.WriteLine("1. Add a Record");
Console.WriteLine("2. Traverse");
Console.WriteLine("3. Delete");
Console.WriteLine("4. Exit");
Console.Write("Your Option :: ");
char ch = Convert.ToChar(Console.ReadLine());
switch (ch)
{
case '1':
MyList.Add();
break;
case '2':
MyList.Traverse();
break;
case '3':
MyList.Delete();
break;
case '4':
return;
default:
Console.WriteLine("Invalid Option");
break;
}
}
}
}
}