【C#】 顺序表代码

简介:

范例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace ConsoleApplication11

{

    class SeqListProgram

    {

        public class SeqList<T> //: IList<T>

        {

            private int maxsize; //顺序表的容量


            public int Maxsize

            {

                get { return maxsize; }

            }

            private T[] data; //数组,用于存储顺序表中的数据元素

            private int last; //指示顺序表最后一个元素的位置下标


            public int Last

            {

                get { return last; }

                set { last = value; }

            }


            // 索引器

            public T this[int index]

            {

                get { return data[index]; }

                set { data[index] = value; }

            }


            public SeqList(int size)

            {

                data = new T[size];

                maxsize = size;

                last = -1;

            }

            // 顺序表的长度由于数组是 0 基数组,即数组的最小索引为 0,所以,顺序表的长度就是数

            // 组中最后一个元素的索引 last 加 1。

            public int GetLength()

            {

                return last + 1;

            }

            // 清空

            public void Clear()

            {

                last = -1;

            }


            public bool IsEmpty()

            {

                if (last < 0)

                {

                    return true;

                }

                return false;

            }

            // 判断顺序表是否已满

            public bool IsFull()

            {

                if (last == maxsize - 1)// 元素下标从0开始

                {

                    return true;

                }

                return false;

            }

            // 在顺序表末尾添加新元素

            public void Appled(T item)

            {

                if (!IsFull())

                {

                    data[++last] = item;

                }

                else

                {

                    Console.WriteLine(" 顺序表已满无法添加 ");

                }

            }

            //在顺序表的第i个数据元素的位置插入一个数据元素

            /*

                算法的时间复杂度分析:顺序表上的插入操作,时间主要消耗在数据的移动

            上,在第i个位置插入一个元素,从ai到an都要向后移动一个位置,共需要移动n-i+1

            个元素,而i的取值范围为 1≤i≤n+1,当i等于 1 时,需要移动的元素个数最多,

            为n个;当i为n+1 时,不需要移动元素。设在第i个位置做插入的概率为pi,则平

            均移动数据元素的次数为n/2。这说明:在顺序表上做插入操作平均需要移动表

            中一半的数据元素,所以,插入操作的时间复杂度为O(n)。

             */

            public void Insert(T item, int i)

            {

                if (i < 1 || i > last + 1)

                {

                    Console.WriteLine(" 位置非法 ");

                    return;

                }

                if (IsFull())

                {

                    Console.WriteLine(" 顺序表已满无法添加 ");

                    return;

                }

                if (i == last + 2)// 判断是不是末尾插入

                {

                    data[last + 1] = item;

                }

                else

                {

                    // i后面的元素往后移

                    for (int j = last; j >= i - 1; --j)

                    {

                        data[j + 1] = data[j];

                    }

                    //将新的数据元素插入到第i-1个位置上

                    data[i - 1] = item;

                }

                ++last;

            }

            //删除顺序表的第i个数据元素

            /*

             而i的取值范围为 1≤i≤n,当i等于 1 时,需要移动

            的元素个数最多,为n-1 个;当i为n时,不需要移动元素。设在第i个位置做删除

            的概率为pi,则平均移动数据元素的次数为(n-1)/2。这说明在顺序表上做删除操

            作平均需要移动表中一半的数据元素,所以,删除操作的时间复杂度为O(n)

             */

            public T Delete(int i)

            {

                T temp = default(T);// default 为泛型代码中的默认关键字

                if (IsEmpty())

                {

                    Console.WriteLine("顺序表为空");

                    return temp;

                }

                if (i < 1 || i > last + 1)

                {

                    Console.WriteLine(" 位置非法 ");

                    return temp;

                }

                if (i == last + 1)

                {

                    data[last--] = temp;

                }

                else

                {

                    temp = data[i - 1];

                    for (int j = i; j <= last; ++j)

                    {

                        data[j] = data[j - 1];

                    }

                }

                --last;

                return temp;

            }


            //获得顺序表的第i个数据元素

            public T GetElem(int i)

            {

                if (IsEmpty() || (i < 1) || (i > last + 1))

                {

                    Console.WriteLine("顺序表为空 or 位置非法!");

                    return default(T);

                }

                return data[i - 1];

            }

            //在顺序表中查找值为value的数据元素

            public int Locate(T value)

            {

                if (IsEmpty())

                {

                    Console.WriteLine("顺序表为空");

                    return -1;

                }

                for (int j = 0; j < last; ++j)

                {

                    if (data[j].Equals(value))

                    {

                        return j;

                    }

                }

                return -1;

            }

            /*

             算法的时间复杂度分析:顺序表中的按值查找的主要运算是比较,比较的次

            数与给定值在表中的位置和表长有关。当给定值与第一个数据元素相等时,比较

            次数为 1;而当给定值与最后一个元素相等时,比较次数为 n。所以,平均比较

            次数为(n+1)/2,时间复杂度为 O(n)

             */

            public void Reverse()

            {

                T temp = default(T);

                int len = GetLength();

                for (int i = 0; i <= len >> 1; ++i)

                {

                    temp = data[i];

                    data[i] = data[len - i];

                    data[len - i] = temp;

                }

            }

        }

        static void Main(string[] args)

        {

            SeqList<string> Sl = new SeqList<string>(3);

            Sl.Appled("str1");

            Sl.Appled("str2");

            Sl.Appled("str3");

         

            

            Console.WriteLine("{0}", Sl.GetLength());

            Console.WriteLine("{0}", Sl.GetElem(2));

           // string Del_item = Sl.Delete(3);

            Console.WriteLine("{0}", Sl[0]);

            Console.WriteLine("{0}", Sl.GetLength());

           SeqList<string> S2= new SeqList<string>(7);

          Console.WriteLine( S2.Maxsize);





            Console.ReadLine();





        }

    }

}



      本文转自daniel8294 51CTO博客,原文链接:http://blog.51cto.com/acadia627/1635572,如需转载请自行联系原作者





相关文章
|
1月前
|
C# Windows
C#通过代码实现快捷键编辑
C#通过代码实现快捷键编辑
|
3月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
3月前
|
C# 开发者
C# 10.0中的文件范围命名空间:简化代码组织的新方式
【1月更文挑战第18天】C# 10.0引入了文件范围的命名空间,这是一种新的语法糖,用于更简洁地组织和管理代码。文件范围命名空间允许开发者在每个文件的基础上定义命名空间,而无需显式使用花括号包裹整个文件内容。本文将深入探讨文件范围命名空间的工作原理、使用场景以及它们为C#开发者带来的便利。
|
4月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
36 0
|
5月前
|
开发框架 .NET C#
如何调试 C# Emit 生成的动态代码?
如何调试 C# Emit 生成的动态代码?
|
4月前
|
IDE C# 开发工具
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
批量下载文件时使用多线程可以有效缩短完成时间,本文将讲解如何使用C#+CodePlus扩展库快速完成多线程的文件下载。 大部分代码由IDE自动生成,需要我们自己编写的代码正好**10行**。也就是说,只需要10分钟,就可以手撸一个多线程的批量下载器。
88 0
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
|
2月前
|
数据采集 JSON 前端开发
从代码到内容:使用C#和Fizzler探索Instagram的深处
Instagram是一个流行的社交媒体平台,拥有数亿的用户和海量的图片和视频内容。如果您想要从Instagram上获取一些有用的信息或数据,您可能需要使用爬虫技术来自动化地抓取和分析网页内容。本文将介绍如何使用C#和Fizzler这两个强大的工具,来实现一个简单而高效的Instagram爬虫,从代码到内容,探索Instagram的深处。
|
3月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
32 0
|
3月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
37 2
|
8月前
|
存储 C# 图形学
代码解析 C# 引用类型还是值类型
代码解析 C# 引用类型还是值类型