数据结构顺序存储

顺序存储
优点:读取元素可以直接定位,时间复杂度降低
缺点:插入删除元素,要保持元素的顺序.后续元素要移动,增加了时间
namespace SeqListDemo
{
interface ISepList
{
//取得线性表的实际元素个数
int Count();
//清空线性表
void Clear();
//判断线性表是否为空
bool IsEmpty();
//(在末端)追加元素
void Append(T item);
//在位置i“前面”插入元素item
void InsertBefore(T item, int i);
//在位置i“后面”插入元素item
void InsertAfter(T item, int i);
//删除索引i处的元素
T RemoveAt(int i);
//获得索引位置i处的元素
T GetItemAt(int i);
//返回元素value的索引
int IndexOf(T value);
//反转线性表的所有元素
void Reverse();
//是否满了
bool IsFull();
}
}

namespace SeqListDemo
{

class SeqList<T> : ISepList<T>
{
    private int maxsize;
    private T[] data;
    private int last;
    //类索引器
    public T this[int index]
    {
        get
        {
            return GetItemAt(index);
        }
        set
        {
        //判断索引小于0 大于数组长度
            if (index < 0 || index > last + 1)
            {
             //输出索引越界
                Console.WriteLine("Position is error");
                return;
            }
            data[index] = value;
        }
    }
    //最后一个元素的下标
    public int Last
    {
        get { return last; }
    }
    //最大容量
    public int Maxsize
    {
        get { return maxsize; }
        set { maxsize = value; }
    }
    //构造函数
    public SeqList(int size)
    {
        data = new T[size];
        maxsize = size;
        last = -1;
    }
    public void Append(T item)//添加元素
    {
        if (IsFull())
        {
            Console.WriteLine("List is full");
            return;
        }
        data[++last] = item;
    }

    public void Clear()
    {
        last = -1;
    }

    public int Count()
    {
        return last + 1;
    }
    /// <summary>
    /// 获取第i个位置的元素
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public T GetItemAt(int i)
    {
        if (IsEmpty() || (i < 0) || (i > last))
        {
            Console.WriteLine("List is empty or Position is error!");
            return default(T);
        }
        return data[i];
    }
    /// <summary>
    /// 定位元素的下标索引
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public int IndexOf(T value)
    {
        if (IsEmpty())
        {
            Console.WriteLine("List is Empty!");
            return -1;
        }
        int i = 0;
        for (i = 0; i <= last; i++)
        {
            if (value.Equals(data[i]))
            {
                break;
            }
            if (i==last&&!value.Equals(data[i]))
            {
                Console.WriteLine("所查元素不在表中");
                return -1;
            }
        }
        if (i > last)
        {
            return -1;
        }
        return i;
    }
    /// <summary>
    /// 后插
    /// </summary>
    /// <param name="item"></param>
    /// <param name="i"></param>
    public void InsertAfter(T item, int i)
    {
        if (IsFull())
        {
            Console.WriteLine("List is full");
            return;
        }
        if (i < 0 || i > last)
        {
            Console.WriteLine("Position is error");
            return;
        }
        if (i == last)
        {
            data[last + 1] = item;
        }
        else
        {
            //位置i以后的元素(不含位置i),全部后移
            for (int j = last; j > i; j--)
            {
                data[j + 1] = data[j];
            }
            data[i + 1] = item;
        }
        ++last;
    }
    /// <summary>
    /// 前插
    /// </summary>
    /// <param name="item"></param>
    /// <param name="i"></param>
    public void InsertBefore(T item, int i)
    {
        if (IsFull())
        {
            Console.WriteLine("List is full");
            return;
        }
        if (i < 0 || i > last + 1)
        {
            Console.WriteLine("Position is error");
            return;
        }
        if (i == last + 1)
        {
            data[last + 1] = item;
        }
        else
        {
            //位置i及i以后的元素,全部后移
            for (int j = last; j >= i; j--)
            {
                data[j + 1] = data[j];
            }
            data[i] = item;
        }
        ++last;
    }

    public bool IsEmpty()
    {
        return last == -1;
    }
    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public T RemoveAt(int i)
    {
        T tmp = default(T);
        if (IsEmpty())
        {
            Console.WriteLine("List is empty");
            return tmp;
        }
        if (i < 0 || i > last)
        {
            Console.WriteLine("Position is error!");
            return tmp;
        }
        if (i == last)
        {
            tmp = data[last];
        }
        else
        {
            tmp = data[i];
            //位置i以及i以后的元素前移
            for (int j = i; j <= last; j++)
            {
                data[j] = data[j + 1];
            }
        }
        --last;
        return tmp;
    }
    /// <summary>
    /// 元素反转
    /// </summary>
    public void Reverse()
    {
        T tmp = default(T);
        for (int i = 0; i <= last / 2; i++)
        {
            tmp = data[i];
            data[i] = data[last - i];
            data[last - i] = tmp;
        }
    }
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i <= last; i++)
        {
            sb.Append(data[i].ToString() + ",");
        }
        return sb.ToString().TrimEnd(',');
    }

    public bool IsFull()
    {
        return last == maxsize - 1;
    }
}

}

namespace SeqListDemo
{
class Program
{
static void Main(string[] args)
{
SeqList seq = new SeqList(10);
seq.Append(“x”);
seq.InsertBefore(“w”, 0);
seq.InsertBefore(“v”, 0);
seq.Append(“y”);
seq.InsertBefore(“z”, seq.Count());
Console.WriteLine(seq.Count());//5
Console.WriteLine(seq);//v,w,x,y,z
Console.WriteLine(seq[1]);//w
Console.WriteLine(seq[0]);//v
Console.WriteLine(seq[4]);//z
Console.WriteLine(seq.IndexOf(“a”));//4
Console.WriteLine(seq.RemoveAt(2));//x
Console.WriteLine(seq);//v,w,y,z
seq.InsertBefore(“x”, 2);
Console.WriteLine(seq);//v,w,x,y,z
Console.WriteLine(seq.GetItemAt(2));//x
seq.Reverse();
Console.WriteLine(seq);//z,y,x,w,v
seq.InsertAfter(“z_1”, 0);
seq.InsertAfter(“y_1”, 2);
seq.InsertAfter(“v_1”, seq.Count() - 1);
Console.WriteLine(seq);
Console.ReadKey();
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值