1 | <P> </P> |
2 | 雙向鏈表的算法描述和單向鏈基本相同,但是雙向鏈表在刪除和插入時與單向鏈表有很大的不同。 |
1 | 雙向鏈表在刪除結點時,不但要修改結點的直接后繼指針,還要同時修改結點的直接前驅指針。 |
1 | 在插入時更是要修改插入結點的前驅和后繼的兩個方向上的指針。具體代碼如下: |
01 | public class Objects |
02 | { |
03 | private int number; |
04 | private string name; |
05 | private int counter; |
06 | //構造函數 |
07 | public Objects( int num, string Name, int count) |
08 | { |
09 | number = num; |
10 | name = Name; |
11 | counter = count; |
12 | } |
13 | public int Number |
14 | { |
15 | get |
16 | { |
17 | return number; |
18 | } |
19 | set |
20 | { |
21 | number = value; |
22 | } |
23 | } |
24 | public string Name |
25 | { |
26 | get |
27 | { |
28 | return name; |
29 | } |
30 | set |
31 | { |
32 | name = value; |
33 | } |
34 | } |
35 | public int Counter |
36 | { |
37 | get |
38 | { |
39 | return counter; |
40 | } |
41 | set |
42 | { |
43 | counter = value; |
44 | } |
45 | } |
46 | } |
//結點類
public class ListNode
{
public ListNode(Objects bugs)
{
goods = bugs;
}
/**/
/// <summary>
/// 前一個
/// </summary>
public ListNode Previous;
/**/
/// <summary>
/// 后一個
/// </summary>
public ListNode Next;
public ListNode next
{
get
{
return Next;
}
set
{
Next = value;
}
}
/**/
/// <summary>
/// 值
/// </summary>
public Objects goods;
public Objects Goods
{
get
{
return goods;
}
set
{
goods = value;
}
}
}
在asp.net 中的雙向鏈表的實現
定義鏈表中的節點的代碼如下。
pic class Clists
{
public Clists()
{
//構造函數
//初始化
ListCountValue = 0;
Head = null;
Tail = null;
}
/**/
/// <summary>
/// 表名
/// </summary>
private string clistname = "";
public string ClistName
{
get
{
return clistname;
}
set
{
clistname = value;
}
}
/**/
/// <summary>
/// 頭指針
/// </summary>
private ListNode Head;
/**/
/// <summary>
/// 尾指針
/// </summary>
private ListNode Tail;
/**/
/// <summary>
/// 當前指針
/// </summary>
private ListNode Current;
public ListNode current
{
get
{
return Current;
}
set
{
Current = value;
}
}
/**/
/// <summary>
/// 鏈表數據的個數
/// </summary>
private int ListCountValue;
在鏈表尾部添加數據的實現代碼如下。
/**/
/// <summary>
/// 尾部添加數據
/// </summary>
public void Append(Objects DataValue)
{
ListNode NewNode = new ListNode(DataValue);
if (IsNull())
//如果頭指針為空
{
Head = NewNode;
Tail = NewNode;
}
else
{
Tail.Next = NewNode;
NewNode.Previous = Tail;
Tail = NewNode;
}
Current = NewNode;
//鏈表數據個數加一
ListCountValue += 1;
}
刪除當前數據的實現代碼如下。
/**/
/// <summary>
/// 刪除當前的數據
/// </summary>
public void Delete()
{
//若為空鏈表
if (!IsNull())
{
//若刪除頭
if (IsBof())
{
Head = Current.Next;
Current = Head;
ListCountValue -= 1;
return;
}
//若刪除尾
if (ISEOf())
{
Tail = Current.Previous;
Tail.next = null;
Current = Tail;
ListCountValue -= 1;
return;
}
//若刪除中間數據
Current.Previous.Next = Current.Next;
Current = Current.Previous;
ListCountValue -= 1;
return;
}
}
/**/
/// <summary>
/// 向后移動一個數據
/// </summary>
public void MoveNext()
{
if (!IsEof()) Current = Current.Next;
}
/**/
/// <summary>
/// 向前移動一個數據
/// </summary>
public void MovePrevious()
{
if (!IsBof()) Current = Current.Previous;
}
/**/
/// <summary>
/// 移動到第一個數據
/// </summary>
public void MoveFrist()
{
Current = Head;
}
/**/
/// <summary>
/// 移動到最后一個數據
/// </summary>
public void MoveLast()
{
Current = Tail;
}
/**/
/// <summary>
/// 判斷是否為空鏈表
/// </summary>
public bool IsNull()
{
if (ListCountValue == 0)
return true;
else
return false;
}
/**/
/// <summary>
/// 判斷是否為到達尾部
/// </summary>
public bool IsEof()
{
if (Current == Tail)
return true;
else
return false;
}
/**/
/// <summary>
/// 判斷是否為到達頭部
/// </summary>
public bool IsBof()
{
if (Current == Head)
return true;
else
return false;
}
public Objects GetCurrentValue()
{
return Current.goods;
}
/**/
/// <summary>
/// 取得鏈表的數據個數
/// </summary>
public int ListCount
{
get
{
return ListCountValue;
}
}
清空鏈表的實現代碼如下。
/**/
/// <summary>
/// 清空鏈表
/// </summary>
public void Clear()
{
MoveFrist();
while (!IsNull())
{
//若不為空鏈表,從尾部刪除
Delete();
}
}
在當前位置前插入數據的代碼如下。
/// <summary>
/// 在當前位置前插入數據
/// </summary>
public void Insert(Objects DataValue)
{
ListNode NewNode = new ListNode(DataValue);
if (IsNull())
{
//為空表,則添加
Append(DataValue);
return;
}
if (IsBof())
{
//為頭部插入
NewNode.Next = Head;
Head.Previous = NewNode;
Head = NewNode;
Current = Head;
ListCountValue += 1;
return;
}
//中間插入
NewNode.Next = Current;
NewNode.Previous = Current.Previous;
Current.Previous.Next = NewNode;
Current.Previous = NewNode;
Current = NewNode;
ListCountValue += 1;
}
進行升序插入的實現代碼如下。
/**/
/// <summary>
/// 進行升序插入
/// </summary>
public void InsertAscending(Objects InsertValue)
{
//參數:InsertValue 插入的數據
//為空鏈表
if (IsNull())
{
//添加
Append(InsertValue);
return;
}
//移動到頭
MoveFrist();
if ((InsertValue.Number < GetCurrentValue().Number))
{
//滿足條件,則插入,退出
Insert(InsertValue);
return;
}
while (true)
{
if (InsertValue.Number < GetCurrentValue().Number)
{
//滿族條件,則插入,退出
Insert(InsertValue);
break;
}
if (IsEof())
{
//尾部添加
Append(InsertValue);
break;
}
//移動到下一個指針
MoveNext();
}
}
進行降序插入的代碼如下。
/**/
/// <summary>
/// 進行降序插入
/// </summary>
/**/
/*貨物入庫*/
public void InsertUnAscending(Objects InsertValue)
{
//參數:InsertValue 插入的數據
//為空鏈表
if (IsNull())
{
//添加
Append(InsertValue);
return;
}
//移動到頭
MoveFrist();
if (InsertValue.Number > GetCurrentValue().Number)
{
//滿足條件,則插入,退出
Insert(InsertValue);
return;
}
while (true)
{
if (InsertValue.Number > GetCurrentValue().Number)
{
//滿足條件,則插入,退出
Insert(InsertValue);
break;
}
if (IsEof())
{
//尾部添加
Append(InsertValue);
break;
}
//移動到下一個指針
MoveNext();
}
}
}
新聞熱點
疑難解答