第三章 线性表(C#实现)

1、线性表

  概念::零个或多个数据元素的有序序列。

  描述:

2、线性表的抽象数据类型:

  ADT线性表

  Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType。其中除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素,数据元素之间的关系是一对一的关系。

  Operation

  Init(*L):初始化操作,建立一个空的线性表;

  IsEmpty(*L):判断线性表是否为空,若为空,则返回true,否则返回false;

  Clear(*L):清空线性表;

  GetElem(*L,i):返回线性表位置为i的元素;

  LocateElem(*L,e):返回线性表中与元素i相同值的位置;

  Insert(*L,i,e):在线性表i位置插入元素e;

  Delete(*L,i):删除线性表位置i的元素;

  GetLength(*L):获得当前线性表的长度。

endADT

3、线性表的顺序存储结构

  概念:用一段地址连续的存储单元存储线性表的数据元素。

  如图:

    

    算法的C#语言实现

    

  /// <summary>
    /// 线性表的顺序存储结构
    /// </summary>
    public class SequentialStorageLinearList<T>
    {
        //最大存放数量
        private int _maxLength;

        /// <summary>
        /// 最大存储数量
        /// </summary>
        public int MaxLength
        {
            get
            {
                return _maxLength;
            }
        }

        // 当前存放位置
        private int _currentLength;

        private T[] _LinearList;

        //利用构造函数创建一个数组,用来存放数据
        public SequentialStorageLinearList(int maxLength)
        {
            if (maxLength <= 0)
                throw new Exception("The length can not be less than zero.");
            _maxLength = maxLength;
            _currentLength = 0;
            _LinearList = new T[_maxLength];
        }

        /// <summary>
        /// 判断线性表是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return _currentLength == 0;
        }

        /// <summary>
        /// 清空所有的元素
        /// </summary>
        public void ClearAll()
        {
            if (_currentLength > 0)
            {
                /*
                 * 在高级语言.net中,我们可以重新创建一个新的数组,将其指向当前的_linearList
                 *由于是托管代码,资源不需要手动释放,会自动释放
                 *但是在c语言中,我们需要手动的释放其占用的空间(free)
                 */
                _LinearList = new T[0];
            }
        }

        /// <summary>
        /// 根据
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T GetElement(int i)
        {
            if (_currentLength == 0 || _currentLength < i || i < 1)
                throw new Exception("Not find any Element.");
            T t = _LinearList[i];
            return t;
        }

        /// <summary>
        /// 查找数据中是否存在元素e
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public int IndexOf(T e)
        {
            if (_currentLength == 0)
                throw new Exception("The array is empty.");
            for (int i = 0; i < _currentLength; i++)
            {
                T t = _LinearList[i];
                /*
                 * T可能是引用类型,我们暂时的比较方式,不考虑重写equals
                 */
                if (t.Equals(e))
                {
                    return i;
                }
            }
            return -1;
        }

        /// <summary>
        /// 在位置i处插入元素e
        /// </summary>
        /// <param name="e">待插入的元素e</param>
        /// <param name="i">插入位置i</param>
        public void Insert(T e, int i)
        {
            //数组已经存满
            if (_currentLength == _maxLength)
                throw new Exception("The array is full.");
            //当i位置不在范围内
            if (i < 1 || i > _currentLength + 1)
                throw new Exception("The location is illegal.");
            //若插入的数据不在表尾,在需要移动插入位置后面的数据一位
            if (i <= _currentLength - 1)
            {
                for (int j = _currentLength - 1; j > i; j--)
                {
                    _LinearList[j + 1] = _LinearList[j];
                }
            }
            _LinearList[i - 1] = e;
            _currentLength++;
        }

        /// <summary>
        /// 删除位置i处的元素
        /// </summary>
        /// <param name="i">位置i</param>
        public void Delete(int i)
        {
            if (_currentLength == 0)
                throw new Exception("The array is Empty.");
            if (i < 1 || i > _currentLength)
                throw new Exception("The location is illegal.");
            //删除位置i元素后需要将i后面的元素依次递增一位
            if (i < _currentLength)
            {
                for (int k = k-1; k < _currentLength; k++)
                {
                    _LinearList[k - 1] = _LinearList[k];
                }
            }
            _currentLength--;
        }
    }

  

时间: 2024-11-02 14:58:16

第三章 线性表(C#实现)的相关文章

第三章 线性表

线性表:零个或多个数据元素的有限序列.序列:说明元素之间是有顺序的.若元素存在多个,则第一个元素无前驱,最后一个元素无后缀.其他元素都只有一个前缀和一盒后缀. 线性表中,数据元素有多个数据项. 线性表的抽象数据类型 定义: 线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素. 线性表的链式存储结构:在链式结构中,除了要存数据元素信息外,还要存储它的后继元素的存储地址,把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域.指针域中存储的信息称为指针或链.这两

第三章 线性表---链式存储结构(双向链表)

双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.结点都有两个指针域,一个指向直接后继,另一个指向直接前驱. 实例: 链表--双向链表 现在分析添加的情况已经有1号英雄和5号英雄,现在要添加3号英雄此时cur指向了1号英雄,hero指向3号英雄cur指向1号英雄,发现cur的下一个是5号英雄,大于要添加的3号英雄分析图过程 (1)让3号英雄指向5号英雄,即把这个①号线搭起来$hero->next=$cur->next; //$cur指向1

第三章 线性表---链式存储结构(循环链表)

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list) 结构模型

大话数据结构读书笔记系列(三)线性表

    转载请注明来源:http://blog.csdn.net/u010194538/article/details/51001353 第3章线性表 3.2 线性表的定义 线性表(List):零个或多个数据元素的有限序列. 元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继. 线性表强调是有限的. 在较复杂的线性表中,一个数据元素可以由若干个数据项组成. 3.4 线性表的顺序存储结构 线性表的顺序存储结构,指的是用一段地址连续的

随便玩玩之PostgreSQL(第三章)表连接查询

随便玩玩之PostgreSQL(第三章)表连接查询 随便玩玩之PostgreSQL 未经授权不得转载

数据结构期末复习第二章线性表

第二章:线性表 1.线性结构的基本特征答:线性结构是若干数据元素构成的有序(次序)集① 集合中必存在唯一的一个“第一元素”:② 集合中必存在唯一的一个 “最后元素”:③ 除第一元素之外,均有 唯一的前驱:④ 除最后元素之外,均有 唯一的后继. 2.线性表的顺序存储结构和链式存储结构分别是______.(  D )   A. 顺序存取的存储结构.顺序存取的存储结构  B. 顺序存取的存储结构.随机存取的存储结构   C. 随机存取的存储结构.随机存取的存储结构  D. 随机存取的存储结构.顺序存取

第二章——线性表

线性表 一.定义 线性表是最常用且最简单的一种数据结构. 简而言之,一个线性表是n个数据元素的有限的序列. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的 (注意,这句话只适用大部分线性表,而不是全部.比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点).by~百度百科 二.线性表的顺序表示和实现 1.顺序表示指的是用一组地址连续的储存单元依次储存线性表的数据元素. 通常用数组来

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

数据结构与算法(三)-线性表之静态链表

前言:前面介绍的线性表的顺序存储结构和链式存储结构中,都有对对象地引用或指向,也就是编程语言中有引用或者指针,那么在没有引用或指针的语言中,该怎么实现这个的数据结构呢? 一.简介 定义:用数组代替指针或引用来描述单链表,即用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法: 上面的静态链表图有两个数组游标和数据,其中数据数组存储数据,而游标数组存储同下标为数据的下一个数据的下标值,简单模拟一下静态链表遍历的过程: 先查看下标为999的游标数组值:1: 根据游标数组值1,查找下标为1的数据: