可能是太难了吧。C# 指针链表什么的,当年难倒了一堆同学。
using System;
using System.Runtime.InteropServices;
namespace ThisAssembly {
using static Module;
public static class Module {
public static unsafe T* Alloc<T>() where T : unmanaged {
return (T*)(void*)Marshal.AllocHGlobal(sizeof(T));
}
public static unsafe void Free<T>(T* ptr) where T : unmanaged {
Marshal.FreeHGlobal((IntPtr)ptr);
}
}
public unsafe struct SinglyLinkedListNode<T> where T : unmanaged {
public T Value;
public SinglyLinkedListNode<T>* Next;
}
public unsafe static class SinglyLinkedListNode {
public static ref SinglyLinkedListNode<T>* SeekByIndex<T>(
ref SinglyLinkedListNode<T>* head,
int index) where T : unmanaged {
if (0 > index) {
throw new IndexOutOfRangeException();
}
ref var current = ref head;
for (var i = index; i > 0; --i) {
if (current is null) {
throw new IndexOutOfRangeException();
}
current = ref current->Next;
}
return ref current;
}
public static void Insert<T>(
ref SinglyLinkedListNode<T>* node, T value) where T : unmanaged {
var t = Alloc<SinglyLinkedListNode<T>>();
t->Value = value;
t->Next = node;
node = t;
}
public static void Remove<T>(
ref SinglyLinkedListNode<T>* node) where T : unmanaged {
if (node is null) {
throw new ArgumentNullException(nameof(node));
}
var t = node;
node = t->Next;
Free(t);
}
public static void InsertByIndex<T>(
ref SinglyLinkedListNode<T>* head, int index, T value) where T : unmanaged {
Insert(ref SeekByIndex(ref head, index), value);
}
public static void RemoveByIndex<T>(
ref SinglyLinkedListNode<T>* head, int index) where T : unmanaged {
Remove(ref SeekByIndex(ref head, index));
}
public static ref T GetValueRefByIndex<T>(
ref SinglyLinkedListNode<T>* head, int index) where T : unmanaged {
return ref SeekByIndex(ref head, index)->Value;
}
public static void SetValueByIndex<T>(
ref SinglyLinkedListNode<T>* head, int index, T value) where T : unmanaged {
GetValueRefByIndex<T>(ref head, index) = value;
}
public static T GetValueByIndex<T>(
ref SinglyLinkedListNode<T>* head, int index) where T : unmanaged {
return GetValueRefByIndex<T>(ref head, index);
}
public static void Clear<T>(
ref SinglyLinkedListNode<T>* head) where T : unmanaged {
for (ref var current = ref head; current is not null; Remove(ref current)) {
}
}
public static void ForEach<T>(
in SinglyLinkedListNode<T>* head,
delegate* managed<T, void> action)
where T : unmanaged {
for (var current = head; current is not null; current = current->Next) {
action(current->Value);
}
}
}
}
namespace ThisAssembly {
using static Module;
using static SinglyLinkedListNode;
public unsafe static class Program {
public static void Print(int x) {
Console.Out.Write(x);
}
public static void Main() {
for (var i = 0; 1000000000 > i; ++i) {
SinglyLinkedListNode<int>* list = default;
Insert(ref list, 4);
Insert(ref list, 9);
Insert(ref list, 5);
RemoveByIndex(ref list, 1);
Insert(ref list, 0);
Insert(ref list, 1);
InsertByIndex(ref list, 3, 1);
Insert(ref list, GetValueByIndex(ref list, 3));
SetValueByIndex(ref list, 2, 4);
ForEach(in list, &Print);
Console.Out.Write(&#39;\n&#39;);
Clear(ref list);
}
}
}
} |