数据结构 :线性表中顺序表的建立和基本操作(C)

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。


建立

arduino 复制代码
//顺序表
#include<stdio.h>
#define size 101
typedef int Elemtype;
typedef struct
{
    Elemtype data[size];
    int len;
}SqList;  

首先通过typedef进行顺序表中的元素类型进行初定义(表中的数据类型默认为int类型,使用typedef定义的好处是方便表中元素类型的整体的修改)。

其次定义一个顺序表的结构体, 内容包括顺序表中的元素以及表长。

顺序表需提前分布好最大容量,由于定义的size为101,故该表从下标从1开始,表长最多依旧为100,方便后续运算。

这个结构体就相当于一个模子,每需要一个线性结构时,就要调用这个结构体。

arduino 复制代码
//初始化
void Init(SqList &s)
 {s.len=0;}

通过函数Init进行顺序表的初始化。

arduino 复制代码
//判断是否为空
bool IsEmpty(SqList s)
{    if(s.len==0) return true;
     return false;
}

定义一个布尔类型的函数判断是否为空表。


基本操作

1.取值

scss 复制代码
//取值
void GetElem(SqList s,int i,Elemtype &e)
{
    if(i<1||i>s.len) return 0;      //判断i是否合法
    e=s.data[i];
}

定义一个GetElem函数来完成取值操作,其中i为顺序表中的下标。

把表中的数据存入e中需寻址,&不可丢掉。

函数内部首先判断下标是否合法,如果合法将表中该下标的元素赋值给e,即可通过scanf进行输出。

2.查找

arduino 复制代码
//查找(下标)
int Find(SqList s,Elemtype e)
{
    for(int i=1;i<=s.len;i++)
        if(s.date[i]==e] return i;
        return 0;
}

定义一个Find函数来完成查找操作,此函数需返回一个整形值,定义时用int类型来定义。

函数内部采用一个for循环从表头(下标为1的元素)开始遍历顺序表,当发现e中的值与某个元素相等时输出该元素的下标i。

3.插入

scss 复制代码
//插入
void   Insert(SqList &s,int i,Elemtype e)
{ 
    if(s.len==size-1) return;     //判断表是否满
    if(i<1||i>s.len+1) return;      //判断i是否合法
    for(int j=s.len;j>=i;j--) 
        s.data[j+1]=s.data[j];    //移动 整体右移
        s.data[i]=e;               //插入
        s.len++;                  //表长+1
    return 0;
}     

定义一个Insert函数来完成插入操作,i为表中下标。

在函数内部,首先判断表中元素是否满,若满则无法插入,返回。

其次判断下标i是否合法。

满足上述条件即可完成插入,首先将表中元素j位置的值赋给j+1,即表整体右移。

最后完成表长+1。

4.删除

scss 复制代码
//删除
void Del(SqList &s,int i)
{
    if(i<1||i>s.len) return;        //判断i合法    
    for(int j=i;j<s.len;j++)        
        s.data[j]=s.data[j+1];      //删除 整体左移
    s.len--;                        //表长-1
}

定义Del函数来完成删除操作。

首先判断i是否合法。

若i合法,则可以进行删除操作,与插入不同的是,删除是将表中数据集体右移,即for中的第一个循环就是将所删除元素的值进行了覆盖,随后多次循环完成删除。

最后完成表长-1。

5.修改

scss 复制代码
//修改
void Revise(SqList &s,int i,Elemtype e) 
 {
 	if(i<1||i>s.len) return;
	s.data[i]=e; 
 }

定义Revise函数完成修改操作。

首先判断i是否合法。

其次将所修改的值赋给i所对应的存储空间。

6.遍历

scss 复制代码
//遍历 
 void Display(SqList s)
 {
 	for(int i=1;i<=s.len;i++)
    	printf("%3d",s.data[i]);
    printf("\n");
 }

输出列表的值。


代码测试

scss 复制代码
 int main()
 {
 	SqList a1;
 	Elemtype e;
 	Init(a1);
 	Insert(a1,1,100);Insert(a1,2,89);
 	Insert(a1,3,60);Insert(a1,4,25);
 	GetElem(a1,2,e);printf("%d\n",e);
 	printf("%d\n",Find(a1,25));
 	Revise(a1,4,5);
 	Display(a1);
 	return 0;
 }
相关推荐
Jerry5 分钟前
LeetCode 541. 反转字符串 II
算法
Jerry26 分钟前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手42 分钟前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议
Java小白笔记1 小时前
Codex config.toml配置实战指南
人工智能·算法·chatgpt·ai编程·集成学习
王老师青少年编程1 小时前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
z小猫不吃鱼1 小时前
模型剪枝经典论文精读:Pruning Filters for Efficient ConvNets
算法·机器学习·剪枝
Fox爱分享3 小时前
字节二面:1000瓶酒,有一瓶是毒药,多少只老鼠可以查出来?
算法·面试·程序员
+wacyltd大模型备案算法备案3 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
Fox爱分享3 小时前
字节二面智力题:100只老虎和1只羊关在一起,这只羊会不会被吃?
算法·面试·程序员
xin(n_n)b4 小时前
经典题目(3):把数字翻译成字符串;兑换零钱
算法