码迷,mamicode.com
首页 > Windows程序 > 详细

C#数据结构_01

时间:2018-04-09 13:18:27      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:osi   his   算法实现   col   ons   this   pos   false   sharp   

常见的4类数据结构: 1.集合。 2.线性结构。3.树形结构。4.图状结构。

数据结构(Data Structure)简记为 DS,是一个二元组,DS = (D,R)

其中:D 是数据元素的有限集合,R 是数据元素之间关系的有限集合。

数据的存储结构包括顺序存储结构和链式存储结构两种。C#语言中用数组来实现顺序存储结构。

算法的5个重要特征: 1.有穷性。2.确定性。3.可行性。4.输入。5.输出。

线性表:存在一对一的线性关系,一对一的关系指的是数据元素之间的位置关系

特点:(1)除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素

   (2)除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素

线性表(List)是由 n(n≥0)个相同类型的数据元素构成的有限序列。线性表通常记为:L=(a1,a2,…,ai-1,ai, ai+1,…,an),a1是线性 表中第一个位置的数据元素。an是线性表中最后一个位置 的数据元素,。n为线性表的表长,n=0 时的线性表被称 为空表(Empty List)。

线性表的接口如下所示。

public interface IListDS<T> 
{
    int GetLength();    //求长度
    void Clear();    //清空操作
    bool IsEmpty();    //判断线性表是否为空
    void Append(T item);    //附加操作 
    void Insert(T item, int i);    //插入操作 
    T Delete(int i);    //删除操作 
    T GetElem(int i);    //取表元 
    int Locate(T value);    //按值查找
}

线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素, 用这种方式存储的线性表叫顺序表(Sequence List)。顺序表的特点 是表中相邻的数据元素在内存中存储位置也相邻。数据元素占w个存储单元,设第i个数据元素的存储地址为Loc(ai),则有:Loc(ai)= Loc(a1)+(i-1)*w              1≤i≤n。

由于计算顺序表中每个数据元素存储地址的时间相同,所以顺序表 具有随机存取的特点。数组具有表示顺序表的数据存储区域的特 性。

 last 表示顺序 表中最后一个数据元素在数组中的位置。如果顺序表中有数据元素时,last 的变 化范围是 0 到 maxsize-1,如果顺序表为空,last=-1

顺序表类 SeqList<T>的实现说明如下所示。

技术分享图片
public class SeqList<T> : IListDS<T>
{
    private int maxsize;    //顺序表的容量
    private T[] data;    //数组,用于存储顺序表中的数据元素
    private int last;    //指示顺序表最后一个元素的位置
    //索引器
    public T this[int index]
    {
        get { return data[index]; }
        set { 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 int GetLength()
    {
        return last + 1;
    }
    //清空顺序表
    public void Clear()
    {
        last = -1;
    }
    //判断顺序表是否为空
    public bool IsEmpty()
    {
        if (last == -1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //判断顺序表是否为满
    public bool IsFull()
    {
        if (last == maxsize - 1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //在顺序表的末尾添加新元素
    public void Append(T item)
    {
        if (IsFull())
        {
            System.Console.WriteLine("满了");
            return;
        }
        data[++last] = item;
    }
    //在顺序表的第i位置插入一个数据元素
    public void Insert(T item, int i)
    {
        if (IsFull())
        {
            System.Console.WriteLine("满了");
            return;
        }
        if (i < 1 || i> last+2)
        {
            System.Console.WriteLine("越界");
            return;
        }
        if(i==last+2)
        {
            data[last+1]=item;
        }
        else
        {
            for (int j = last; j >= i - 1; --j)
            {
                data[j + 1] = data[j];
            }
            data[i - 1] = item;
        }
        ++last;
    }
    //删除顺序表的第i个数据元素
    public T Delete(int i)
    {
        T tmp = default(T);
        if (IsEmpty())
        {
            Console.WriteLine("List is empty");
            return tmp;
        }
        if (i < 1 || i > last + 1)
        {
            Console.WriteLine("Position is error!");
            return tmp;
        }
        if (i == last + 1)
        {
            tmp = data[last--];
        }
        else
        {
            tmp = data[i - 1];
            for (int j = i; j <= last; ++j)
            {
                data[j] = data[j + 1];
            }
        }
        --last;
        return tmp;
    }
    //获得顺序表的第i个数据元素
    public T GetElem(int i)
    {
        if (IsEmpty() || (i < 1) || (i > last + 1))
        {
            Console.WriteLine("List is empty or Position is error!");
            return default(T);
        }
        return data[i - 1];
    }
    //在顺序表中查找值为value的数据元素
    public int Locate(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)
        {
            return -1;
        }
        return i;
    }
}
 
SeqList

 顺序表的倒置 算法思路:把第一个元素与最后一个元素交换,把第二个元素与倒数第二个元素交换。一般地,把第 i 个元素与第 n-i 个元素交换,i 的取值范围是 0 到 n/2(n 为顺序表的长度)。算法实现如下:

public void ReversSeqList(SeqList<int> L)
{
    int tmp = 0;
    int len = L.GetLength();
    for (int i = 0; i<= len/2; ++i)
    {
        tmp = L[i];
        L[i] = L[len - i]; 
     L[len - i] = tmp; } }

 

C#数据结构_01

标签:osi   his   算法实现   col   ons   this   pos   false   sharp   

原文地址:https://www.cnblogs.com/shirln/p/7739939.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!