线性表的顺序存储结构

1、我们将实现一个顺序存储结构

经典的C语言描述的线性表顺序存储结构通常使用数组来实现的,下面我们也将用数组来实现。我们将实现线性表的增删改查的功能。

顺序存储结构操作的要点和难点其实就是数组的批量移动。因为在数组描述的顺序表中,删除操作,需要将从待删除元素的位置之后的所有元素都往前移动一位;而插入操作,需要将待插入元素的位置,包括原先在该位置的元素及其后面的元素都往前移动一位。而实现删除和插入元素的重点就在于计算出要移动多少元素和从什么位置开始移动。计算要移动多少元素通常用顺序表的长度-要移动的位置。从什么位置开始移动,通常由要插入(或删除)的位置进行一些简单的计算。具体的实现如下所示。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DataStructure

{

    public class SqList

    {

        const int MAX_LENTH = 100;    //定义线性表的存储空间大小

        public int Lenth;             //线性表的长度,我们将通过线性表的长度判断线性表是否为空,通过Lenth存取线性表

        public int[] data = new int[MAX_LENTH];

 

 

        public int GetLength() //求长度

        {

            return this.Lenth;

        }

        public void Clear()//清空操作

        {

            //长度设置为0

            this.Lenth = 0;

        }

        public bool IsEmpty()//判断线性表是否为空

        {

            //这里通过判断线性表的长度

            return Lenth == 0 ? true : false;

        }

        /// <summary>

        /// 将元素附加到最后一个位置

        /// </summary>

        /// <param name="item"></param>

        /// <returns></returns>

        public States Append(int item) //

        {

            if (this.Lenth + 1 == MAX_LENTH)

            {

                return States.Fail;

            }

            data[this.Lenth] = item;

            this.Lenth++;

            return States.Success;

        }

        /// <summary>

        /// 插入操作

        /// </summary>

        /// <param name="item">值</param>

        /// <param name="i">位置</param>

        public States Insert(int item, int index)//插入操作

        {

            //异常检查

            if (index < 0 || index > this.Lenth) return States.Fail;//检查插入的位置

            if (this.Lenth + 1 > MAX_LENTH) return States.Fail; //检查数组是否会溢出

 

            //假设线性表中有三个元素0,1,2。当将item=3插入1的位置的时候,1,2各往后移动一位,

            //item=3插入到原来1的位置

            if (index == this.Lenth)

            {

                data[this.Lenth] = item;

                this.Lenth++;

                return States.Success;

 

            }

            int move = this.Lenth - index;

            int NextPosition;

            NextPosition = this.Lenth - 1;

            for (int i = 0; i < move; i++)

            {  //将index之后的元素全部往后移一位

 

                data[NextPosition + 1] = data[NextPosition];

                NextPosition--;

            }

            data[index] = item;

            this.Lenth++;

            //将item插入位置

            return States.Success;

 

        }

        /// <summary>

        /// 删除元素并返回元素的值

        /// </summary>

        /// <param name="index"></param>

        /// <param name="states"></param>

        /// <returns></returns>

        public int Delete(int index, out States states)//删除操作

        {

            //异常检查

            if (index < 0 || index > this.Lenth)

            {

                states = States.Fail;//检查插入的位置

                return 0;

            }

            if (this.Lenth == 0)//检查是否有值可以被删除

            {

                states = States.Fail;

                return 0;

 

            }

 

            int iDataToDel = data[index];

            if (index == this.Lenth - 1)              //如果正好是最后一个元素,则不需要移动

            {

                this.Lenth--;

                states = States.Success;

                return iDataToDel;

            }

 

            int PositionToMove = index + 1;//要开始往前移动的位置

            //(1)要移动多少元素

            int iMove = this.Lenth - PositionToMove;

            //(2)循环移动元素

            for (int i = 0; i < iMove; i++)

            {

                data[PositionToMove - 1 + i] = data[PositionToMove + i];

            }

            //(3)长度-1

            this.Lenth--;

            //(4)返回要删除的元素

            states = States.Success;

            return iDataToDel;

        }

        public int GetElem(int i)

        {  //取表中的元素

            return this.data[i];

        }

        /// <summary>

        /// 返回查找到的第一个位置

        /// </summary>

        /// <param name="value"></param>

        /// <param name="states"></param>

        /// <returns></returns>

        public int Locate(int value, out States states)

        {   //按值查找

            for (int i = 0; i < this.Lenth; i++)

            {

                if (value == data[i])

                {

                    states = States.Success;

                    return i;

                }

            }

            states = States.Fail;

            return 0;

        }

 

    }

    //定义一个用来指示操作是否成功的枚举量

    public enum States

    {

        Success,

        Fail

    }

 

}

 

 

2、使用C#特有的语法来实现经典顺序存储结构

下面,我们将对以上实现的顺序存储线性表用C#特有的语法进行改造。主要的改造如下:

1、使用模板template抽象线性表元素的类型;

2、使用索引器简化元素的访问;

3、使用属性代替特定的方法。

为了保持两边方法签名的一致性,我们利用vs2010中提取接口的功能将相关的方法提取为接口

                                                        图1 提取接口

提取后的接口,如下所示

using System;

namespace DataStructure

{

    interface ISqList

    {

        States Append(int item);

        void Clear();

        int Delete(int index, out States states);

        int GetElem(int i);

        int GetLength();

        States Insert(int item, int index);

        bool IsEmpty();

        int Locate(int value, out States states);

    }

}

为了让我们的线性表能够适应不同的元素类型,我们稍微改变一下接口的声明。我们所需要做的只是将具体的元素类型使用模板进行填充,如下所示。有变化的部分都用灰色背景进行标识。

using System;

namespace DataStructure

{

    interface ISqList<T>

    {

       States Append(T item);

        void Clear();

        T Delete(int index, out States states);

       T GetElem(int i);

        int GetLength();

        States Insert(T item, int index);

        bool IsEmpty();

        int Locate(T value, out States states);

    }

}

我们遵循着前面提到的3个改造将经典的顺序表改造得更C#,详见以下代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DataStructure

{

    class AD_Sqlist<T> : ISqList<T>

    {

        const int MAX_LENTH = 100;//定义线性表的存储空间大小

        public T[] data = new T[MAX_LENTH];

 

        private int lenth;

        /// <summary>

        /// 线性表的长度

        /// </summary>

        public int Lenth

        {

            get { return lenth; }

            set { lenth = value; }

        }

        /// <summary>

        /// 判断线性表是否已满

        /// </summary>

        public bool IsFull

        {

            get

            {

                if (Lenth + 1 > MAX_LENTH)

                {

                    return true;

                }

                else

                {

                    return false;

                }

            }

        }

 

        public States Append(T item)

        {

            if (IsFull == true)

            {

                return States.Fail;

            }

            data[this.Lenth] = item;

            return States.Success;

        }

 

        public void Clear()

        {

            this.Lenth = 0;

        }

 

        public T Delete(int index, out States states)

        {

            if (Lenth == 0)

            {

                states = States.Fail;

                return default(T);

            }

            if (index >= this.Lenth)

            {

                states = States.Fail;

                return default(T);

            }

            //(1)要移动多少位

            int move = this.Lenth - 1 - index;

 

            //(2)从哪一位开始移动

            int position = index + 1;

            T dataToDel = data[index];//将要被删除的元素

 

            //(3)将所有元素都批量往前移动

            for (int i = 0; i < move; i++)

            {

                data[position - 1] = data[position];

                position++;

            }

            Lenth--;

            //(4)返回被删除的元素

            states = States.Success;

            return dataToDel;

        }

 

        public T GetElem(int i)

        {

            if (< 0 || i >= this.Lenth)

            {

                return default(T);

            }

            return this.data[i];

        }

        public T this[int i]

        {

            get

            {

 

                if (< 0 || i >= this.Lenth)

                {

                    return default(T);

                }

                return this.data[i];

            }

 

        }

        public int GetLength()

        {

            return this.Lenth;

        }

 

        public States Insert(T item, int index)

        {

            //(1)线性表是否已满

            if (IsFull == true)

            {

                return States.Fail;

            }

 

            //(2)插入的位置是否正确

            if (index < 0 || index > this.Lenth)

            {

                return States.Fail;

            }

            if (index == this.Lenth)

            {

                data[index] = item;

                this.Lenth++;

                return States.Success;

            }

            //(3)将要移动的个数

            int move = this.Lenth - 1 - index;

            //(4)准备移动的位置

            int position = this.Lenth - 1;

            //(5)批量移动

            for (int i = 0; i <= move; i++)

            {

                this.data[position + 1] = this.data[position];

                position--;

            }

            this.data[index] = item;

            //(6)返回

            this.Lenth++;

            return States.Success;

        }

 

        public bool IsEmpty()

        {

            if (this.Lenth == 0)

            {

                return true;

            }

            else

            {

                return false;

            }

        }

 

        public int Locate(T value, out States states)

        {

            if (IsEmpty() == true)

            {

                states = States.Fail;

                return 0;

            }

            else

            {

                for (int i = 0; i < this.Lenth; i++)

                {

                    if (this.data[i].Equals(value))

                    {

                        states = States.Success;

                        return i;

                    }

                }

            }

            states = States.Fail;

            return 0;

        }

    }

}

 

作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/3189699.html

时间: 2024-12-03 08:17:20

线性表的顺序存储结构的相关文章

大话数据结构一:线性表的顺序存储结构

1. 线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素. 2. Java实现线性表的顺序存储结构: // 顺序存储结构 public class SequenceList { private static final int DEFAULT_SIZE = 10; // 默认初始化数组大小 private int size; // 当前数组大小 private static Object[] array; public SequenceList() { init(DEF

数据结构的C++实现之线性表之顺序存储结构

线性表的数据对象集合为 {a1,a2,....an},每个元素的类型均为Datatype.其中,除第一个元素a1外,每一个元素有且 只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素.数据元素之间的关系是一对一的 关系. 线性表的顺序存储结构的优缺点: 优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间:可以快速地存取表中任一位置的元素O(1) 缺 点:插入和删除操作需要移动大量元素O(n):当线性表长度变化较大时,难以确定存储空间的容量:造成存储空间的"碎

小菜一步一步学数据结构之(三)线性表的顺序存储结构

线性表的定义和特点 定义: 有n(n≥0)个数据特性相同的元素构成的有序序列称为线性表. 当个数n(n≥0)定于为线性表的长度,n=0时成为空表. 特点: 只有一个首结点和尾结点: 除首尾结点外,其他结点只有一个直接前驱和一个直接后继. 分析26个英文字母组成的英文表(A,B,C,D,-..,Z)数据元素都是字母,元素间关系是线性 抽象数据类型的定义为: ADT List { 数据对象:D={ai|ai∈ElemSet,i1,2,3...n,n≥0} 数据关系:R={<ai-1,ai|ai-1,

数据结构教程 第七课 实验一 线性表的顺序存储实验

本课主题: 实验一 线性表的顺序存储实验 教学目的: 掌握顺序表的定义及操作的C语言实现方法 教学重点: 顺序表的操作的C语言实现方法 教学难点: 顺序表的操作的C语言实现方法 实验内容: 利用顺序表完成一个班级的一个学期的所有课程的管理:能够增加.删除.修改学生的成绩记录. 实验要求: 在上机前写出全部源程序.

算法速成(七)线性表之顺序存储

人活在社会上不可能孤立,比如跟美女有着千丝万缕的关系,有的是一对一,有的是一对多,有的 是多对多. 哈哈,我们的数据也一样,存在这三种基本关系,用术语来说就 是: <1>  线性关系. <2>  树形关系. <3>  网状关系. 一: 线性表 1 概念: 线性表也就是关系户中最简单的一种 关系,一对一. 如:学生学号的集合就是一个线性表. 2 特征: ① 有且只有 一个"首元素". ② 有且只有一个"末元素". ③ 除"

数据结构 算法-线性表算法关于结构体指针的问题

问题描述 线性表算法关于结构体指针的问题 typedef struct{ ElemType data[MAX]; int length; }SqList; //删除顺序表L中第i个位置的算法 bool ListDelete(SqList &L,int i,int &e) { if(iL.length) return false; e=L.data[i-1]; for(int j=i;j<L.length;j++) L.data[j-1]=L.data[j]; L.length--;

线性表的顺序存储

参考自:http://blog.csdn.net/u010187139/article/details/46659943 // // main.c // SqlListDemo //对其改变的传地址,对其使用读取的传 // Created by zhanggui on 15/8/11. // Copyright (c) 2015年 zhanggui. All rights reserved. // #include <stdio.h> //定义常量 存储空间的初始化分配 #define MAX

数据结构教程 第六课 线性表的顺序表示和实现

本课主题: 线性表的顺序表示和实现 教学目的: 掌握线性表的顺序表示和实现方法 教学重点: 线性表的顺序表示和实现方法 教学难点: 线性表的顺序存储的实现方法 授课内容: 复习 1.存储结构 逻辑结构   "数据结构"定义中的"关系"指数据间的逻辑关系,故也称数据结构为逻辑结构. 存储结构   数据结构在计算机中的表示称为物理结构.又称存储结构. 顺序存储结构 链式存储结构 2.线性表的类型定义 一.线性表的顺序表示 用一组地址连续的存储单元依次存储线性表的数据元素

大话数据结构之三:线性表

1.定义: 线性表表示0个或者多个数据元素的有限序列 线性表的特性有: 除第一个元素外,每一个元素均有一个直接前驱 出最后一个元素外,每一个元素均有一个直接后继 2.线性表抽象数据类型 ADT List  Data          /*线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType.其中,除第一个元素a1外,   每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素.   数据元素直接是一对一的关系.*/  Op