线性表顺序存储
线性表顺序存储的C/C++实现
线性表可以按顺序以及链式两种方式存储,顺序存储主要靠C语言数组实现,而链式存储主要用到链表。下面是线性表顺序结构的基本操作及代码实现。
表的输入及输出
表的输入比较简单,数组遍历输入输出即可,不多解释。
void Input(SqList *a) //输入表
{
int l;
printf("输入表长: "); scanf("%d", &l);
printf("输入表: ");
for(int i = 0;i < l;++i) //遍历输入
scanf("%d", &(a->data[i]));
a->len = l;
}
void Print(SqList *a) //输出表
{
for(int i = 0;i < a->len - 1;++i) //遍历输出
printf("%d ",a->data[i]);
printf("%d\n", a->data[a->len - 1]);
}
访问值
直接访问指定位置即可
ElemType GetElm(SqList *a,int loc) //访问表中的值
{
if(loc < 1 || loc > a->len) //给出坐标合法性检查
printf("Error!\n");
return a->data[loc-1]; //返回查到的值
}
插入及删除值
插入值时,先将指定位置的后继全部后移一位,注意这里我用了倒序遍历,可以防止覆盖
void Insert(SqList *a,int loc,ElemType n) //插入
{
if(loc < 1 || loc > a->len + 1) //给出坐标合法性检查
{
printf("Error!\n");
return;
}
for(int i = a->len;i >= loc;i--) //后继后移
a->data[i] = a->data[i - 1];
a->data[loc - 1] = n; //插入到指定位置
(a->len)++; //长度加一
}
删除值时,只用将指定位置的后继向前移动一位即可,后继会自动覆盖指定位置的值
void Delete(SqList *a,int loc) //删除
{
if(loc < 1 || loc > a->len) //给出坐标合法性检查
{
printf("Error!\n");
return;
}
for(int i = loc - 1;i < a->len - 1;++i) //后继前移,自动覆盖loc上的值
a->data[i] = a->data[i + 1];
(a->len)--; //长度减一
}
合并表
合并表只用将需合并的表中的值一一连接在被合并表后面即可
void Combine(SqList *a,SqList *b) //合并
{
for(int i = a->len;i < a->len + b->len;++i) //b所存值一一接到a尾部
a->data[i] = b->data[i - a->len];
a->len = a->len + b->len; //新表长度为两表原长相加
free(b); //释放旧表占用的内存
}
完整代码
/*线性表顺序结构
*van_fantasy
*/
//头文件以及常量定义
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define M 1000000007
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 6;
typedef int ElemType; //本程序以存储整形变量的线性表为例进行讨论
typedef struct{ElemType data[maxn]; int len;} SqList; //定义一个线性表,data中存值,len为表长
ElemType GetElm(SqList *a,int loc) //访问表中的值
{
if(loc < 1 || loc > a->len) //给出坐标合法性检查
printf("Error!\n");
return a->data[loc-1]; //返回查到的值
}
void Input(SqList *a) //输入表
{
int l;
printf("输入表长: "); scanf("%d", &l);
printf("输入表: ");
for(int i = 0;i < l;++i) //遍历输入
scanf("%d", &(a->data[i]));
a->len = l;
}
void Insert(SqList *a,int loc,ElemType n) //插入
{
if(loc < 1 || loc > a->len + 1) //给出坐标合法性检查
{
printf("Error!\n");
return;
}
for(int i = a->len;i >= loc;i--) //后继后移
a->data[i] = a->data[i - 1];
a->data[loc - 1] = n; //插入到指定位置
(a->len)++; //长度加一
}
void Delete(SqList *a,int loc) //删除
{
if(loc < 1 || loc > a->len) //给出坐标合法性检查
{
printf("Error!\n");
return;
}
for(int i = loc - 1;i < a->len - 1;++i) //后继前移,自动覆盖loc上的值
a->data[i] = a->data[i + 1];
(a->len)--; //长度减一
}
void Combine(SqList *a,SqList *b) //合并
{
for(int i = a->len;i < a->len + b->len;++i) //b所存值一一接到a尾部
a->data[i] = b->data[i - a->len];
a->len = a->len + b->len; //新表长度为两表原长相加
free(b); //释放旧表占用的内存
}
bool cmp(ElemType x,ElemType y) //排序算法以升序为例
{
return x < y;
}
void Sort(SqList *a) //排序
{
sort(a->data,a->data + a->len,cmp); //采用C++STL库中的排序函数
}
void Print(SqList *a) //输出表
{
for(int i = 0;i < a->len - 1;++i) //遍历输出
printf("%d ",a->data[i]);
printf("%d\n", a->data[a->len - 1]);
}
int main() //主函数
{
SqList a,b;
int sw;
printf("线性表顺序结构基操:\n1.输入表\n2.查值\n3.插入值\n4.删除值\n5.合并表\n6.排序\n7.输出表\n8.退出\n请输入操作选项: ");
while(~scanf("%d", &sw))
{
if(sw < 1 || sw > 8)
{
printf("Error!\n");
continue;
}
else if(sw == 1) Input(&a);
else if(sw == 2)
{
int loc;
printf("输入位置: "); scanf("%d", &loc);
printf("所查值为%d\n", GetElm(&a,loc));
}
else if(sw == 3)
{
int loc,n;
printf("输入位置及值: "); scanf("%d%d", &loc, &n);
Insert(&a,loc,n);
}
else if(sw == 4)
{
int loc;
printf("输入位置: "); scanf("%d", &loc);
Delete(&a,loc);
}
else if(sw == 5)
{
printf("输入新表:\n");
Input(&b);
Combine(&a,&b);
}
else if(sw == 6) Sort(&a);
else if(sw == 7) Print(&a);
else break;
printf("\n线性表顺序结构基操:\n1.输入表\n2.查值\n3.插入值\n4.删除值\n5.合并表\n6.排序\n7.输出表\n8.退出\n请输入操作选项: ");
}
return 0;
}
简析
顺序结构存储相对于链式结构,优点是理解起来比较容易,因为它是基于数组的。缺点是操作时时间复杂度较高。
本文介绍了线性表顺序存储的概念,并提供了C/C++实现线性表的代码,包括表的输入输出、访问值、插入及删除值、合并表等基本操作。顺序存储利用数组实现,操作直观但时间复杂度较高。
1993

被折叠的 条评论
为什么被折叠?



