顺序表的实现与基本操作

本文介绍了C和C++两种语言实现顺序表的操作,包括静态分配和动态分配方式的初始化,以及顺序表的插入、删除和查找功能。动态分配方式中,通过`malloc`函数申请内存,并提供了动态增加顺序表长度的函数。示例代码详细展示了如何在顺序表中进行元素操作,并给出了相应的运行结果。
摘要由CSDN通过智能技术生成

1 顺序表定义

1.1 顺序表定义(静态分配)

    1. c语言实现
#include <stdio.h>
#define MaxSize 10 //定义最大长度
// #define ElemType int
typedef int ElemType;
typedef struct 
{
    ElemType data[MaxSize]; //用静态数组存放元素
    int length; //顺序表当前长度
}Sqlist;    //顺序表类型定义

//初始化顺序表
void InitList(Sqlist *L){
    for (int i = 0; i < MaxSize; i++)
    //使用 -> 运算符,访问指向该结构的指针结构的成员
        L->data[i]=0;   //将所有数据元素设置为默认初始值
    L->length = 0;    //顺序表初始长度为0
}
// Sqlist InitList(Sqlist *L){
//     for (int i = 0; i < MaxSize; i++)
//         L->data[i]=0;   //将所有数据元素设置为默认初始值
//     L->length = 0;    //顺序表初始长度为0
//     return *L;
// }

int main(){
    Sqlist L;   //声明一个顺序表
    InitList(&L);    //初始化顺序表,通过传顺序表的地址初始化顺序表
    //打印顺序表
    for(int i = 0; i < MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    return 0;
}
    1. c++实现
#include <stdio.h>
#define ElemType int
#define MaxSize 10 //定义最大长度
typedef struct 
{
    ElemType data[MaxSize]; //用静态数组存放元素
    int length; //顺序表当前长度
}Sqlist;    //顺序表类型定义

//初始化顺序表
void InitList(Sqlist &L){
    for (int i = 0; i < MaxSize; i++)
        L.data[i]=0;   //将所有数据元素设置为默认初始值
    L.length = 0;    //顺序表初始长度为0
}
// Sqlist InitList(Sqlist &L){
//     for (int i = 0; i < MaxSize; i++)
//         L.data[i]=0;   //将所有数据元素设置为默认初始值
//     L.length = 0;    //顺序表初始长度为0
//     return L;
// }
int main(){
    Sqlist L;   //声明一个顺序表
    InitList(L);    //初始化顺序表
    //打印顺序表
    for(int i = 0; i < MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    return 0;
}

注意:C语言无&引用类型,所以采用结构体指针。
运行结果如下:
顺序表初始化

1.2 顺序表定义(动态分配)

  • c++实现
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define InitSize 10 //默认最大长度
typedef struct 
{
    ElemType *data; //指示动态分配数组的指针
    int MaxSize;    //顺序表的最大容量
    int length; //顺序表当前长度
}Sqlist;    //顺序表类型定义

//初始化顺序表
void InitList(Sqlist &L){
    //用malloc函数申请一片连续的存储空间
    L.data = (int *)malloc(InitSize*sizeof(int));
    for (int i = 0; i < InitSize; i++)
        L.data[i]=0;   //将所有数据元素设置为默认初始值0
    L.length = 0;    //顺序表初始长度为0
    L.MaxSize = InitSize;
}
//增加动态数组的长度
void IncreaseSize(Sqlist &L, int len){
    int *p = L.data;
    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);
}

int main(){
    Sqlist L;   //声明一个顺序表
    InitList(L);    //初始化顺序表
    //打印顺序表
    for(int i = 0; i < InitSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    IncreaseSize(L,5);
    printf("++++++++++\n");
    for(int i = 0; i < L.MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    return 0;
}

运行效果图如下:

  • 初始化
    在这里插入图片描述
  • 动态增加5的长度
    在这里插入图片描述

2 顺序表插入

  • C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10

typedef struct{
    int data[MaxSize];
    int length;
}SqList;

//初始化顺序表
void InitList(SqList &L){
    for (int i = 0; i < MaxSize; i++)
        L.data[i]=0;   //将所有数据元素设置为默认初始值
    L.length = 0;    //顺序表初始长度为0
}

bool ListInsert(SqList &L,int i,int e){
    if (i<1||i>L.length+1)//判断i范围是否有效,末尾可以插入
        return false;
    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;    
}

int main(){
    SqList L;
    InitList(L);
    //打印初始化顺序表
    for(int i = 0; i < MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    printf("执行插入操作后\n");
    ListInsert(L,1,1);//初始化将表长度置为0;只能从第一个位置插入
    ListInsert(L,2,2);
    ListInsert(L,3,3);
    ListInsert(L,4,4);
    ListInsert(L,5,3);

    //打印插入操作后的顺序表
    for(int i = 0; i < MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    return 0;
}
  • 运行效果图如下:
    在这里插入图片描述

3 顺序表删除

  • C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10

typedef struct{
    int data[MaxSize];
    int length;
}SqList;

//初始化顺序表
void InitList(SqList &L){
    for (int i = 0; i < MaxSize; i++)
        L.data[i]=0;   //将所有数据元素设置为默认初始值
    L.length = 0;    //顺序表初始长度为0
}

bool ListInsert(SqList &L,int i,int e){
    if (i<1||i>L.length+1)//判断i范围是否有效,末尾可以插入
        return false;
    if(L.length >= MaxSize)//当前存储空间已满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)//末尾插入不移动元素
        L.data[j]=L.data[j-1];//将第i个元素及之后的元素后移
    L.data[i-1]=e;//在位置i处存放e
    L.length++;//长度加一
    return true;    
}

bool ListDelete(SqList &L,int i, int &e){
    if(i<1||i>L.length)//判断i范围是否有效
        return false;
    e = L.data[i-1]; //将被删除的元素赋给e
    for(int j=i;j<L.length;j++)
        L.data[j-1] = L.data[j];//将第i个位置后的元素前移
    L.length--;//线性表长度减一
    return true;
}
int main(){
    SqList L;
    InitList(L);
    //打印初始化顺序表
    for(int i = 0; i < MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    printf("执行插入操作后\n");
    ListInsert(L,1,1);//初始化将表长度置为0;只能从第一个位置插入
    ListInsert(L,2,2);
    ListInsert(L,3,3);
    ListInsert(L,4,4);
    ListInsert(L,5,5);
    //打印插入操作后的顺序表
    for(int i = 0; i < L.length; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    printf("执行删除操作后\n");
        int e = -1;
    if(ListDelete(L,3,e))
        printf("已删除第3个元素,删除元素的值为%d\n",e);
    else
        printf("位序i不合法,删除失败!\n");
    //打印插入操作后的顺序表
    for(int i = 0; i < L.length; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    return 0;
}
  • 运行效果图如下:
    在这里插入图片描述

4 顺序表查找

  • C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10

typedef struct{
    int data[MaxSize];
    int length;
}SqList;

//初始化顺序表
void InitList(SqList &L){
    for (int i = 0; i < MaxSize; i++)
        L.data[i]=0;   //将所有数据元素设置为默认初始值
    L.length = 0;    //顺序表初始长度为0
}
//插入元素
bool ListInsert(SqList &L,int i,int e){
    if (i<1||i>L.length+1)//判断i范围是否有效,末尾可以插入
        return false;
    if(L.length >= MaxSize)//当前存储空间已满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)//末尾插入不移动元素
        L.data[j]=L.data[j-1];//将第i个元素及之后的元素后移
    L.data[i-1]=e;//在位置i处存放e
    L.length++;//长度加一
    return true;    
}
//删除元素
bool ListDelete(SqList &L,int i, int &e){
    if(i<1||i>L.length)//判断i范围是否有效
        return false;
    e = L.data[i-1]; //将被删除的元素赋给e
    for(int j=i;j<L.length;j++)
        L.data[j-1] = L.data[j];//将第i个位置后的元素前移
    L.length--;//线性表长度减一
    return true;
}
//按位查找
int GetElem(SqList L,int i){
    return L.data[i-1];
}
//按值查找
int LocateElem(SqList L,int e){
    for (int i = 0; i < L.length; i++)
    {
        if (L.data[i] == e)
        {
            return i+1;
        }      
    }
    return 0;
}
int main(){
    SqList L;
    InitList(L);
    //打印初始化顺序表
    for(int i = 0; i < MaxSize; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    printf("执行插入操作后\n");
    ListInsert(L,1,1);//初始化将表长度置为0;只能从第一个位置插入
    ListInsert(L,2,2);
    ListInsert(L,3,3);
    ListInsert(L,4,4);
    ListInsert(L,5,5);
    //打印插入操作后的顺序表
    for(int i = 0; i < L.length; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    printf("执行删除操作后\n");
        int e = -1;
    if(ListDelete(L,3,e))
        printf("已删除第3个元素,删除元素的值为%d\n",e);
    else
        printf("位序i不合法,删除失败!\n");
    //打印插入操作后的顺序表
    for(int i = 0; i < L.length; i++)
        printf("data[%d]=%d\n",i,L.data[i]);
    //查找第3位元素
    printf("第3位元素值为:%d\n",GetElem(L,3));
    //查找元素值为4的元素位序
    printf("值为4的元素位序:%d\n",LocateElem(L,4));
    return 0;
}
  • 运行效果图如下:
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值