打卡第一天——线性表基本运算
顺序表基本运算编程实现
(ps:此次练习主要是C语言练习,代码在文章末尾)
数据结构的形式定义:
数据结构名称=(D,S)
其中D为数据元素的有限集,S是D上关系的有限集
线性结构的特点:
在数据元素的非空有限集中,
(1)存在唯一的一个被称做“第一个”的数据元素;
(2)存在唯一的一个被称做“最后一个”的数据元素;
(3)除第一个之外,集合中的每个数据元素均只有一个前驱
(4)除最后一个之外,集合中每个数据元素均只有一个后继。
一、线性表的定义
线性表是最常用且最简单的一种数据结构。
一个线性表是n个数据元素的有限序列。
数据元素可以是一个数、一个符号、也可以是一幅图、一页书或更复杂的信息。
二、线性表的类型定义
1、抽象数据类型线性表的定义如下:
ADT List{
数据对象: D={ai| ai∈ElemSet,i=1,2,…,n,n>=0}
数据关系: R1={<ai-1,ai>| ai-1,ai∈D,i=2,…,n}
基本操作:
InitList(L); //初始化线性表
DestroyList(L); //销毁线性表
ListEmpty(L); //判断线性表是否为空
ListFull(L); //判断线性表是否已满
ListLength(L); //求线性表的长度
GetElem(L,i); //获取线性表L第i个位置的元素
LocateElem(L,e); //获取元素e在线性表L中所在的位置
PriorElem(L,cur_e); //求元素cur_e的直接前驱
NextElem(L,cur_e); //求元素cur_e的直接后继
ListInsert(L,i,e); //在线性表L的第i个位置插入元素e
ListDelete(L,i); //删除线性表L第i个位置的元素
}ADT List
三、线性表的顺序表示
用一组地址连续的存储单元依次存储线性表的数据元素。C语言中的数组即采用顺序存储方式。
假设线性表的每个元素需占用n个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则存在如下关系:
LOC(ai+1)=LOC(ai)+n
LOC(ai)=LOC(a1)+(i-1)*n
式中LOC(a1)是线性表的第一个数据元素的存储位置,通常称做线性表的起始位置或基地址。常用b表示。
线性表的这种机内表示称做线性表的顺序存储结构或顺序映象。
称顺序存储结构的线性表为顺序表。顺序表的特点是以元素在计算机内物理位置相邻来表示线性表中数据元素之间的逻辑关系。
四、顺序存储结构的线性表类C语言表示:
线性表的静态分配顺序存储结构
#define maxlen 100
typedef int ElemType;
typedef struct list{
ElemType elem[maxlen+1]; //这里规定从1号元素放起
int realen; //实际存放的数目
}List;
顺序表的插入算法
bool ListInsert(List &L,int i, ElemType e){
//此函数将元素e插入指定位置i
if ((i<=0) || (i>L.realen+1) || (L.realen>=maxlen))
return ERROR;
for (k=L.realen+1;k>=i+1;k–)
L.elem[k]=L.elem[k-1];
L.elem[i]=e; L.realen++;
return OK;
}
顺序表的删除算法
bool ListDelete(List &L ,int i){
//此函数将插入指定位置i处的元素删除
if ((i<=0) || (i>L.realen))
return ERROR;
for (k=i;k<L.realen;k++)
L.elem[k]=L.elem[k+1];
L.realen–;
return OK;
}
五、删除算法的时间复杂度
1、基本操作为:移动元素
2、一个基本假设:每个位置元素被删除的概率相等,均为1/n
3、结论:平均移动次数为(n-1)/2,故时间复杂度为O(n)。
六、代码实现
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1024
typedef struct
{
int data[MAXSIZE];//存储顺序表中的元素
int len;//顺序表类型
}SeqList;//顺序表类型
SeqList *Init_SeqList()