前言:我是为了考研来学习的数据结构,作为计算机专业基础课,它是当值无愧的一块难啃的硬骨头,对于我这个跨专业的考生学起来非常的难受;前面发的C学习的博客是为了学习这里的铺垫,毕竟不熟悉结构体、指针、还有malloc()等函数简直就不是到那些代码写的啥。下面的总结笔记主要来自于小甲鱼老师的视频教程,我边看边暂停记笔记写代码,在博客里做一个归拢,当作一个回顾和复习(其实和预习差不多)。
一、线性表定义及特点
1、定义
- 一个线性表是由零个或多个元素组成的有限序列;
2、特点
- 是一个非空的有限集
- 若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其余元素有且仅有一个前驱和后继;
3、记法
- Date 记作(a1,a2,a3,…ai,a(i+1),…an);
- n为线性表长度;
- n = 0为空表;
二、线性表作为抽象数据类型所定义的一些操作
1、什么是抽象数据类型
- 抽象数据类型(Abstract Date Type,ADT):是指一个数学模型以及定义在此数学模型上的一组操作;
- 描述方法:可用(D,S,P)三元组表示:
|D| 数据对象 |
|S|D上的关系集|
|P | 对D的基本操作集 |
2、线性表常用的基本操作总览
- InitList(*L):初始化操作,构建一个空的线性表;
- ListEmpty(L):判断线性表是否为空,若为空则返回TRUE,否则返回FALSE;
- ClearList(*L):清空线性表;
- GetElem(L,i,*e):将线性表L中的第i个位置元素返回给e;
- LocateElem(L,e):在线性表中查找与e相等的元素,成功返回i,无返回0;
- ListInsert(*L,i,e):在线性表L中第i个位置插入新元素e;
- ListDelete(*L,i,*e):删除线性表L中第i个元素,并用e返回其值;
- ListLength(L):返回线性表L的元素个数;
三、基本操作的结构代码及其算法思路
1、线性表顺序存储结构(顺序表)的结构代码
#define MAXSIZE 20
typedef int ElemType;
typedef struct{
ELemType date[MAXSIZE];
int length; //线性表当前长度
}SqList;
//实际上是对数组封装,增加了当前长度变量length
顺序存储结构封装需三个属性:
- 存储空间的起始位置,即数组date的存贮位置date[0];
- 最大存储容量,即数组长度MAXSIZE;
- 当前长度:length;
地址计算方法:
第i个元素ai的存储地址:LOC(ai) = LOC(a1) +(i-1)*c; //c = sizeof(SqList);
*2、InitList(L),构建一个新的线性表
Status InitList_Sq(SqList &L){
//构建一个空的线性表L;
L.elem =(ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if( L == NULL)
printf("申请内存失败\n");
L.length = 0; //空表长度为零
L.listsize = MAXSIZE;//初始存储容量
return OK;
}
3、ListEmpty(L),判断线性表是否为空
Status ListEmpty_Sq(SqList L){
//判断线性表是否为空
if(L.length == 0)
return TRUE;
else return FALSE;
}
*4、ClearList(L),清空线性表
Status ClearList_Sq(Sqlist &L){
//清空线性表,需要找到表头位置,用到指针
int i;
for(i=0;i<L.length;i++)
{
L.elem[i]=0;
}
L.Length = 0;
return OK;
}
*5、GetElem(L,i,e),查找线性表L第i个位置的元素并返回给e;
Status GetElem_Sq(SqList L, int i, ElemType *e)
{
if(L.length==0 || i<1 ||i>L.length )
{
return ERROR;
}
*e = L.elem[i-1];
return OK;
}
6、LocateElem(L,e),在线性表中查找与给定e相等的元素
Status LocateELem_Sq(SqList L,ElemType e)
{
int i