线性表顺序存储的C/C++实现

本文介绍了线性表顺序存储的概念,并提供了C/C++实现线性表的代码,包括表的输入输出、访问值、插入及删除值、合并表等基本操作。顺序存储利用数组实现,操作直观但时间复杂度较高。

线性表顺序存储

线性表顺序存储的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;
}

简析

顺序结构存储相对于链式结构,优点是理解起来比较容易,因为它是基于数组的。缺点是操作时时间复杂度较高。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值