目录
什么是线性表
静态分配
动态分配
插入操作
删除操作
查找
算法实践
线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
注意:线性表中元素的位序是从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
随着专业的深入会越来越广哦…一起期待。
❤️人生的每一次成长,都是从“觉得自己是个傻逼”开始的,人生每一次的陷入困境,都是从“觉得别人是个傻逼”开始的。
很高兴与你相遇,一起加油!