(总结源自《大话数据结构》,初学数据结构推荐此书)
目录
线性表(List)
线性表是数据结构中最常用和最简单的一种结构,定义如下
线性表:零个或多个数据元素的有限序列
线性结构:一对一
在较复杂的线性表中,一个数据元素可以由若干个数据项组成
线性表的顺序存储结构
线性表顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素,可以用一维数组来实现。
在农场(也就是内存空间)中找了一块连续的空地(存储单元),把一个个萝卜(元素)按顺序种了下去)
描述顺序存储结构需要三个属性:
1.存储空间的起始位置:数组的存储位置就是存储空间的存储位置
2.线性表的最大存储容量:数组长度MaxSize
3.线性表的当前长度:length
(数组长度与线性表长度的区别:数组长度指的是存放线性表的存储空间的长度,分配后一般是不变的。线性表长度是线性表中数据元素的个数,是变化的。 在任意时刻,线性表的长度应该是小于等于数组的长度,数组就像一字排开的椅子,线性表就像人,位置只能空着或坐满,不能超过。)
线性表的存储地址
(线性表从1开始,而数组从0开始,也就是说:线性表的第i个元素存储在数组的第i-1个位置上)
地址计算方法可算出线性表中任意位置的地址(c是单个元素所占的空间的大小)
线性表的基本操作
InitList(*L):初始化操作,建立一个空的线性表L
ListEmpty(L):若线性表为空,返回true,否则返回false
ClearList(*L):将线性表清空
ListLength(L):返回线性表L的元素个数
GetElem(L,i,*e):将线性表L中的第i个位置元素返回给e
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功,否则返回0表示失败
ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e
ListDelete(*L,i,*e):删除线性表L中的第i个位置元素,并用e返回其值
这些最基本的操作,更加复杂的操作可以使用这些操作的组合来实现。
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
//Status 是函数的类型,其值是函数结果状态代码,如OK等
typedef struct
{
ElemType data[MAXSIZE];//存放线性表的数组
int length; //length是线性表的长度
} SqList;
GetElem(L,i,*e)
功能:将线性表L中的第i个位置元素返回给e
主要考虑以下几点:1,表是否存在(L.length == 0) 2,这个位置是否合理(在不在表中)(1<i<L.length)
Status GetElem(SqList L, int i, ElemType *e) //结果:用e返回L中第i个数据元素的值
{
if (L.length == 0 || i < 1 || i > L.length)
return ERROR;
*e = L.data[i - 1];
return OK;
}
ListInsert(*L,i,e)
功能:在线性表L中的第i个位置插入新元素e
主要考虑以下几点:1,表是否还能继续插入(满了没有) 2,插入位置是否合理(在不在表中)
Status ListInsert(SqList *L, int i, ElemType e)
{
int k;
if (L->length == MAXSIZE||i < 1 || L->length + 1) //表已满||插入的位置不在表中
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;//i是插进i-1的地方
L->length++;
return OK;
}
ListDelete(*L,i,*e)
功能:删除线性表L中的第i个位置元素,并用e返回其值
主要考虑以下几点:1,表是否存在(L.length == 0) 2,插入位置是否合理(在不在表中)
Status ListDelete(Sqlist *L, int i, ElemType *e)
{
int k;
if (L->length == 0) //没有表
return ERROR;
if(i<1 || i>l->length) //删除的位置不在表内
return ERROR;
*e = L->data[i - 1];
if (i < L->length) //若删除位置在表中,则让其后一个元素放入其中,循环
{
for (k = i; < L->length; k++)
L->data[k - 1] = L->data[k];
}
L->length--; //表长减一
return OK;
}