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数据结构之HashMap和HashSet

    Java数据结构之HashMap和HashSet HashMap 介绍 HashMap是一种基于哈希表实现的Map集合,它提供了快速的插入、查询、删除操作。HashMap中存储的元素是以键值对(Key-Value)的形式存储的,其中Key是用来从Map中查找值的索引,Value是存储在Map中的值。HashMap中的Key和Value都可以为null,但是在…

    数据结构 2023年5月17日
    00
  • 查询json的数据结构的8种方式简介

    查询json的数据结构的8种方式简介 在处理JSON数据时,经常需要提取特定的数据或获取某个属性的值。这时候就需要使用JSON的查询语言来进行查询操作。本文将介绍8种常用的JSON查询方式,帮助大家更方便、快捷地查询和分析JSON数据。 1. 点语法 使用点语法(.)查询JSON数据是最简单、最常用的方式,通过指定属性名来获取相应的值。例如,假设有以下的JS…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解 什么是单链表 链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。 单链表节点的定义 单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。 以下是单链表节点的定义: typedef struct node { i…

    数据结构 2023年5月17日
    00
  • C++线性表深度解析之动态数组与单链表和栈及队列的实现

    C++线性表深度解析之动态数组与单链表和栈及队列的实现 动态数组的实现 动态数组是一种可以动态扩展的数组结构,它的容量可以随着需要而动态增加。在C++中,使用vector类可以实现动态数组的功能。vector类相当于动态分配了一块内存空间,在使用时可以根据需要进行动态扩展。下面是一个示例代码: #include <vector> #include…

    数据结构 2023年5月17日
    00
  • 代码随想录–二叉树

    二叉树 二叉树–二叉树的递归遍历 题目: 144.二叉树的前序遍历(opens new window) 145.二叉树的后序遍历(opens new window) 94.二叉树的中序遍历 题解: 前序遍历 class Solution { public List<Integer> preorderTraversal(TreeNode root…

    算法与数据结构 2023年4月18日
    00
  • qqwry.dat的数据结构图文解释第2/2页

    首先,对于“qqwry.dat的数据结构图文解释第2/2页”这个主题,我们需要先对其进行一些介绍。 qqwry.dat是一种IP地址转换工具,它可以将一个给定的IP地址转换成一个物理地址。它的数据结构是一种二叉查找树,在此二叉查找树中每个节点保存了一个IP地址段和该段IP地址所对应的物理地址的信息。这个数据结构的结构图可以在“qqwry.dat的数据结构图文…

    数据结构 2023年5月17日
    00
  • 深入PHP中的HashTable结构详解

    深入PHP中的HashTable结构详解 在PHP中,HashTable是一种基础数据结构,常用于存储对象的属性和方法等各种数据,本篇攻略将深入介绍HashTable的实现原理和应用。 HashTable的实现原理 HashTable并不是一种单一的数据结构,它可以根据不同的需求来采用不同的实现方式。在PHP中,我们经常使用的是基于链表的实现方式,也就是链式…

    数据结构 2023年5月17日
    00
  • Python 实现数据结构-堆栈和队列的操作方法

    Python 实现数据结构-堆栈和队列的操作方法 在Python中,我们可以使用列表(List)数据类型来实现堆栈和队列的操作。 堆栈(Stack)的操作方法 堆栈数据结构可以理解为一种后进先出的数据存储方式,也就是说最后放入堆栈的元素最先被取出。下面介绍一下堆栈的操作方法。 创建一个堆栈 我们可以通过创建一个空的列表来实现一个堆栈。代码如下: stack …

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