添加Lesson9
This commit is contained in:
@@ -37,6 +37,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson8_Dictionary", "Lesso
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson8_Dictionary练习", "Lesson8_Dictionary练习\Lesson8_Dictionary练习.csproj", "{1481414C-D336-4691-A45A-6A8CABFD33FE}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson8_Dictionary练习", "Lesson8_Dictionary练习\Lesson8_Dictionary练习.csproj", "{1481414C-D336-4691-A45A-6A8CABFD33FE}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson9_顺序存储和链式存储", "Lesson9_顺序存储和链式存储\Lesson9_顺序存储和链式存储.csproj", "{317AE884-9270-4AEA-8181-288BC4F1FB2E}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson9_顺序存储和链式存储练习", "Lesson9_顺序存储和链式存储练习\Lesson9_顺序存储和链式存储练习.csproj", "{EDA0CEB2-BB75-4149-8C0D-56C9A5286769}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -111,6 +115,14 @@ Global
|
|||||||
{1481414C-D336-4691-A45A-6A8CABFD33FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{1481414C-D336-4691-A45A-6A8CABFD33FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{1481414C-D336-4691-A45A-6A8CABFD33FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{1481414C-D336-4691-A45A-6A8CABFD33FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{1481414C-D336-4691-A45A-6A8CABFD33FE}.Release|Any CPU.Build.0 = Release|Any CPU
|
{1481414C-D336-4691-A45A-6A8CABFD33FE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{317AE884-9270-4AEA-8181-288BC4F1FB2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{317AE884-9270-4AEA-8181-288BC4F1FB2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{317AE884-9270-4AEA-8181-288BC4F1FB2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{317AE884-9270-4AEA-8181-288BC4F1FB2E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{EDA0CEB2-BB75-4149-8C0D-56C9A5286769}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{EDA0CEB2-BB75-4149-8C0D-56C9A5286769}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{EDA0CEB2-BB75-4149-8C0D-56C9A5286769}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{EDA0CEB2-BB75-4149-8C0D-56C9A5286769}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
namespace Lesson9_顺序存储和链式存储
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
#region 知识点一 数据结构
|
||||||
|
// 数据结构
|
||||||
|
// 数据结构是计算机存储、组织数据的方式(规则)
|
||||||
|
// 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合
|
||||||
|
// 比如自定义的一个类也可以称为一种数据结构 自己定义的数据组合规则
|
||||||
|
|
||||||
|
// 不要把数据结构想的太复杂
|
||||||
|
// 简单点理解,就是人定义的 存储数据 和 表示数据之间关系 的规则而已
|
||||||
|
|
||||||
|
// 常用的数据结构(前辈总结和制定的一些经典规则)
|
||||||
|
// 数组、栈、队列、链表、树、图、堆、散列表
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 知识点二 线性表
|
||||||
|
//线性表是一种数据结构,是由N个具有相同特性的数据元素的有限序列
|
||||||
|
//比如数组、Arraylist、stack、queue、链表等
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//顺序存储和链式存储 是数据结构重两种 存储结构
|
||||||
|
|
||||||
|
#region 知识点三 顺序存储
|
||||||
|
//数组、stack、queue、list、arraylist —— 顺序存储
|
||||||
|
//只是 数组、stack、queue的 组织规则不同
|
||||||
|
//顺序存储:
|
||||||
|
//用一组地址连续的存储单元一次存储线性表的各个元素
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 知识点四 链式存储
|
||||||
|
//单向链表、双向链表、循环链表 —— 链式存储
|
||||||
|
//链式存储(连接存储):
|
||||||
|
//用一组任意的存储单元存储线性表重的各个数据元素
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
LinkedList<int> link = new LinkedList<int>();
|
||||||
|
link.Add(1);
|
||||||
|
link.Add(2);
|
||||||
|
link.Add(3);
|
||||||
|
link.Add(4);
|
||||||
|
LinkedNode<int> node = link.head;
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(node.value);
|
||||||
|
node = node.nextNode;
|
||||||
|
}
|
||||||
|
link.Remove(2);
|
||||||
|
Console.WriteLine("--------");
|
||||||
|
node = link.head;
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(node.value);
|
||||||
|
node = node.nextNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
link.Remove(1);
|
||||||
|
Console.WriteLine("--------");
|
||||||
|
node = link.head;
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(node.value);
|
||||||
|
node = node.nextNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
link.Add(999);
|
||||||
|
Console.WriteLine("--------");
|
||||||
|
node = link.head;
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(node.value);
|
||||||
|
node = node.nextNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#region 知识点五 自己实现一个最贱的的单向链表
|
||||||
|
/// <summary>
|
||||||
|
/// 单项链表节点
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
class LinkedNode<T>
|
||||||
|
{
|
||||||
|
public T value;
|
||||||
|
//存储下一个元素
|
||||||
|
public LinkedNode<T> nextNode;
|
||||||
|
public LinkedNode(T value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 单项链表类,管理节点
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
class LinkedList<T>
|
||||||
|
{
|
||||||
|
public LinkedNode<T> head;
|
||||||
|
public LinkedNode<T> last;
|
||||||
|
public void Add(T value)
|
||||||
|
{
|
||||||
|
LinkedNode<T> node = new LinkedNode<T>(value);
|
||||||
|
if (head == null)
|
||||||
|
{
|
||||||
|
head = node;
|
||||||
|
last = node;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last.nextNode = node;
|
||||||
|
last = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Remove(T value)
|
||||||
|
{
|
||||||
|
if (head == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (head.value.Equals(value))
|
||||||
|
{
|
||||||
|
head = head.nextNode;
|
||||||
|
//如果头节点被移除了,那么证明只有一个节点,那么尾也要清空
|
||||||
|
if (head == null)
|
||||||
|
{
|
||||||
|
last = null;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LinkedNode<T> node = head;
|
||||||
|
while (node.nextNode != null)
|
||||||
|
{
|
||||||
|
if (node.nextNode.value.Equals(value))
|
||||||
|
{
|
||||||
|
node.nextNode = node.nextNode.nextNode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 知识点六 顺序存储和链式存储的优缺点
|
||||||
|
//从增删查改的角度去思考
|
||||||
|
//增:链式存储 计算上 优于顺序存储 (中间插入时链式不用像顺序一样去移动位置)
|
||||||
|
//删:链式存储 计算上 优于顺序存储 (中间删除时链式不用像顺序一样去移动位置)
|
||||||
|
//查:顺序存储 使用上 优于链式存储 (数组可以直接通过下标得到元素,链式需要遍历)
|
||||||
|
//改:顺序存储 使用上 优于链式存储 (数组可以直接通过下标得到元素,链式需要遍历)
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
namespace Lesson9_顺序存储和链式存储练习
|
||||||
|
{
|
||||||
|
class LinkNode<T>
|
||||||
|
{
|
||||||
|
public T value;
|
||||||
|
public LinkNode<T> nextNode;
|
||||||
|
public LinkNode<T> frontNode;
|
||||||
|
public LinkNode(T value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
nextNode = null;
|
||||||
|
frontNode = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class LinkList<T>
|
||||||
|
{
|
||||||
|
private LinkNode<T> head;
|
||||||
|
private LinkNode<T> tail;
|
||||||
|
private int count;
|
||||||
|
public LinkList()
|
||||||
|
{
|
||||||
|
count = 0;
|
||||||
|
head = null;
|
||||||
|
tail = null;
|
||||||
|
}
|
||||||
|
public LinkNode<T> Head
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public LinkNode<T> Tail
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return tail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Add(T value)
|
||||||
|
{
|
||||||
|
LinkNode<T> node = new LinkNode<T>(value);
|
||||||
|
if (head == null)
|
||||||
|
{
|
||||||
|
head = node;
|
||||||
|
tail = node;
|
||||||
|
Console.WriteLine("空,已加节点并赋值");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tail.nextNode = node;
|
||||||
|
tail.nextNode.frontNode = tail;
|
||||||
|
tail = node;
|
||||||
|
tail.nextNode = null;
|
||||||
|
Console.WriteLine("添加尾部节点");
|
||||||
|
}
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
public void PrintAllNodesFront()
|
||||||
|
{
|
||||||
|
if (head == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("链表为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LinkNode<T> node = head;
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
Console.Write(node.value + " ");
|
||||||
|
node = node.nextNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void PrintAllNodesLast()
|
||||||
|
{
|
||||||
|
if (head == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("链表为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LinkNode<T> node = tail;
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
Console.Write(node.value + " ");
|
||||||
|
node = node.frontNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void RemoveAt(int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= count)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"目前只有{count}个node,输入无效");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int tempCount = 0;
|
||||||
|
LinkNode<T> tempNode = head;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (tempCount == index)
|
||||||
|
{
|
||||||
|
//找到节点
|
||||||
|
if (tempNode.frontNode != null)
|
||||||
|
{
|
||||||
|
tempNode.frontNode.nextNode = tempNode.nextNode;
|
||||||
|
}
|
||||||
|
if (tempNode.nextNode != null)
|
||||||
|
{
|
||||||
|
tempNode.nextNode.frontNode = tempNode.frontNode;
|
||||||
|
}
|
||||||
|
if (index == 0)
|
||||||
|
{
|
||||||
|
head = tempNode.nextNode;
|
||||||
|
}else if (index == count - 1)
|
||||||
|
{
|
||||||
|
tail = tail.frontNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
count--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tempNode = tempNode.nextNode;
|
||||||
|
tempCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
LinkList<int> list = new LinkList<int>();
|
||||||
|
list.Add(1);
|
||||||
|
list.Add(2);
|
||||||
|
list.Add(3);
|
||||||
|
list.Add(4);
|
||||||
|
|
||||||
|
Console.WriteLine("Node数量:");
|
||||||
|
Console.WriteLine(list.Count);
|
||||||
|
|
||||||
|
Console.WriteLine("-------------------");
|
||||||
|
|
||||||
|
Console.WriteLine("反向遍历");
|
||||||
|
list.PrintAllNodesLast();
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("-------------------");
|
||||||
|
|
||||||
|
Console.WriteLine("正向遍历");
|
||||||
|
list.PrintAllNodesFront();//正向遍历
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("-------------------");
|
||||||
|
|
||||||
|
Console.WriteLine("删除后正向遍历");
|
||||||
|
list.RemoveAt(0);
|
||||||
|
list.PrintAllNodesFront();//正向遍历
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("-------------------");
|
||||||
|
|
||||||
|
Console.WriteLine("删除后反向遍历");
|
||||||
|
list.RemoveAt(1);
|
||||||
|
list.PrintAllNodesFront();//正向遍历
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("-------------------");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user