文章目录
前言
一、概念梳理
1.数据的逻辑结构
2.数据的存储结构
3.数据的运算
二、线性表的链式存储结构
1.结点
2.基本操作
前言
线性表是最基础最常用的一种线性结构,同时也是其它数据结构的基础。因此,为了打好基础,学习本章的时候应明确相关概念,以免混淆。
一、
一、概念梳理
数据结构是由某一数据对象及该对象中所有数据元素之间的关系组成的。数据结构包含数据的逻辑结构、存储结构、数据的运算三方面。
1 数据的逻辑结构:指数据元素之间的内在关系,是面向应用问题的,独立于计算机,分为线性结构、树形结构、图结构、集合结构四类,进一步可分为两类:线性结构与非线性结构(树形、图、集合结构统一归为非线性结构)。
2 数据的存储结构:指数据元素之间的关系在计算机内的表示形式,面向计算机,是数据的逻辑结构在计算机存储中的映像。分为:
顺序存储结构:逻辑上相关的数据元素依次存储在地址连续的存储空间中
链式存储结构:使用指针域存储逻辑上相关的相邻元素地址。为了存储一个元素,需要同时存放数据元素本身与该元素逻辑上相关的的相邻的元素的地址,两部分信息合称为结点。一个结点的存储地址通常指存放该结点的存储块的起始存储单元地址(即首地址)。
3 数据的运算:数据结构常见的运算包括:搜索运算、插入运算、删除运算、更新运算等(即增删改查)。
而此节所说明的线性表为零个或若干个数据元素构成的线性序列,记为(a0,a1,a2…an-1)。其中,ai表示下表为i的元素,ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。线性表除第一个元素a0没有直接前驱元素,最后一个元素an-1没有直接后继元素以外,任何其他元素都有唯一的直接前驱元素和直接后继元素。线性表中数据元素之间存在着一一对应的关系,因此,线性表的逻辑结构为线性结构。
二、 线性表的存储结构
1.线性表的定义
<1>.定义:由 n(n>=0)个数据特性相同的元素构成的有限序列被称为线性表。
2.特点:
<1>.集合中必存在唯一的一个"第一元素"。
<2>.集合中必存在唯一的一个 “最后元素” 。
<3>.除最后一个元素之外,均有 唯一的后继(后件)。
<4>.除第一个元素之外,均有 唯一的前驱(前件)。
总结:除了线性表所拥有的唯一的第一元素及最后元素,剩下元素均拥有唯一的前驱及后继。
2、 线性表的顺序存储
线性表的顺序存储指使用连续的存储空间,按照数据元素在线性表中的序号依次存储数据元素。采用顺序存储结构的线性表称为顺序表。顺序表中,逻辑上相邻的元素,物理存储地址也相邻。
若顺序表首个元素a0在内存中的存储地址为loc(a0),每个元素占用k个存储单元,则线性表中任意元素ai在内存中的存储地址为:
loc(ai)=loc(a0)+i*k
由此可知,顺序表中只要给定loc(a0)和k的值,即可计算出该表中其他任何元素的存储地址,从而对其执行相关操作。因此线性表的顺序存储结构是一种随机存取结构(即可以直接通过特定元素下标直接访问,而无需按存储顺序存取)。
二、线性表的链式存储结构
1.结点
节点由两部分组成:1.数据域 2.指针域
数据域用来存储数据,指针域用来存储下一个结点的地址。
2.基本操作
1.创建链表
typedef struct
{
ElemType data[10]; /* 数组,存储数据元素 */
int length; /* 线性表当前长度 */
}SqList;
2.初始化链表
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
3.创建结点
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if (L->length==10) /* 顺序线性表已经满 */
return ERROR;
if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
return ERROR;
if (i<=L->length) /* 若插入数据位置不在表尾 */
{
for(k=L->length-1;k>=i-1;k--) /* 将要插入位置之后的数据元素向后移动一位 */
L->data[k+1]=L->data[k];
}
L->data[i-1]=e; /* 将新元素插入 */
L->length++;
return OK;
}
4.删除结点
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if (L->length==MAXSIZE) /* 顺序线性表已经满 */
return ERROR;
if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
return ERROR;
if (i<=L->length) /* 若插入数据位置不在表尾 */
{
for(k=L->length-1;k>=i-1;k--) /* 将要插入位置之后的数据元素向后移动一位 */
L->data[k+1]=L->data[k];
}
L->data[i-1]=e; /* 将新元素插入 */
L->length++;
return OK;
}
5.查找
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.length==0)
return 0;
for(i=0;i<L.length;i++)
{
if (L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}