Files
stgsharp/源代码/.Net Framework/StgSharp/StgSharp_Logic/LinkedList.cs
T

126 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StgSharp_Logic
{
public class LinkedList
{
private LinkedTarget _heading;
private LinkedTarget _ending;
private LinkedTarget _cache;
private Counter<int> _amountCounter;
public LinkedTarget Heading
{
get { return _heading; }
set { _heading = value; }
}
public LinkedTarget Ending
{
get { return _ending; }
set { _ending = value; }
}
public LinkedTarget Cache
{
get { return _cache; }
set { _cache = value; }
}
public Counter<int> AmountCounter
{
get { return _amountCounter; }
set { _amountCounter = value; }
}
//构造器
public LinkedList(Counter<int> counter)
{
this._amountCounter = counter;
_amountCounter.Value = 0;
_ending = null;
_heading = null;
}
public void Add(LinkedTarget target)
{
if (_ending != null)
{
_ending.Next = target;
target.Previous = _ending;
_ending = target;
_amountCounter.Value++;
}
else
{
_heading = target;
_heading.Previous = null;
_ending = target;
_ending.Next = null;
}
}
/// <summary>
/// 根据序号删除一个链表成员。
/// </summary>
/// <param name="id"></param>
public void Remove(int id)
{
_cache = null;
for (int i = 1; i < id; i++)
{
_cache = _cache.Next;
}
_cache.Previous = _cache.Next;
_cache.Next = _cache.Previous;
_cache.Next = null;
_cache.Previous = null;
_cache = null;
_amountCounter.Value--;
}
/// <summary>
/// 快速删除链表中已知名称的一个实例。由于不能判别实例是否存在于链表中故安全性较低。在对安全性有要求的情况下应当使用Remove_s方法。
/// </summary>
/// <param name="target"></param>
public void Remove(LinkedTarget target)
{
target.Previous = target.Next;
target.Next = target.Previous;
target.Previous = null;
target.Next = null;
_amountCounter.Value--;
}
/// <summary>
/// 该方法用于防止传入不属于该链表的实例。
/// </summary>
/// <param name="target"></param>
/// <exception cref="Exception"></exception>
public void Remove_s(LinkedTarget target)
{
bool a = true;
_cache = _heading;
for (int i = 0; _cache.Next != null ; i++)
{
if (_cache==target)
{
Remove(target);
a = true;
_amountCounter.Value--;
}
}
if (a)
{
throw new Exception("Target can not be found in this List!");
}
}
}
}