数据结构与算法之线性表顺序存储结构

本文档展示了如何在C#中实现一个ILinearList接口,包括索引器、长度检查、清空、插入、追加、删除和查找等线性表操作。同时提供了一个SequentialList类作为接口的实现,详细说明了每个方法的实现细节。通过示例代码,演示了如何初始化、操作和使用该线性表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

首先定义一个接口,定义线性表的各种操作。

	internal interface ILinearList<T>
    {
        /// <summary>
        /// 索引器
        /// </summary>
        /// <param name="index">索引</param>
        /// <returns></returns>
        T this[int index] { get; set; }

        /// <summary>
        /// 数组长度
        /// </summary>
        int Length { get; }

        /// <summary>
        /// 数组是否为空
        /// </summary>
        /// <returns></returns>
        bool IsEmpty();

        /// <summary>
        ///清空表 
        /// </summary>
        void Clear();

        /// <summary>
        ///通过索引获取数据元素 
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        T GetItem(int index);

        /// <summary>
        /// 返回数据元素的索引
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        int LocateItem(T t);

        /// <summary>
        /// 将数据元素插入到指定位置
        /// </summary>
        /// <param name="item"></param>
        /// <param name="index"></param>
        void Insert(T item, int index);

        /// <summary>
        /// 在数组末尾添加元素
        /// </summary>
        /// <param name="item"></param>
        void Append(T item);

        /// <summary>
        /// 删除指定索引的元素
        /// </summary>
        /// <param name="index"></param>
        void Delete(int index);
    }

后面我们实现这个接口。

	internal class SequentialList<T> : ILinearList<T>
    {
        private T[] data;
        private int length;
        private int maxSize;

        public int MaxSize
        {
            get { return maxSize; }
            set { maxSize = value; }
        }

        public SequentialList(int size)
        {
            data = new T[size];
            maxSize = size;
            length = 0;
        }

        public int Length => length;

        public T this[int index] 
        { 
            get 
            {
                if (index > length - 1)
                {
                    throw new Exception("Index out of range");
                }
                return data[index];
            }
            set
            {
                if (index > length - 1)
                {
                    throw new Exception("Index out of range");
                }
                data[index] = value;
            }
        }

        public void Append(T item)
        {
            if (IsFull())
            {
                throw new Exception("List is full");
            }
            length++;
            data[length - 1] = item;
        }

        public bool IsFull()
        {
            return length >= maxSize;
        }

        public void Clear()
        {
            length = 0;
        }

        public void Delete(int index)
        {
            if (IsEmpty())
            {
                throw new Exception("List is empty");
            }

            if (index < 0 || index > length - 1) 
            {
                throw new Exception("Index out of range");
            }

            length--;
            for (int i = index; i < length; i++) 
            {
                data[i] = data[i + 1];
            }
        }

        public T GetItem(int index)
        {
            if (IsEmpty())
            {
                throw new Exception("List is empty");
            }

            if (index < 0 || index > length - 1)
            {
                throw new Exception("Index out of range");
            }

            return data[index];
        }

        public void Insert(T item, int index)
        {
            if (IsFull())
            {
                throw new Exception("List is full");
            }

            if (index < 0 || index > length - 1)
            {
                throw new Exception("Index out of range");
            }
            length++;
            for (int i = length-1; i > index; i--)
            {
                data[i] = data[i - 1];
            }  
            data[index] = item;
        }

        public bool IsEmpty()
        {
            return length == 0;
        }

        public int LocateItem(T value)
        {
            if (value == null)
            {
                return -1;
            }

            for (int i = 0; i < data.Length; i++)
            {
                if (value.Equals(data[i]))
                {
                    return i;
                }
            }

            return -1;
        }
    }

最后看下如何使用我们定义的线性表。


//初始化线性表,开辟空间
ILinearList<int> list = new SequentialList<int>(10);

//往线性表尾添加数据,超过定义长度会抛异常
for (int i = 8; i < 18; i++)
{
    list.Append(i);
}
string s = "线性表元素:";

for (int i = 0; i < list.Length; i++)
{
    s+= " "+list[i];
}
Console.WriteLine(s);

//查找线性表数据
int r = list.GetItem(5);
Console.WriteLine($"线性表索引为5的元素:{r}");

s = "删除索引为5的元素后:";
//删除数据
list.Delete(5);
for (int i = 0; i < list.Length; i++)
{
    s += " " + list[i];
}
Console.WriteLine(s);

s = "在索引为5的元素位置插入数据后:";
//插入数据
list.Insert(77, 5);
for (int i = 0; i < list.Length; i++)
{
    s += " " + list[i];
}
Console.WriteLine(s);


运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值