数据结构 :线性表中顺序表的建立和基本操作(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;
 }
相关推荐
Doubbbbbbble云1 小时前
基于贪心算法的区间覆盖问题求解策略4
算法·贪心算法
不会就选b7 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
千里码aicood10 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
做cv的小昊11 小时前
【World Model】π0.5:a Vision-Language-Action Model with Open-World Generalization
人工智能·算法·机器学习·大模型·多模态·vla·世界模型
لا معنى له11 小时前
World-In-World: World Models in a Closed-Loop World
算法
Discipline102914 小时前
尼泊尔河流流量:天气驱动的预测与高流量风险
人工智能·算法
XuCoder14 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
算法
小羊没烦恼!14 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
weixin_3077791314 小时前
基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化
开发语言·算法