数据结构学习(2.线性表)

线性表


线性表的定义和特点

线性表示具有相同特性的数据元素的一个有限序列
(a1,a2,a3…an)
ai-1(ai的直接前驱) ai ai+1(ai的直接后继)
当n=0时为空表
其中数据元素的个数n定义为标的长度
非空线性表标记为(a1,a2…an)
每一个数据元素虽然值不同,但是具有的数据类型相同,同时数据元素之间具有一种“线性”或者“一对一”的逻辑关系

案例引入总结

  • 线性表中的数据元素的类型可以为简单类型,也可以为复杂类型
  • 许多实际问题所涉及到的基本操作(增删改查)有很大的相似性,不应该为具体应用单独编写一个程序,找出共性。
  • 抽象出共性的逻辑结构和基本操作(抽象数据类型)然后具体研究实现存储结构和基本操作

线性表的类型定义

ADT List{
       
数据对象: D={
   ai | aiEElemSet, i=l, 2, …, n, n>=0}    
数据关系:R=(<a<sub>i-1</sub>,a<sub>i</sub>>,a<sub>i-1</sub>,a<sub>i</sub> 属于D, i=2,, n}       
基本操作:       
InitList (&L)__初始化操作__       
操作结果:构造一个空的线性表L。    
DestroyList(&L)__销毁操作__    
初始条件:线性表L已存在。    
操作结果:销毁线性表L。    
ClearList (&L)__清除操作__    
初始条件:线性表L已存在。    
操作结果:将L重置为空表。    
ListEmpty(L)__判空操作__    
初始条件:线性表L已存在。    
操作结果:若L为空表,则返回true, 否则返回false。    
ListLength(L)__求线性表的长度操作__    
初始条件:线性表L已存在。    
操作结果:返回L中数据元素个数。    
GetElem(L,i,&e)__读取第i个数据元素操作__
初始条件:线性表L巳存在,且1 <= i <= ListLength(L)。
操作结果:用e返回L中第1个数据元素的值。
LocateElem(L,e,compara())__查找操作__
初始条件:线性表L已存在,compare()是数据元素判定函数。判定条件
操作结果:返回L中第1个值与e满足compare()的数据元素在L中的位置 。若这样的数据元素不存在 ,则返回值为0PriorElem(r,cur_e,&pre_e)__获取一个元素的前趋__
初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回其前驱,否则操作失败,pre_e无定义。
NextElem(L,cur_e,&next_e)__获取一个元素的后继__
初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回其后继,否则操作失败,next_e无定义。
Listinsert(&L,i,e)__插入操作__
初始条件:线性表L已存在,且1<=i<=ListLength (L) +l。
操作结果:在L中第1个位置之前插入新的数据元素 e, L的长度加1ListDelete(&L,i)__删除操作__
初始条件:线性表L已存在且非空,且l<=i<=ListLength(L)。
操作结果:删除L的第1个数据元素,L的长度减1TraverseList(L,visited())__遍历线性表__
初始条件:线性表L已存在。
操作结果:对线性表L进行遍历,在遍历过程中对L的每个结点访问一次。依次对线性表中的每个元素调用visited()
} ADT List

线性表的顺序表示和实现

顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的出处单元中的存储结构
(就是说逻辑上相邻,物理上(存储上)也相邻)
线性表的第一个元素就是线性表的 起始地址
线性表顺序存储结构 占用一片连续的存储空间 .知道某个元素的存储位置就鞥计算其他元素的存储位置。顺序表随机存取
公式:(假设一个数据元素占C个字节)

Loc(ai)=Loc(a1)+(i-1)xC

线性表的顺序存储
线性表的顺序存储-顺序表

  • 数组静态分配
typedef int ElemType;//为了描述算法的方便,数据元素类型自定义为int类型
#define MaxSize 50
 
typedef struct
{
   
    ElemType elem[MaxSize];
    int length;
}SqList;//顺序表类型 
  • 数组动态分配
#include<stdlib.h>
#define MaxSize 100
 
typedef struct
{
   
    ElemType* elem;//指针,指向elem首元素地址,存放线性表中的数据元素
    int length;//存放当前顺序表中的元素个数
    int size;  //顺序表的容量
}SqList;
SqList L;
L.elem=(ElemType*)malloc(sizeof(ElemType)*MaxSize);
free(date);//释放动态内存
elem=NULL;//指针为空,防止野指针,更安全

顺序表的基本操作的实现

  • 预定义常量和类型
//函数结果状态代码
#define TURE 1
#difine FALSE 0
#difine OK 1
#difine ERROR 0
#difine INFEASIBLE -1
#difine OVERFLOW -2
//Status 是函数的类型,其值时函数结果状态代码
typedef int Status;
typedef char ElemType;
  • 初始化顺序表L
Status InitList(SqList &L)//&引用
{
   
    L.elem=(ElemType*)malloc(sizeof(ElemType)*MaxSize);//分配预定空间的大小
    if(!L.<
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值