线性表包括顺序表和链表(单链表、双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现。
线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表的下标是从1开始的)。
首先声明一个顺序类型的线性表:
//定义一个结构体类型
#define InitSize 100 //初始大小
typedef struct {
int data[InitSize]; //定义一个int型数组,理论上在伪代码中该类型应该为泛型即任意类型(ElementType),在此我用int代替方便代码的编写
int length, maxSize; //长度、最大容量
}SeqList; //别名
然后依次实现线性表的相关操作;
向线性表中插入一个元素:
/*
function:线性表的插入
1.插入的位置不能大于线性表的长度+1(可以等于:即插在末尾)
2.在某个指定位置插入时,需要依次将需要插入元素位置的元素向后移动,且从最后一个开始移动
3.长度加一
*/
/*
L: 线性表
i:需要插入的元素下标索引
e:需要插入的元素(int e:这里假设为int类型,实际上用伪代码表示为不局限任何类型ElementType)
*/
bool ListInsert(SeqList L, int i, int e) {
//不能大于长度+1 且不能小于1
if (i<1 || i > L.length+1) {
return false;
}
for (int j = L.length - 1;j >= i - 1;j--) {
L.data[j + 1] = L.data[j];
}
L.data[i - 1] = e;
L.length++;
return true;
}
从线性表中删除一个元素:
/*
function:删除指定下标的元素
1.将需要删除元素下标后的元素位置全部向前移动一位即可
2.长度减一
*/
/*
L: 线性表
i:需要删除的元素下标索引
*/
bool ListDelete(SeqList L,int i) {
if (i<1 || i > L.length) {
return false;
}
for (int j = i;j < L.length; j++) {
L.data[j-1] = L.data[j];
}
L.length--;
return true;
}
从线性表中查找指定的元素:
/*
function:查找指定元素
1.依次遍历线性表进行判断,存在即返回下标
*/
/*
L: 线性表
e:需要查找的元素的
*/
int ListFind(SeqList L, int e) {
for (int j = 0;j < L.length;j++) {
if (L.data[j] == e) {
return j+1;
}
}
return 0;
}
删除线性表中的最小值:
/*
function:删除线性表中最小的值,并将最后一个元素填充
1.遍历线性表取出最小值
2.将最后一个元素赋值给当前位置
3.返回最小值
*/
int ListDeleteMin(SeqList L) {
if (L.length == 0) {
return 0;
}
int min = 0;
for (int i = 0;i < L.length;i++) {
if (L.data[i] < min) {
min = L.data[i];
L.data[i] = L.data[L.length - 1];
}
}
return min;
}
将线性表反转:
/*
function:将线性表反转
*/
void ListReverse(SeqList L) {
if (L.length == 0) {
return;
}
int length = L.length / 2;
for (int i = 0;i <= length;i++) {
int startIndex = i;
int endIndex = L.length - i - 1;
int temp;
temp = L.data[endIndex];
L.data[i] = temp;
L.data[endIndex] = L.data[i];
}
}
以上为线性表-顺序表的简单操作。