目录
顺序表,全名顺序储存结构,是线性表的一种。
顺序表储存数据时,会提前申请一整块足够大小的物理空间,然后将数据依次储存起来,储存时做到数据元素之间不留一丝缝隙。
个人理解:顺序表储存数据的模式同数组十分相近,但是(当然有但是)顺序表每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个字符,也可以是一页书,甚至其他更复杂的信息。
「话不多说」上代码:定义
#pragma once
#include<iostream>
using namespace std;
typedef int Sbt;
#define Size 1 //线性表储存空间的增量
typedef struct Sqlist
{
Sbt* date = nullptr; //储存空间的基址
int legth = 0; //当前长度
int size = 0; //当前分配的储存容量(以sizeof(Sbt)为单位)
}Sqlist;
初始化时将date置空,将线性表当前长度设为“0”。
顺序表的「输入」
//输入
void Sq_push(Sqlist& s, int x)
{
if (s.legth <= s.size)
{
Sbt* temp;
temp = (int *)realloc(s.date, (s.legth + Size) * sizeof(int));
if (temp == nullptr)
{
cout << "内存分配失败" << endl;
exit(0);
}
s.date = temp;
s.size += Size;
}
s.date[s.legth] = x;
++s.legth;
}
温馨提示:建议不要直接分配内存给s.date,在Microsoft Visual Studio Community 2019(我用的是这个)中,它会有以下警告:
官方给出的错误提示链接在此 ---> C6308 | Microsoft Docs
顺序表的「输出」
这个还是比较简单的,就不废话了,上代码。
void Sq_outall(Sqlist& s)
{
for (int i = 0; i < s.legth; i++)
{
cout << s.date[i] << " ";
}
}
顺序表的「查找」
上代码
//查找
int Sq_found(Sqlist& s, int x)
{
for (int i = 0; i < s.legth; i++)
{
if (s.date[i] == x)
{
cout << "位于第" << i << "号节点 (下标)" << endl;
return i;
}
}
cout << "ERROR:" << x << "不在指定范围内" << endl;
return -1;
}
顺序表的「删除」
删除有三种情况有:前端删除,中端删除,后端删除。这三种都可以一次性解决。
从主函数内获得某数的下标,将其后方的数替换掉它,那它后方的数由它后方的后方替换掉,以此类推。
//删除
void Sq_dele(Sqlist& s, int x)
{
for (int i = 0; i < s.legth; i++)
{
if (s.date[i] == x)
{
for (; i < s.legth; i++)
{
s.date[i] = s.date[i + 1];//将后方的数值替换掉前方的
}
s.legth--;
break;
}
}
cout<<"ERROR: " << x << " 不在指定范围内" << endl;
}
「别怪我没提醒你」 每删除一个数,s.legth都要减一;s.size不用管,因为你已经分配了内存空间,以便下次使用。
顺序表的「销毁」
//销毁
void Sq_destroy(Sqlist& s)
{
s.legth = 0;
s.size = 0;
free(s.date);
s.date = nullptr;
}
顺序表的「快速排序」
//快速排序
int Sq_quickcollate(Sqlist& s, int a, int b)
{
int l = a, r = b,center;
if (l < r)
{
while (l < r)
{
while (l < r && s.date[l] >= s.date[r])
r--;
if (l < r)
{
center = s.date[l];// ------ center <--
s.date[l] = s.date[r];// / \
s.date[r] = center;// -> s.date[r]------>s.date[l]
l++;
center = NULL;
}
while (l < r && s.date[r] <= s.date[r])
l++;
if (l < r)
{
center = s.date[l];
s.date[l] = s.date[r];
s.date[r] = center;
r--;
center = NULL;
}
}
Sq_quickcollate(s, a, l);
l++;
Sq_quickcollate(s, l, b);
}
return 0;
}
参考文献:数据结构; C 语言版/严蔚敏,昊伟民编著。一北京:清华大学出版社,2007(2019.1重印(清华大学计算机系列教材)
iSBN 978-7-302-14751-0
本人小白一枚,望指点
本人小白一枚,望指点
本人小白一枚,望指点