赞
踩
目录
顺序表,全名顺序储存结构,是线性表的一种。
顺序表储存数据时,会提前申请一整块足够大小的物理空间,然后将数据依次储存起来,储存时做到数据元素之间不留一丝缝隙。
个人理解:顺序表储存数据的模式同数组十分相近,但是(当然有但是)顺序表每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个字符,也可以是一页书,甚至其他更复杂的信息。
「话不多说」上代码:定义
- #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
本人小白一枚,望指点
本人小白一枚,望指点
本人小白一枚,望指点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。