.NET 4.x Двусвязный список - C#
Формулировка задачи:
Вот задание:
1. Считать из текстового файла исходные данные и на их основе создать необходимые объекты.
2. Разместить объекты в контейнере.
Языки программирования
Общее свойство: год разработки – короткое целое
1. Процедурные (наличие, отсутствие абстрактных типов данных – булевская величина)
2. Объектно-ориентированные (наследование: одинарное, множественное, интерфейса – перечислимый тип)
3. Функциональные языки (типизация – перечислимый тип = строгая, динамическая; поддержка «ленивых» вычислений – булевский тип)
Я имею представление,что такое двусвязный список, но написать его не знаю как.
Вот только что я смог сделать:
Я вроде как понял,что нужно создать еще класс и там "впихнуть" объекты в двусвязный список...но как именно это делается, не могу понять.
P.S.: Текстовый файл во вложении
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace text
{
class Program
{
static void Main(string[] args)
{
//string[] lines = File.ReadAllLines(@"..\..\TextFile1.txt", Encoding.Default); // чтение текстового файла
//foreach (string s in lines)
//{
// string[] data = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // разделитель
//}
Console.ReadKey();
}
}
class Proc : Base // класс процедурных языков
{
bool Atd; // наличие АТД
public Proc(short age, bool Atd)
{
this.age = age;
this.Atd = Atd;
}
public override string F()
{
return "Процедурный язык. Год: " + age + " АТД: " + Atd;
}
}
enum legacy { одинарное, множественное, интерфейс }
class Obj : Base // класс объектно=ориентированных языков
{
legacy d; //наследование
public Obj(short age, legacy d)
{
this.age = age;
this.d = d;
}
public override string F()
{
return "Объектный. Год: " + age + "Наследование: " + d;
}
}
enum tip { строгая, динамическая }
class Func : Base // класс функциональных языков
{
tip t; // типизация
bool lazy; //поддержка "ленивых" вычислений
public Func(short age, tip t, bool lazy)
{
this.age = age;
this.t = t;
this.lazy = lazy;
}
public override string F()
{
return "Функциональные. Год: " + age + "Типизация: " + t + "Леннивость: " + lazy;
}
}
abstract public class Base // главный класс (объединяет все)
{
public abstract string F(); // абстрактная функция
public short age { get; set; } // общее свойство(год разработки)
}
}Решение задачи: «.NET 4.x Двусвязный список»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace text
{
class Spisok
{
class Node
{
public Base data;
public Node next;
};
Node first;
Node last;
int R = 0;
public void Print()
{
Console.Write("Содержимое: \n");
for (Node cur = first; cur != null; cur = cur.next)
{
Console.WriteLine(cur.data.F());
}
Console.WriteLine();
}
public void Addi(Base value)
{
Node tmp = new Node();
tmp.data = value;
tmp.next = null;
if (first == null)
{
first = tmp;
last = tmp;
}
else
{
last.next = tmp;
last = tmp;
}
R++;
}
public void Remove()
{
if (first != null)
{
first = first.next;
if (first == null)
{
last = null;
}
}
R--;
}
public Base this[int i]
{
get
{
for (Node cur = first; cur != null; cur = cur.next, i--)
{
if (i == 0)
{
return cur.data;
}
}
return null;
}
set
{
for (Node cur = first; cur != null; cur = cur.next, i--)
{
if (i == 0)
{
cur.data = value;
}
}
}
}
public static void ReadFile(Spisok sp)
{
List<Base> s = new List<Base>();
try
{
StreamReader file = new StreamReader(@"..\..\TextFile1.txt", Encoding.Default);
while (!file.EndOfStream)
{
string[] data = file.ReadLine().Split(' ');
if (data[0] == "Proc")
{
sp.Addi(new Proc(Convert.ToInt16(data[1]), Convert.ToBoolean(data[2])));
}
else if (data[0] == "Obj")
{
if (data[2] == "одинарное")
{
sp.Addi(new Obj(Convert.ToInt16(data[1]), legacy.одинарное));
}
if (data[2] == "множественное")
{
sp.Addi(new Obj(Convert.ToInt16(data[1]), legacy.множественное));
}
if (data[2] == "интерфейс")
{
sp.Addi(new Obj(Convert.ToInt16(data[1]), legacy.интерфейс));
}
}
else if (data[0] == "Func")
{
if (data[2] == "строгая")
{
sp.Addi(new Func(Convert.ToInt16(data[1]), tip.строгая, Convert.ToBoolean(data[3])));
}
if (data[2] == "динамическая")
{
sp.Addi(new Func(Convert.ToInt16(data[1]), tip.динамическая, Convert.ToBoolean(data[3])));
}
}
}
}
catch(Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
}
}
}