在进行今天的讲解之前 我们先来了解一下线性表的基本概念
知识框架
线性表的定义和基本操作
定义:
线性表是具有相同数据类型的n个数据元素的有限序列。
除了第一个元素以外,每个元素有且仅有一个直接前驱。
除了最后一个外, 每个元素有且仅有一个直接后续。
特点:
好滴,那我们接下来讲解线性表的顺序表示啦~
线性表的顺序表示
定义
线性表的顺序存储又称顺序表
其特点是:其中逻辑结构与其物理结构相同。
ps:线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
假定 线性表元素类型为ElemType ,则线性表的顺序存储类型描述为:
#define Maxsize 50
typedef struct
{
ElemType data[Maxsize];
int length;
}SqList;
可以是静态分配,也可以是动态分配。
#define Initsize 50
typedef struct
{
ElemType data*; //指针
int Maxsize,length; //最大容量和当前个数
}SeqList;
它的初始化:ps:注意要带头文件<stdlib.h>哦~
L.data = (ElemType *)malloc(sizeof(ElemTye)*Initsize);
基本操作的实现
说到线性表,我们肯定会觉得 它的插入和删除绝对是麻烦的(
1) 插入操作
bool ListInsert(SqList &L,int i,ElemType e)
{
if(i < 1 || i > L.length +1)//有效
return false;
if(L.length >= Maxsize)//空间已满
return false;
for(int j = L.length; j >= i)//后移操作
L.data[j] = L.data[j - 1];
L.data[i - 1] = e;
L.length++;
return true;
}
草草画个图哈哈
2)删除操作
bool ListDelete(SqList &L,int i,ElemType &e) // e返回被删元素的值
{
if(i < 1 || i > L.length )//有效
return false;
e = L.data[i - 1];
for(int j = i; j < L.length; j++)
L.data[j - 1] = L.data[j];
L.length --;
return true;
}
我们可以发现,顺序表中插入和删除操作的时间主要花费在 移动元素 上
3)按值查找
int LocateElem(SqList L,ElemType e)
{
int i;
for(i = 0;i < L.length; i++)
{
if(L.data[i] == e)
return i+1;
}
return 0;
}
错题总结
线性表的顺序存储结构是一种 随机存取的存储结构。
合并仍有序:
bool Merge(SqList A,SqList B,SqList &C)
{
if(A.length + B.length > Maxszie)
return false;
int i = 0,j = 0,k = 0;
while(i < A.length && j < B.length)
{
if(A.data[i] <= B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
}
while(i < A.length)
C.data[k++] = A.data[i++];
while(j < B.length)
C.data[k++] = B.data[j++];
C.length = k;
return true;
}
转置:
void reverse(int R[],int from, int to)
{
int i, temp;
for(i = 0; i < (to + from)/2; i++)
{
temp = R[from + i];
R[from + i] = R[to - i];
R[to - i] =temp;
}
}
好了结束咯