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

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

目录

建立 

基本操作

1.取值

2.查找

 3.插入

4.删除

5.修改

6.遍历

代码测试


建立 

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

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

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

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

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

//初始化
void Init(SqList &s)
 {s.len=0;}

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

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

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


基本操作

1.取值

//取值
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.查找

//查找(下标)
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.插入

//插入
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.删除

​
//删除
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.修改

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

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

首先判断i是否合法。

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

6.遍历

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

输出列表的值。


代码测试

 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;
 }

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头马上秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值