数据结构-线性表之顺序表

    线性表包括顺序表和链表(单链表、双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现。

    线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从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];
	}
}

以上为线性表-顺序表的简单操作。

猜你喜欢

转载自blog.csdn.net/zwx19921215/article/details/80236024