C#实现顺序表(线性表)完整实例

 更新时间:2016年06月29日 12:41:26   作者:丛晓男  
这篇文章主要介绍了C#实现顺序表(线性表)的方法,结合完整实例形式分析了顺序表的原理及C#相关实现技巧,需要的朋友可以参考下

本文实例讲述了C#实现顺序表(线性表)的方法。分享给大家供大家参考,具体如下:

基本思想是使用数组作为盛放元素的容器,数组一开始的大小要实现确定,并使用一个Pointer指向顺序表中最后的元素。顺序表中的元素是数组中元素的子集。顺序表在内存中是连续的,优势是查找,弱势是插入元素和删除元素。

为避免装箱拆箱,这里使用泛型,代替object。使用object的例子可以参照本站这篇文章:https://www.jb51.net/article/87603.htm,这个链接中的例子实现的是队列,并没 有使用Pointer来标识 顺序表中最后一个元素,而是动态的调整数组的大小,这与本例明显不同,动态调整数组大小开销较大。使用object同样可以完成顺序表数据结构,但是频繁装箱拆箱造成较大的开销,应使用泛型代替。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinearList
{
  public interface IListDS<T>
  {
    int GetLength();
    void Insert(T item, int i);
    void Add(T item);
    bool IsEmpty();
    T GetElement(int i);
    void Delete(int i);
    void Clear();
    int LocateElement(T item);
    void Reverse();
  }
  //顺序表类
  class SequenceList<T>:IListDS<T>
  {
    private int intMaxSize;//最大容量事先确定,使用数组必须先确定容量
    private T[] tItems;//使用数组盛放元素
    private int intPointerLast;//始终指向最后一个元素的位置
    public int MaxSize
    {
      get { return this.intMaxSize; }
      set { this.intMaxSize = value; }
    }
    public T this[int i]//索引器方便返回
    {
      get { return this.tItems[i]; }
    }
    public int PointerLast
    {
      get { return this.intPointerLast; }
    }
    public SequenceList(int size)
    {
      this.intMaxSize = size;
      this.tItems = new T[size];//在这里初始化最合理
      this.intPointerLast = -1;//初始值设为-1,此时数组中元素个数为0
    }
    public bool IsFull()//判断是否超出容量
    {
      return this.intPointerLast+1 == this.intMaxSize;
    }
    #region IListDS<T> 成员
    public int GetLength()
    {
      return this.intPointerLast + 1;//不能返回tItems的长度
    }
    public void Insert(T item, int i)//设i为第i个元素,从1开始。该函数表示在第i个元素后面插入item
    {
      if (i < 1 || i > this.intPointerLast + 1)
      {
        Console.WriteLine("The inserting location is wrong!");
        return;
      }
      if (this.IsFull())
      {
        Console.WriteLine("This linear list is full! Can't insert any new items!");
        return;
      }
      //如果可以添加
      this.intPointerLast++;
      for(int j=this.intPointerLast;j>=i+1;j--)
      {
        this.tItems[j] = this.tItems[j - 1];
      }
      this.tItems[i] = item;
    }
    public void Add(T item)
    {
      if (this.IsFull())//如果超出最大容量,则无法添加新元素
      {
        Console.WriteLine("This linear list is full! Can't add any new items!");
      }
      else
      {
        this.tItems[++this.intPointerLast] = item;//表长+1
      }
    }
    public bool IsEmpty()
    {
      return this.intPointerLast == -1;
    }
    public T GetElement(int i)//设i最小从0开始
    {
      if(this.intPointerLast == -1)
      {
        Console.WriteLine("There are no elements in this linear list!");
        return default(T);
      }
      if (i > this.intPointerLast||i<0)
      {
        Console.WriteLine("Exceed the capability!");
        return default(T);
      }
      return this.tItems[i];
    }
    public void Delete(int i)//设i最小从0开始
    {
      if (this.intPointerLast == -1)
      {
        Console.WriteLine("There are no elements in this linear list!");
        return;
      }
      if (i > this.intPointerLast || i < 0)
      {
        Console.WriteLine("Deleting location is wrong!");
        return;
      }
      for (int j = i; j < this.intPointerLast; j++)
      {
        this.tItems[j] = this.tItems[j + 1];
      }
      this.intPointerLast--;//表长-1
    }
    public void Clear()
    {
      this.intPointerLast = -1;
    }
    public int LocateElement(T item)
    {
      if (this.intPointerLast == -1)
      {
        Console.WriteLine("There are no items in the list!");
        return -1;
      }
      for (int i = 0; i <= this.intPointerLast; i++)
      {
        if (this.tItems[i].Equals(item))//若是自定义类型,则T类必须把Equals函数override
        {
          return i;
        }
      }
      Console.WriteLine("Not found");
      return -1;
    }
    public void Reverse()
    {
      if (this.intPointerLast == -1)
      {
        Console.WriteLine("There are no items in the list!");
      }
      else
      {
        int i = 0;
        int j = this.GetLength() / 2;//结果为下界整数,正好用于循环
        while (i < j)
        {
          T tmp = this.tItems[i];
          this.tItems[i] = this.tItems[this.intPointerLast - i];
          this.tItems[this.intPointerLast - i] = tmp;
          i++;
        }
      }
    }
    #endregion
  }
  class Program
  {
    static void Main(string[] args)
    {
    }
  }
}

基于顺序表的合并排序:

//基于顺序表的合并排序
static private SequenceList<int> Merge(SequenceList<int> s1,SequenceList<int> s2)
{
  SequenceList<int> sList = new SequenceList<int>(20);
  int i = 0;
  int j = 0;
  while(i<=s1.PointerLast&&j<=s2.PointerLast)
  {
    if (s1[i] < s2[j])
    {
      sList.Add(s1[i]);
      i++;
    }
    else
    {
      sList.Add(s2[j]);
      j++;
    }
  }
  if (i > s1.PointerLast)
  {
    while (j <= s2.PointerLast)
    {
      sList.Add(s2[j]);
      j++;
    }
    return sList;
  }
  else//即j>s2.PointerLast
  {
    while (i <= s1.PointerLast)
    {
      sList.Add(s1[i]);
      i++;
    }
    return sList;
  }
}

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》、《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程

希望本文所述对大家C#程序设计有所帮助。

相关文章

  • 基于WPF制作一个可编程画板

    基于WPF制作一个可编程画板

    这篇文章主要为大家详细介绍了如何基于WPF制作一个可编程画板,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-05-05
  • C#中值类型和引用类型解析

    C#中值类型和引用类型解析

    这篇文章主要为大家详细介绍了C#中值类型和引用类型的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 轻松学习C#的运算符

    轻松学习C#的运算符

    轻松学习C#的运算符,对C#的运算符感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的运算符
    2015-11-11
  • C#获取根目录实现方法汇总

    C#获取根目录实现方法汇总

    这篇文章主要介绍了C#获取根目录实现方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Unity实现人物旋转和移动效果

    Unity实现人物旋转和移动效果

    这篇文章主要为大家详细介绍了Unity实现人物旋转和移动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • winform把Office转成PDF文件

    winform把Office转成PDF文件

    这篇文章介绍了winform把Office转成PDF文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 详解C# TimeSpan 计算时间差(时间间隔)

    详解C# TimeSpan 计算时间差(时间间隔)

    本篇文章主要介绍了C# TimeSpan 计算时间差(时间间隔),非常具有实用价值,需要的朋友可以参考下。
    2016-12-12
  • C# 各种导出的方法总结

    C# 各种导出的方法总结

    本篇文章主要介绍了C# 各种导出方法的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • C#可选参数的相关使用

    C#可选参数的相关使用

    .net framework 4.0新增加了可选参数的支持,其实很简单,只要给参数赋个默认值就可以了
    2013-05-05
  • C#搜索文字在文件及文件夹中出现位置的方法

    C#搜索文字在文件及文件夹中出现位置的方法

    这篇文章主要介绍了C#搜索文字在文件及文件夹中出现位置的方法,涉及C#针对文件及文件夹遍历与查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论