【浙大数据结构学习笔记】2.1.2 线性表的顺序存储实现

2.1.2 线性表的顺序存储实现

什么是线性表

由同种数据元素构成的有序序列的存储结构。

线性表的元素个数称为表长
线性表没有元素时称为空表
线性表的起始位置称为表头,线性表的结束位置称为表尾

线性表的顺序存储实现

实质上是结构数组。

#define MAXSIZE 10

typedef struct LNode *List;
  struct LNode{
  	int Data[MAXSIZE];
  	int last;//线性表的长度
  	
  };

在这里插入图片描述

初始化

线性表的初始化,即建立一个空线性表。

List MakeEmpty(){
	List PtrL;
	PtrL=(List)malloc(sizeof(struct LNode));
	PtrL->last=-1;
	return PtrL;	
}

疑问:动态分配空间大小怎么确定?

查找

int Find(List PtrL,int X){
	int i=0;
	while(i<=PtrL->last && PtrL->Data[i]!=X){
		i++;
		if(i>PtrL->last)//没找到
			return -1;
		else
			return i; 
	}
}

插入

第 i 个位置插入元素X,其中 i=1,2,3,…,MAXSIZE

考虑情况:

  1. 表空表满
  2. 非空非满
  3. 插入位置合法与否
void Insert(List PtrL,int i,int X){
	 if(PtrL->last==MAXSIZE){
	 		printf("表满,无法插入!");
	 		return;
	 }
	 if(i<1 || i>MAXSIZE){
	 		printf("插入位置不合法!");
	 		return;
	 }
	 
	
	 if(PtrL->last==-1){//空表插入
	  PtrL->last=1;
	   PtrL->Data[0]=X;
	 }else{
	 	int j;
	 	for(j= PtrL->last;j>=i;j--){
	 		PtrL->Data[j]=PtrL->Data[j-1];//相应元素倒序后移 
		 }
		 PtrL->Data[j]=X;
		 PtrL->last++;
	 }

}

删除

删除第 i 个位置的元素,其中 i=1,2,3,…,MAXSIZE

考虑情况:

  1. 表空与否
  2. 所删除位置合法与否
void Delete(List PtrL,int i){

	 if(PtrL->last==-1){
		printf("空表无法删除!\n");
		return;
	 }
	 if(i<1 || i>PtrL->last){
	 	printf("位置不合法!\n");
 		return;
	 }
	
	int j;
	for(j=i-1;j<PtrL->last;j++){
 		PtrL->Data[j]=PtrL->Data[j+1];//相应元素顺序前移 
	}
	PtrL->last--;
}

展示

void Display(List PtrL){

	if(PtrL->last==-1){
		printf("表空!\n");
		return;
	}
	int i=0;
	while(i<PtrL->last){
		printf("%d\n",PtrL->Data[i]);
		i++;
	}
		
}

测试

主函数

int main(){

	List L=MakeEmpty();
	
	Insert(L,1,1) ;
	Insert(L,2,2) ;	
	Insert(L,3,3) ;
		Display(L); 
	Delete(L,1);
		Display(L); 
	Delete(L,4);
		Display(L); 
		
	printf("%d\n",Find(L,2));
	printf("%d\n",Find(L,20));	

	return 0;
}

结果输出

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值