什么你还不知道什么是顺序表

目录

什么是线性表

静态分配

动态分配

插入操作

删除操作

查找

算法实践

什么是线性表

线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻

注意:线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。

静态分配

一维数组可以是静态分配的,也可以是动态分配的。在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将会产生溢出,进而导致程序崩溃。
 

typedef struct {
	int data[MaxSize]; //用静态数组存放数据
	int length;
}SqList;

初始化 

//初始化
void InitList(SqList& L) {
	for (int i = 0; i < MaxSize; i++)
	{
		L.data[i] = 0; //全部设置为0
		L.length = 0; //顺序表初始长度为0
	}
}

动态分配

在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的

#include  
using namespace std;
#define InitSize 10 //不要带分号

typedef struct {
	int* data;
	int MaxSize;
	int length;
}SeqList;

初始化

//初始化
void InitList(SeqList& L) {
	L.data = (int*)malloc(InitSize * sizeof(int));
	L.length = 0;
	L.MaxSize = InitSize;
}

增加数组长度

//增加动态数组的长度
void IncreaseSize(SeqList& L, int len) {
	int* p = L.data; //把原来的赋值给p
	L.data = (int*)malloc((L.MaxSize + len) * sizeof(int));
	for (int i = 0; i < L.length; i++)
	{
		L.data[i] = p[i];
	}
	L.MaxSize = L.MaxSize + len;
	free(p);
}

插入操作

bool ListInsert(SqList& L, int i, int e) {
	if (i<1 || i>L.length + 1) //确保插入的数据有效且连续
		return false; //没有大括号的时候 只有下面的一句归if管
	if (L.length >= MaxSize)  //存储空间已满
		return false;

	for (int j = L.length; j >= i; j--)
	{
		L.data[j] = L.data[j - 1]; //数据后移
	}
	L.data[i - 1] = e; //赋值
	L.length++;
	return true;
}

最好情况:在表尾插入,元素后移语句将不执行,时间复杂度为O(1)

最坏情况:在表头插入,元素后移语句将执行n次,时间复杂度为O(n)

删除操作


//删除元素
void ListDelete(SqList& L, int i, int e = 0) {
	if (i<1 || i>L.length + 1) //确保插入的数据有效且连续
		cout << "数据不合法,删除失败" << endl;
	e = L.data[i - 1];
	for (int j = i; j < L.length; j++)
	{
		L.data[j - i] = L.data[j];
	}
	L.length--;
	cout << "被删除的元素" << e << endl;
}

查找

按位查找

int GetElem(SeqList L, int i) {
	return L.data[i - 1];
}

按值查找

//按值查找
int LocateElem(SeqList L, int e) {
	for (int i = 0; i < L.length; i++)
	{
		if (L.data[i] == e)
		{
			return i + 1; 
		}
	}
	return 0;
}

算法实践

1.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)
 

//逆置
void reverse(SqList& L) {
	int temp;
	for (int i = 0; i < L.length / 2; i++)
	{
		temp = L.data[i];
		L.data[i] = L.data[L.length - i - 1];
		L.data[L.length - i - 1] = temp;
	}
}

2.从有序顺序表删除所有其值重复的元素,使表中所有元素的值均不同

bool DeleteSame(SeqList& L) {
	if (L.length == 0)
		return false;
	int i, j;
	for (i = 0, j = 1; j < L.length; j++)	
		if (L.data[i] != L.data[j]) 
			L.data[++i] = L.data[j];
	L.length = i + 1;
	return true;
}

3.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表

bool Merge(SeqList A, SeqList B, SeqList& C) {
	if (A.length + B.length > C.MaxSize)
		return false;
	int i = 0, j = 0, k = 0;
	while (i < A.length && j < B.length)
	{
		if (i < 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[j++];
	while (i < B.length)
		C.data[k++] = B.data[j++];
	C.length = k;
	return true;
}

点个关注再走吧

此博文的分享就到此啦

✨你好啊,我是“ 满级小白”,是一名在校大学生。

主页链接:满级小白的博客

☀️博文主更方向为:计算机408数据库javaEE 随着专业的深入会越来越广哦…一起期待。

❤️人生的每一次成长,都是从“觉得自己是个傻逼”开始的,人生每一次的陷入困境,都是从“觉得别人是个傻逼”开始的。

很高兴与你相遇,一起加油!

你可能感兴趣的:(数据结构,算法,c++)