[数据结构]线性表的顺序存储1- -顺序表


线性表采用顺序存储的方式称为顺序表

顺序表的基本概念

线性表

  • 是一个线性结构
  • 在这里插入图片描述
#define MAXSIZE 100
typedef int datatype; //typeof给int取名叫datatype
typedef struct{  //结构体
 datatype a[MAXSIZE];    //这里以数组的形式储存,后期可修改其类型
  int size; //上面MAXSIZE是数组最大内存,这里size表示元素个数
  }sequence_list  //自定义名字 

顺序表的初始化—置空表

void init(sequence_list *slt)  //*slt结构体类型的指针
{
   slt->size=0; //借助指针访问对象,即(*slt)size
}

在顺序表后部进行插入操作

void append(sequence_list *slt,datatype x)//末尾想要添加一个数
{
 if(slt->size==MAXSIZE)
 {printf("顺序表是满的");exit(1);}
 //exit(1)指的是整个程序直接退回操作系统
 slt->a[slt->size]=x;//最后一个单元格放x
 slt->size=slt->size+1;//元素个数加1
}

注意:插入数据必须判断元素个数是否已满

打印顺序表的各结点值

void display(sequence_list *slt)
{
int i;
if(!slt->size)
	printf("\n顺序表是空的")
else
	for(i=0;i<slt->size;i++)
		printf("%5d",slt->a[i]);
}

判断顺序表是否为空表

int empty(sequence_list *slt)
{
	return (slt->size==0?1:0);
}

查找顺序表中值为x的结点

int find(sequence_list *slt,datatype x)
{
int i=0;
while(i<slt->size&&slt->a[i]!=x)
	i++;
return(i<slt->size?i:1);
}

取得顺序表中第i个结点的值

datatype get(sequence_list *slt,int i)
{
 if(i<0||i>slt->size){
 	printf("指定顺序表不存在");exit(1);
 }
 else
 	return slt->a[i];

顺序表插入

void insert (sequence_list *list,datatype x,int position)
{
int i;
if(list->size==MAXSIZE)
	{printf("\n顺序表是满的,没法插入!");exit(1);}
if(position<0||position>slt->size)
{ptintf("\n插入的位置不存在")exit(1);}
}
for(i=slt->size;i>position;i--) slt->a[i]=slt->a[i-1];
slt->a[position]=x;slt->size++;
}

在这里插入图片描述

顺序表的删除

void dele (sequence_list,int position)
{
int i;
if(slt->size==0)
{printf("\n顺序表是空的");exit(1);}
if(position<0||position>=slt->size) //最大下标
{printf("\n指定删除位置不存在");exit(1);}
for(i=position;i<slt->size-1;i++) set->a[i]=slt->a[i+1];
slt->size--;
}

课后答疑

  • 等概率情况下平均移动次数(等差数列)
    查询 (n+1)/2 删除 (n-1)/2 插入 n/2
    注意:算完总共次数记得/变化后的总个数
  • exit(1) 描述算法不多(因为执行后退出程序回到系统,这个程序就废了)。所以我们做题可以用return等
  • 上面写的顺序表插入代码,可以这么改
void insert (sequence_list *list,datatype x,int position)
{
int i;
if(list->size==MAXSIZE)
	{printf("\n顺序表是满的,没法插入!");exit(1);}
if(position<0||position>slt->size)
{ptintf("\n插入的位置不存在")exit(1);}
}
//for(i=slt->size;i>position;i--) slt->a[i]=slt->a[i-1];
for(i=slt->size-1;i>=position;i--) slt->a[i+1]=slt->a[i];
slt->a[position]=x;slt->size++;
}
  • 为什么是void append(squenerce_list *slt),而不是(squenerce_list *slt)?
    因为 *slt 是地址传递,传的是结构体本身
    没有 * 是单向传递,是一个复制结构
    -在这里插入图片描述
    注意:这里是指次数,而不是时间复杂度。时间复杂度是O(n)
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值