1.线性表:顺序表、链表 —— 数据结构 (严蔚敏C语言版)

线性表

线性表定义

线性表(Linear List) : 由n个具有相同特性的数据元素(结点)a1, a2,…组成的有限序列。

  • 其中数据元素的个数n定义为表的长度。
  • 当n=0时称为空表将非空的线性表(n>0)记作: (a1, a2, …an)

线性表特性

线性表的逻辑特征是:

  • 在非空的线性表, 有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2;
  • 有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋an-1;
  • 其余的内部结点都有且仅有一个直接前趋ai-1.和一个直接后继ai+1。
  • 元素个数有限。
  • 线性表是一种逻辑结构,表示元素之间一对一相邻的关系。1233
  • 线形表顺序存储结构占用一片连续的存储空间。知道某个元素的存储位置就可以计算其他元素的存储位置。

在这里插入图片描述

在这里插入图片描述

线性表的顺序表示

线性表的基本操作(抽象数据类型定义)
  • InitList(&L)
    //初始化操作,建立一个空的线性表L

  • DestertList(&L)
    //销毁已存在的线性表L

  • ClearList(&L)
    //将线性表清空

  • ListInsert(&L, i, e)
    //在线性表L中第i个位置插入新元素e

  • ListDelete(&L i, &e)
    //删除线性表L中第i个位置元素,用e返回

  • lsEmpty(L)
    //若线性表为空,返回true,否则false

  • ListLength(L)
    //返回线性表L的元素个数

  • LocateElem(L, e)
    // L中查找与给定值e相等的元素,若成功返回该元素在表中的序号,否则返回0

  • GetElem(L,i, &e)

    // 将线性表L中的第i个位置元素返回给e

定义线性表
#define MAXSIZE 100
    typedef struct{
   
   
    ElemType *elem;
    int length;
} SqList; 

顺序表基本操作的实现

1.构造顺序表

Status InitList Sq(SqlList &L){
   
   //构造一个空的顺序表L
    L.elem= new ElemType[MAXSIZE];	 //1.为顺序表分配空间
    if(!L.elem)   exit(OVERFLOW);	//2.判断是否有足够的存储空间:存储分配失败退出,分配成功,则继续执行
    L.length=0; 					//3.空表:长度为0
    return OK;
}

//status用来返回本函数是否执行成功:1.OK  2.ERROR  3.OVERFLOW
//!L.elem   :如果不存在

2.销毁顺序表

void DestroyList(SqList &L) {
   
   
	if (L.elem) 
    delete L.elem; //释放存储空间
}

3.顺序表的取值(根据位置 i 获取相应位置数据元素的内容) 随机存取

Status GetElem(SqList L, int i, ElemType &e){
   
   
    if (i<1 || i>L.length) return ERROR; 	//第一步:判断i值是否合理,若不合理,返回ERROR
    e=L.elem[i-1];						//第二步:elem[i-1]单元存储第i个数据元素
    return OK;							//查找成功
}
//e=L.elem[i-1];    返回的是数组下标,而不是元素位置,所以是i—1

4.顺序表的查找

算法思想:

  • 在线性表L中查找与指定值e相同的数据元素的位置
  • 从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0。

按值查找:时间复杂度:最好O(1) 平均O(n) 最坏O(n)

int LocateElem (SqList L, ElemType e){
   
   //在顺序表L中查找值为e的数据元素,返回其序号
    for(i=0;i< L.length;i++)
    if(L.elem[i]==e) return i+1;	//查找成功,返回序号i+1
    return 0;						//查找失败,返回0
}

5.顺序表的插入

算法思想:

  • 判断插入位置i是否合法。</
1. 本演示程序中,集合元素限定为数字,大小由用户输入。集合中数字顺序不限,且一旦出现重复字符或非法字符,程序能自动滤去。输出的运算结果中将不含重复数字或非法字符,且按照从小到大的顺序输出。<br>2. 演示程序以用户和计算机的对话方式执行,即在计算机上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的数据输入和运算结果显示在其后。<br>3. 程序执行的命令包括:<br>(1)构造集合1;(2)构造集合2;(3)判断某数是否为集合元素;(4)添加元素;(5)删除元素;(6)求并集(存入集合1中);(7)求交集(存入集合3中);(8)输出集合1;(9)输出集合2;(0)退出。<br>“构造集合1”和“构造集合2”时,需以整型数字形式键入集合元素。<br><br>为实现上述程序功能,以线性链表表示集合。为此,需要两个抽象数据类型:线性表和集合。<br>1. 线性表的抽象数据类型定义为:<br> ADT LinkList{<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={< , >| , D, < ,i=2,…,n}<br> 基本操作:<br> InitList(*L)<br> 操作结果:构造一个空的线性链表L。<br> IsElement(*L,e)<br> 初始条件:线性表L已存在。<br> 操作结果:若e是L的数据元素,返回1,否则返回0。<br> Append(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:按照由大到小的顺序往线性表里插入元素e,不允许重复元素。<br> Delete(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:在L中删除元素e。<br> }ADT LinkList<br>2. 集合的抽象数据类型定义为:<br> ADT LinkSet {<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={}<br> 基本操作:<br> CreatSet(*L)<br> 初始条件:s为整型数组。<br> 操作结果:生成一个由s中数字构成的集合。<br> Union(*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的并集构成的集合,返回到S1。<br> Intersection (*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的交集构成的集合,返回到S1。<br> PrintSet (*S)<br> 初始条件:集合S已存在。<br> 操作结果:依次显示集合S中的全部元素。<br> }ADT LinkSet<br><br><br>带菜单<br>Turbo c 3.0编写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值