C#数据结构之顺序表(SeqList)实例详解

C#数据结构之顺序表(SeqList)实例详解

顺序表(SeqList)概述

顺序表(SeqList)是一种线性表存储结构,它的特点是元素的存储位置是连续的。因为它的存储结构是数组,所以在访问和修改元素时,可以通过数组下标进行快速定位。顺序表在内存中的存储相对紧凑,因此查找和修改效率都很高,适用于大多数元素较少、但是需要频繁访问的场景。

实现顺序表(SeqList)

public class SeqList<T> : IList<T>
{
    private T[] items;
    private int count = 0;

    public int Count => count;

    public bool IsReadOnly => false;

    public T this[int index]
    {
        get
        {
            if (index < 0 || index >= count)
            {
                throw new ArgumentOutOfRangeException();
            }
            return items[index];
        }
        set
        {
            if (index < 0 || index >= count)
            {
                throw new ArgumentOutOfRangeException();
            }
            items[index] = value;
        }
    }

    public SeqList()
    {
        items = new T[4];
    }

    public SeqList(int capacity)
    {
        items = new T[capacity];
    }

    public void Add(T item)
    {
        if (count == items.Length)
        {
            Array.Resize(ref items, count * 2);
        }
        items[count++] = item;
    }

    public void Clear()
    {
        Array.Clear(items, 0, count);
        count = 0;
    }

    public bool Contains(T item)
    {
        for (int i = 0; i < count; i++)
        {
            if (Equals(items[i], item))
            {
                return true;
            }
        }
        return false;
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        if (array == null)
        {
            throw new ArgumentNullException(nameof(array));
        }
        if (arrayIndex < 0 || arrayIndex > array.Length)
        {
            throw new ArgumentOutOfRangeException(nameof(arrayIndex));
        }
        if (count > array.Length - arrayIndex)
        {
            throw new ArgumentException("The number of elements in the source ICollection<T> is greater than the available space from arrayIndex to the end of the destination array.");
        }
        for (int i = 0; i < count; i++)
        {
            array[arrayIndex + i] = items[i];
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < count; i++)
        {
            yield return items[i];
        }
    }

    public int IndexOf(T item)
    {
        for (int i = 0; i < count; i++)
        {
            if (Equals(items[i], item))
            {
                return i;
            }
        }
        return -1;
    }

    public void Insert(int index, T item)
    {
        if (index < 0 || index > count)
        {
            throw new ArgumentOutOfRangeException(nameof(index));
        }
        if (count == items.Length)
        {
            Array.Resize(ref items, count * 2);
        }
        Array.Copy(items, index, items, index + 1, count - index);
        items[index] = item;
        count++;
    }

    public bool Remove(T item)
    {
        int index = IndexOf(item);
        if (index < 0)
        {
            return false;
        }
        RemoveAt(index);
        return true;
    }

    public void RemoveAt(int index)
    {
        if (index < 0 || index >= count)
        {
            throw new ArgumentOutOfRangeException(nameof(index));
        }
        Array.Copy(items, index + 1, items, index, count - index - 1);
        items[--count] = default(T);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

在上述代码中,我们实现了IList<T>接口来定义了一个支持动态增加、删除、查找等操作的顺序表。其中包括以下几个方法:

  • 构造函数:支持无参构造和指定初始容量的构造函数
  • Add(T item):在列表末尾添加一个元素
  • Clear():删除列表中所有元素
  • Contains(T item):判断列表中是否包含指定元素
  • CopyTo(T[] array, int arrayIndex):将列表中所有元素复制到目标数组中的指定位置
  • GetEnumerator():返回一个IEnumerator<T>对象,用于遍历列表中的元素
  • IndexOf(T item):返回指定元素的索引位置
  • Insert(int index, T item):在列表中指定位置插入一个元素
  • Remove(T item):删除列表中指定的元素
  • RemoveAt(int index):删除列表中指定位置的元素

示例演示

示例1:使用SeqList存储字符串

下面的示例演示用SeqList<string>存储一些字符串,并对其进行遍历、增加、删除等操作。

SeqList<string> list = new SeqList<string>();
list.Add("C#");
list.Add(".NET");
list.Add("Visual Studio");
foreach (string s in list)
{
    Console.WriteLine(s);
}
Console.WriteLine("list[1] = {0}", list[1]);
list.Insert(1, "ASP.NET");
Console.WriteLine("After Insert(1, \"ASP.NET\"):");
foreach (string s in list)
{
    Console.WriteLine(s);
}
list[2] = "WPF";
Console.WriteLine("After list[2] = \"WPF\":");
foreach (string s in list)
{
    Console.WriteLine(s);
}
list.Remove("ASP.NET");
Console.WriteLine("After Remove(\"ASP.NET\"):");
foreach (string s in list)
{
    Console.WriteLine(s);
}

输出结果如下:

C#
.NET
Visual Studio
list[1] = .NET
After Insert(1, "ASP.NET"):
C#
ASP.NET
.NET
Visual Studio
After list[2] = "WPF":
C#
ASP.NET
WPF
Visual Studio
After Remove("ASP.NET"):
C#
WPF
Visual Studio

示例2:使用SeqList存储自定义对象

下面的示例演示用SeqList<Person>存储一些自定义对象,并进行遍历、删除等操作。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

SeqList<Person> persons = new SeqList<Person>();
persons.Add(new Person("Tom", 18));
persons.Add(new Person("Jerry", 22));
persons.Add(new Person("Amy", 25));
persons.ForEach(p => Console.WriteLine(p.Name + ", " + p.Age));
persons.Remove(persons[1]);
Console.WriteLine("After Remove(\"Jerry\"):");
persons.ForEach(p => Console.WriteLine(p.Name + ", " + p.Age));

输出结果如下:

Tom, 18
Jerry, 22
Amy, 25
After Remove("Jerry"):
Tom, 18
Amy, 25

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#数据结构之顺序表(SeqList)实例详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构顺序表用法详解

    Java数据结构顺序表用法详解 什么是顺序表? 在计算机科学中,顺序表(英语:Sequence)指的是一种线性数据结构,通常是用数组实现的。顺序表是一种顺序存放的线性表,其中的每个节点按照顺序依次排列。 顺序表的基本操作 顺序表主要包括以下几个基本操作: 创建顺序表 在顺序表中插入元素 从顺序表中删除元素 获取顺序表中的元素 判断顺序表是否为空 获取顺序表的…

    数据结构 2023年5月17日
    00
  • 手撕HashMap(二)

    这里再补充几个手撕HashMap的方法 1、remove() remove 方法参数值应该是键值对的键的值,当传入键值对的键的时候,remove 方法会删除对应的键值对 需要利用我们自己先前创建的 hashcodeList 来实现,hashcodeList 存入了所有被使用的 hashcode 值,方便后续的操作 在 put() 中,当添加新的键值对时,就会…

    算法与数据结构 2023年4月18日
    00
  • 【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏

    在我小时候以前做题的时候,遇到博弈题往往都是漫无目的地打表找规律,或者找一些特殊情况但是没有很好的分析方法。 其实博弈题是有比较套路的解题方法的,那就是利用SG函数,第一节不会讲到SG函数的具体用法,我们先来博弈入个门,学习一下最基本的博弈类型:Nim游戏。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式…

    算法与数据结构 2023年4月17日
    00
  • Java常见基础数据结构

    Java常见基础数据结构攻略 Java是一种面向对象的编程语言,拥有丰富的数据结构,大多数基础数据结构都包含在Java API中。在本文中,我们将讨论Java中常见的基础数据结构,包括数组、链表、栈、队列、集合和映射。我们将探讨每种数据结构的定义、用法和基本操作,并提供两个示例说明。 数组 数组是Java中最基本的数据结构之一。它是一个有序的集合,可以包含任…

    数据结构 2023年5月17日
    00
  • python数据结构树和二叉树简介

    下面是关于“Python数据结构树和二叉树简介”的详细攻略。 一、树的概念 树(Tree)是一种非常重要的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。其中一个节点被称作根节点,它没有父节点;除根节点外,其他节点都有且只有一个父节点;每个节点可以有0个或多个子节点。一棵树的深度为树中层次最大的节点层数,根节点层次为1。 二、二叉树的…

    数据结构 2023年5月17日
    00
  • C语言数据结构之堆、堆排序的分析及实现

    C语言数据结构之堆、堆排序的分析及实现 什么是堆 堆(Heap)是一种特殊的树形数据结构,它满足两个条件: 堆是一棵完全二叉树; 堆中任意节点的值总是不大于/不小于其子节点的值。 如果父节点的值不大于所有子节点的值,此堆称为小根堆,又称为最小堆。如果父节点的值不小于所有子节点的值,此堆称为大根堆,又称为最大堆。 堆通常可以使用数组来实现,具体实现方法是将堆的…

    数据结构 2023年5月17日
    00
  • Java数据结构之稀疏数组的实现与应用

    Java数据结构之稀疏数组的实现与应用 什么是稀疏数组 稀疏数组是一种刻画二维数组中许多元素值都为0的特殊数据结构。它可以提高存储空间的利用率,实现对数据的压缩和优化,减少不必要的处理,提升程序的运行效率。 在稀疏数组中,只有非零元素被存储,而这些元素的索引信息和具体数值的信息都会被记录下来。 稀疏数组的实现与应用 实现步骤 创建原始的二维数组,存入多个元素…

    数据结构 2023年5月17日
    00
  • C语言深入讲解链表的使用

    C语言深入讲解链表的使用 什么是链表? 链表是一种常用的数据结构,它的存储方式是通过指针相互连接实现的。链表是由若干个节点(node)构成的,每个节点都存储着一些信息和指向下一个节点的指针。 链表实现的基本操作 链表的基本操作包括插入节点、删除节点以及遍历链表。我们下面将通过代码示例详细介绍这些操作。 插入节点 链表的插入节点操作是指在链表的某一位置插入一个…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部