数据结构之线性表(顺序表)

目录

一、概念

1、线性表的定义

2、线性表的存储结构

3、顺序表的优缺点

二、顺序表的结构体定义和基本操作

1、顺序表的结构体定义

2、创建顺序表

3、查找数据元素

4、插入数据元素

5、删除数据元素

三、总结

四、源代码 


一、概念

1、线性表的定义

线性表是具有相同特性数据元素的一个有限序列。

线性表的长度:该序列中所含元素的个数(n>=0);

n=0,表示线性表是一个空表。

2、线性表的存储结构

线性表的存储结构有顺序存储结构链式存储结构两种。

3、顺序表的优缺点

优点:存储密度大;可以随机存取表中任一元素。

缺点:在插入、删除某一元素时,需要移动大量元素;浪费存储空间;属于静态存储形式,数据元素的个数不能自由扩充。

二、顺序表的结构体定义和基本操作

1、顺序表的结构体定义

  • 头文件以及宏定义
    #include<stdio.h>
    #include<stdlib.h> 
    #define maxsize 100
  • 顺序表的结构体定义
    typedef struct{
    	int data[maxsize];  //存放顺序表元素的数组
    	int length;        //存放顺序表的长度
    }SqList;

typedef:可以理解为给这个结构体取了个别名(SqList),在后续的程序中就直接可以用SqList来定义结构体变量。 

2、创建顺序表

由数组元素num[0,...n-1 ]创建顺序表L。其方法是将数组num中的每个元素依次放入到顺序表中。

  •   主函数
    #include<stdio.h>
    #include<stdlib.h> 
    #define maxsize 100
    typedef struct{
    	int data[maxsize];
    	int length;
    }SqList;
    
    void createList(SqList &L,int a[],int n);   //创建顺序表
    void printList(SqList L);    //输出顺序表
    
    /*方法一  用户自行输入数据 
    int main(){
    	SqList L;
    	int n;
    	scanf("%d",&n);
    	int num[n];
    	for(int i=0;i<n;i++){
    		scanf("%d",&num[i]);
    	}
    	createList(L,num,n);   //创建一个顺序表 ,n表示元素的个数
    	
    	return 0;
    } 
    */
    
    //方法二   直接用数组a中的元素来创建顺序表
    int main(){
    	SqList L;
    	int a[10]={1,2,3,4,5,6,7,8}; //定义一个数组存放数据元素
    
    	createList(L,a,6);   //创建一个顺序表 
    	
    	return 0;
    } 
  • 创建顺序表
    //创建顺序表
    void createList(SqList &L,int a[],int n){
    	int i=0,k=0;           //k表示L中元素的个数,初始值位0; 
    	while(k<n){
    		L.data[i]=a[i];
    		i++;k++;
    	} 
    	L.length=k;
    }
     
  • 输出顺序表
    //输出顺序表
    void printList(SqList L){
    	int i;
    	for(i=0;i<L.length;i++){
    		printf("%4d",L.data[i]);
    	}
    } 
     

结果:

3、查找数据元素

  • 查找i位置上数据元素的值
    //找在i位置上是数据元素的值 (注意数组下标和物理位置的区别)
    int GetElement(SqList L,int i){
    	int e;    //定义一个变量保存查找到的元素
    	if(i<1||i>L.length)
    		return 0;   
    	e=L.data[i-1];
    	return e; 
    } 
  •  按元素值查找,返回其下标 
    //按元素值查找,返回其下标 
    int  LocatElem(SqList L,int e){
    	int i=0;
    	while(L.data[i]!=e){
    		i++;
    	}
    	if(i>=L.length){    //没有找到返回-1 
    		return -1;
    	}
    	return i;          //找到了返回其下标 
    } 

4、插入数据元素

//插入数据元素
int insertList(SqList &L,int k,int e){
	int i;
	if(k<0||k>L.length-1||L.length==maxsize){   //位置错误或已经到达表长
		return 0;                            //此时插入不成功,返回0
	}
	for(i=L.length-1;i>=k;i--){
		L.data[i+1]=L.data[i];          //从后往前,逐个将元素后移一个位置
	}
	L.data[k]=e;               //将e放在k位置上
	L.length++;                //表长增1
	return 1;
} 

5、删除数据元素

//删除某个数据元素
int deleteList(SqList &L,int k) {
	int i;
	if(k<0||k>L.length-1)     //位置不对,返回0,表示删除不成功
		return 0;
	for(i=k;i<L.length-1;i++){
		L.data[i]=L.data[i+1];   //从k位置开始,将后边的元素逐个前移一个位置
	}
	L.length--;    //表长减1
	return 1;
}

三、总结

  • 重点掌握顺序表的查找、插入和删除;

四、源代码 

#include<stdio.h>
#include<stdlib.h> 
#define maxsize 100
typedef struct{
	int data[maxsize];
	int length;
}SqList;


void createList(SqList &L,int a[],int n);   //创建顺序表

void initList(SqList &L);    //初始化线性表

void printList(SqList L);    //输出顺序表
 
bool ListEmpty(SqList L);   //判断顺序表是否为空

int Listlength(SqList L);   //求顺序表的长度 

int GetElement(SqList L,int i); //找在i位置上是数据元素的值 

int  LocatElem(SqList L,int e); //按元素值查找,返回其下标 

int insertList(SqList &L,int k,int e);  //插入数据元素

int deleteList(SqList &L,int k);  //删除某个数据元素


int main(){
	SqList L;
	int n;
//	scanf("%d",&n);
//	int num[n];
//	for(int i=0;i<n;i++){
//		scanf("%d",&num[i]);
//	}
	int a[10]={1,2,3,4,5,6,7,8};
	createList(L,a,6);   //创建一个顺序表 
	printf("1、创建一个顺序表:\n");
	printList(L); 
	printf("\n2、顺序表的长度为:%d",Listlength(L)); 
	//插入数据元素
	insertList(L,5,11);//在下标为5的位置插入数据11
	printf("\n3、插入数据元素后的表:");
	printList(L); 
	//删除数据元素 
	deleteList(L,3);
	printf("\n4、删除数据元素后的表:");
	printList(L); 
	//查找数据元素 
	printf("\n5、查找元素为4的下标(-1表示没有找到):%d",LocatElem(L,4));
	printf("\n6、查找第一个元素(下标为0):%d\n",GetElement(L,1));
	return 0;
} 

//创建顺序表
void createList(SqList &L,int a[],int n){
	int i=0,k=0;           //k表示L中元素的个数,初始值位0; 
	while(k<n){
		L.data[i]=a[i];
		i++;k++;
	} 
	L.length=k;
}

//初始化顺序表
void initList(SqList &L){
	L.length=0;
} 

//输出顺序表
void printList(SqList L){
	int i;
	for(i=0;i<L.length;i++){
		printf("%4d",L.data[i]);
	}
} 
//判断顺序表是否为空 
bool ListEmpty(SqList L){
	return(L.length==0);
} 
//求顺序表的长度 
int Listlength(SqList L) {
	return(L.length);
}
//找在i位置上是数据元素的值 
int GetElement(SqList L,int i){
	int e;
	if(i<1||i>L.length)
		return 0;
	e=L.data[i-1];
	return e; 
} 

//按元素值查找,返回其下标 
int  LocatElem(SqList L,int e){
	int i=0;
	while(L.data[i]!=e){
		i++;
	}
	if(i>=L.length){    //没有找到返回-1 
		return -1;
	}
	return i;          //找到了返回其下标 
} 

//插入数据元素
int insertList(SqList &L,int k,int e){
	int i;
	if(k<0||k>L.length-1||L.length==maxsize){
		return 0;
	}
	for(i=L.length-1;i>=k;i--){
		L.data[i+1]=L.data[i];
	}
	L.data[k]=e;
	L.length++;
	return 1;
} 

//删除某个数据元素
int deleteList(SqList &L,int k) {
	int i;
	if(k<0||k>L.length-1)
		return 0;
	for(i=k;i<L.length-1;i++){
		L.data[i]=L.data[i+1]; 
	}
	L.length--;
	return 1;
}

此代码的结果图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小言同学Y

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

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

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

打赏作者

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

抵扣说明:

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

余额充值