数据结构第2章线性表

来源:互联网 发布:淘宝上最好的中药店 编辑:程序博客网 时间:2024/05/02 11:19

 

       线性表这一章具体的讲解了数据结构的分类即逻辑结构和存储结构,因此本章第一节从线性表的逻辑结构让我们对线性表的定义和线性表的抽象数据类型的定义有了全面的了解,而二三节讲解线性表的存储结构 即顺序表采用顺序存储结构,即用一段地址连续的存储单元依次存储线性表的数据元素,数据元素之间的逻辑关系通过存储位置来实现。链表采用链接存储结构,即用一组任意的存储单元存放线性表的元素,用指针来反映数据元素之间的逻辑关系。第四节则是顺序表和链表的比较,第五节使线性表的其他储存。

第一节      

                                    线性表的定义:简称表,是n(n〉=0)个具有相同类型的数据元素的有限序列,线性表中数                                据元素的个数为线性表的长度。长度为0时成为空表,一个非空表通常记为(L=a1a2......an)

线性表的逻辑结构{

                                                  线性表的抽象数据类型的定义

ADT List
Data
      线性表中的数据元素具有相同类型,
      相邻元素具有前驱和后继关系
Operation
InitList
    前置条件:表不存在
    输入:无
    功能:表的初始化
    输出: 无
    后置条件:建一个空表


DestroyList
    前置条件:表已存在
    输入:无
    功能:销毁表
    输出:无
    后置条件:释放表所占用的存储空间
Length
    前置条件:表已存在
     输入:无
     功能:求表的长度
     输出:表中数据元素的个数                                             
     后置条件:表不变
Get                               
    前置条件:表已存在
    输入:元素的序号i
    功能:在表中取序号为i的数据元素
    输出:若i合法,返回序号为i的元素值,否则抛出异常
    后置条件:表不变
Locate
    前置条件:表已存在
    输入:数据元素x
    功能:在线性表中查找值等于x的元素
    输出:若查找成功,返回x在表中的序号,否则返回0
    后置条件:表不变

Insert
 前置条件:表已存在
 输入:插入i;待插x
 功能:在表的第i个位置处插入一个新元素x
 输出:若插入不成功,抛出异常
    后置条件:若插入成功,表中增加一个新元素
Delete
 前置条件:表已存在
 输入:删除位置i
 功能:删除表中的第i个元素
    输出:若删除成功,返回被删元素,否则抛出异常
    后置条件:若删除成功,表中减少一个元素
Empty
    前置条件:表已存在
    输入:无
    功能:判断表是否为空
    输出:若是空表,返回1,否则返回0
    后置条件:表不变
ADT
第2节

线性表的顺序结构及其实现

线性表的存储结构————顺序表

顺序表是一种随机存取的存储结构

顺序表的实现

顺序表类的声明

const int MaxSize=100; 
template <class DataType>                    //模板类
class SeqList
{
 public: 
     SeqList( ) ;                                     //构造函数
     SeqList(DataType a[ ], int n);      
     ~SeqList( ) ;                                 //析构函数
     int Length( );                               //线性表的长度
     DataType Get(int i);                   // 按查找,查找表中第i个元素
     int Locate(DataType x );           //按查找,线性表中查找值为x的元素序号
     void Insert(int i, DataType x);  //插入操作,在线性表的第i个元素插入值为x的元素
     DataType Delete(int i);           //删除操作,删除线性表的第i个元素
 private:
     DataType data[MaxSize];    //存放数据元素的数组
     int length;                           //线性表的长度
};

(具体算法见课本25-19页)

例:template <class DataType> 
void SeqList<DataType>::Insert(int i, DataType x)
{
      if (length >= MaxSize) throw "上溢";     //判断是否表满
      if (i < 1 || i > length + 1) throw "位置";  //判断位置插入是否合理
      for (j = length; j >= i; j--)                      //最后一个元素至第i个元素分别后移1位
           data[j] = data[j-1];                         //将元素x填到位置i处
      data[i-1] = x;                                     //将元素x填入i处
      length++;                                         //表长加1
}

第三节
线性表的链接结构及其实现

线性表的链接存储结构————单链表
存储思想:用一组任意的存储单元存放线性表的元素

存储特点:
1.逻辑次序和物理次序
    不一定相同。
2.元素之间的逻辑关系
    用指针表示

 

data:存储数据元素
next:存储指向后继结点的地址

头结点:在单链表的第一个元素结点之前附设一个类型相同的结点,以便空表和非空表处理统一。

单链表类的声明

template <class DataType>
class LinkList
{  
public:
     LinkList( );
     LinkList(DataType a[ ], int n);
     ~LinkList( );
     int Length( );         
     DataType Get(int i);          
     int Locate(DataType x);      
     void Insert(int i, DataType x);  
     DataType Delete(int i);       
     void PrintList( );          
private:
     Node<DataType> *first;
};

具体算法31-40页

template <class DataType> 
DataType LinkList<DataType> :: Delete(int i)
{
     p = first ; count = 0;            //工作指针初始化,累加器count初始化
     while (p != NULL && count < i - 1)//查找第i-1个节点
     {
         p = p->next;
         count++;
     }
     if (p == NULL || p->next == NULL)  throw "位置";
     else {
         q = p->next; x = q->data;  //暂存被删节点      
         p->next = q->next;          //摘链    
         delete q;

 return x;
     }
}
双链表:在单链表的每个结点中再设置一个指向其前驱结点的指针域。
顺序列表和链表的比较

 1线性表需频繁查找却很少进行插入和删除操作,或其操作和元素在表中的位置密切相关时,宜采用顺序表作为存储结构;线性表需频繁插入和删除时,则宜采用链表做存储结构。
2线性表中元素个数变化较大或者未知时,最好使用链表实现;而如果用户事先知道线性表的大致长度,使用顺序表的空间效率会更高。

第四节

线性表的其他存储方式

1.静态链表

2.间接寻址

 

 

 

 

 

 

 


 

0 0
原创粉丝点击