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

yizhihongxing

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日

相关文章

  • C++数据结构之AVL树的实现

    C++数据结构之AVL树的实现 什么是AVL树 AVL树是一种自平衡二叉查找树,也就是说它通过旋转操作来保持树的平衡。 在AVL树中,任何节点的两个子树高度差不超过1。如果高度差大于1,则需要通过旋转操作来调整树的平衡。 AVL树提供了比红黑树更快的插入和删除操作,但是在读取数据时红黑树更快。 AVL树的实现 结构体定义 我们可以先定义一个结构体来表示AVL…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之排序总结(一)

    好的!首先感谢你对我的提问,我将会在这里详细讲解“C语言数据结构与算法之排序总结(一)”的完整攻略。 概述 本文是关于 C 语言数据结构与算法中排序总结(一)的攻略说明。主要包括目录、排序算法、排序分析和示例演示等内容,让读者能够了解排序算法的基本思想、常见的分类和应用场景,以及不同排序算法的优缺点,进而选择适合的排序算法。 目录 基本概念 冒泡排序 插入排…

    数据结构 2023年5月17日
    00
  • C语言中数据结构之链式基数排序

    C语言中数据结构之链式基数排序 概述 链式基数排序是基数排序的一种实现方式。基数排序是一种桶排序算法,它通过将需要排序的数据分成多个桶,并且按照一定的顺序将数据从桶中取出来,以达到排序的目的。链式基数排序则使用了链表结构来实现桶的功能。 实现步骤 链式基数排序的实现步骤如下: 申请链表节点数组,并初始化链表头结点数组。链表的数量等于指定的基数,例如10进制的…

    数据结构 2023年5月17日
    00
  • Redis的六种底层数据结构(小结)

    Redis的六种底层数据结构(小结) 简介 Redis是一种基于内存的高效键值存储数据库,它支持六种不同的数据结构来存储数据。这些结构旨在提供高速、灵活和功能强大的一系列功能。在学习Redis时,了解这些数据结构可以帮助您更好地使用Redis并更好地解决您的问题。 Redis的六种底层数据结构 Redis支持以下六种不同的数据结构: String (字符串)…

    数据结构 2023年5月17日
    00
  • MySQL 数据库的基础知识

    下面是针对MySQL数据库基础知识的攻略。 什么是MySQL MySQL是一种常用的开源的关系型数据库管理系统 (RDBMS),通常被用于网站开发、数据储存和其他广泛的应用领域。 安装MySQL 要使用MySQL,需要首先在你的电脑上安装它。MySQL在Windows、macOS和Linux系统上都有提供安装文件,你可以前往MySQL官网下载安装器按步骤完成…

    数据结构 2023年5月17日
    00
  • C语言进阶数据的存储机制完整版

    C语言进阶数据的存储机制完整版攻略 1. 前言 C语言是一门高度可控的语言,其中其数据的存储机制是必须掌握的基础知识点。本文介绍了C语言数据存储的机制,包括变量在内存中的分配、指针的应用及结构体的组织等内容,旨在帮助读者掌握C语言中的数据存储机制。 2. 变量在内存中的分配 变量在内存中的分配既涉及到内存的分配可操作性,也涉及到相应的存储结构。 2.1. 变…

    数据结构 2023年5月17日
    00
  • 柏林噪声算法(Perlin Noise)

    概述 引述维基百科的介绍: Perlin噪声(Perlin noise,又称为柏林噪声)指由Ken Perlin发明的自然噪声生成算法,具有在函数上的连续性,并可在多次调用时给出一致的数值。 在电子游戏领域中可以透过使用Perlin噪声生成具连续性的地形;或是在艺术领域中使用Perlin噪声生成图样。 维基百科的介绍相当的官方,其实可以理解为一个随机函数,不…

    算法与数据结构 2023年4月17日
    00
  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

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