C#实现顺序表(线性表)完整实例
作者:丛晓男 发布时间:2022-06-04 15:42:31
标签: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#程序设计有所帮助。
0
投稿
猜你喜欢
- 效果图示例结构图代码解析导入dataBinding dataBinding{ &nb
- @pathvariable与@requestparam碰到的一些问题一、@pathvariable可以将 URL 中占位符参数绑定到控制器处
- 下面通过图文并茂的方式给大家分享C#实现KTV点歌系统。public enum SongPlayState { //未播放,播放
- 一、Java类加载机制1.概述 Class文件由类装载器装
- 第一步:下载JDK地址:http://www.oracle.com/technetwork/java/javase/downloads/in
- 背景:在平时的开发中,我们时常会遇到下列场景公司的组织架构的数据存储与展示文件夹层级的数据存储与展示评论系统中,父评论与诸多子评论的数据存储
- 编写程序,实现顺序表的下列功能:从键盘输入数据建立一个顺序表输出该顺序表往顺序表中插入数据从顺序表中删除数据给定数据,进行查找,给出查找成功
- foreach拼接字符串查询无数据返回Mybatis-plus xml使用foreach遍历查询条件,填充IN函数时,查询不到数据入参 Li
- Android屏蔽软键盘并且显示光标的实例详解如果是android4.0以下,那么editText.setInputType(InputTy
- 本文实例为大家分享了java实现打字游戏的具体代码,供大家参考,具体内容如下import java.util.Random;import j
- 1、系统信息:Windows10 64位2、环境搭建参考:https://www.jb51.net/article/185086.htm3、
- java转换字符串编码格式 (解码错误,重新解码)字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(
- 小编对微信开发颇感兴趣,查阅了网上相关文章进行整理,方便大家一起学习。1、注册帐号--填写服务器配置在https://mp.weixin.q
- 安装jdk(介绍三种方法)查看java版本:java -version方法一:利用yum源来安装jdk(此方法不需要配置环境变量)查看yum
- 本文实例为大家分享了Unity3d实现跑马灯广播效果的具体代码,供大家参考,具体内容如下废话不多说,直接上代码using DG.Tweeni
- OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的
- Spring 注入static属性值本文介绍Spring中如何从属性文件给static字段注入值。实际应用中一些工具类中static属性值需
- 在application.properties中配置了static的默认路径我的static目录结构是这样的index.html中这样引用c
- Java java.lang.ExceptionInInitializerError 错误如何解决引起 Java.lang.Ex
- 四种隔离机制不要忘记:(1,2,4,8)1.read-uncommitted:能够去读那些没有提交的数据(允许脏读的存在)2.read-co