线性表(顺序表)的初始化,取值,查找,插入及删除(c++)

一、问题描述:

顺序表中的基本操作以及描述(基本操作包括对线性表进行初始化,取值,查找元素,插入元素以及删除元素)

二、功能:

(1)初始化线性表:

构造一个空的顺序表,并将表的长度设置为0,具体代码实现如下:

Status InitList(SqList &L)
{
	L.elem=new ElemType[MAXSIZE];
	if(L.elem==NULL) return ERROR;
	L.length=0;
	return OK;
}

(2)存值

本用例为方便,仅存储5个数据,可以更改循环次数从而增加线性表刚开始存储元素的个数。

利用循环将5个值存入顺序表中,每一次存入都要将表的长度加一,记得形参这里的L一定要使用引

用传递,否则存入后线性表仍然是一个空的线性表

void Creat_n(SqList &L)//参数一定要使用引用
{
	ElemType c;
	printf("请输入线性表的5个值:\n");
	for(int i=1;i<=5;i++){
		scanf("%d",&c);
		L.elem[i]=c;
		L.length++;
	}
} 

(3)元素的取值

通过输入要取值的元素的位置来进行取值,并将取到的结果赋给同种变量类型e,在这里e同时也要使用引用传递,因为将取到的值赋给变量e后e的值已经发生改变了。同时要对输入的i值(所取元素的位置)进行判断,如果i值合理才能继续进行,否则需要找一个安全出口退出(return ERROR),具体代码如下:

Status GetElem(SqList L,int i,ElemType &e) 
{
	if(i<1 || i>L.length) return ERROR;
	e=L.elem[i];
	return OK;
} 

(4)元素的查找

元素的查找要使用逐一对比,从第一个元素开始依次与传进的值e进行对比,如果相同,返回i+1,如果没有与传入元素相同的值,返回0,具体代码实现如下:

int LocateElem(SqList L,ElemType e)
{
	for(int i=1;i<=L.length;i++)
		if(L.elem[i]==e) return i;
	return 0;
}

(5)元素的插入

插入元素首先判断插入的位置是否合理,及(i<1 || i>L.length+1),如果不合理,返回ERROR值,其次要判断该线性表的长度是否已经到达最大值MAXSIZE,如果达到,同样返回值ERROR,当插入位置合适并且线性表的长度没有到达最大值,进行元素的插入,将要插入的位置的后面所有元素依次向后移动一个位置(从后面开始移动),并将该元素插入指定位置,插入后,要将线性表的长度加1,具体代码实现如下:

Status ListInsert(SqList &L,int i,ElemType e)
{
	if(i<1 || i>L.length+1) return ERROR;
	if(L.length==MAXSIZE) return ERROR;
	for(int j=L.length;j>=i;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i]=e;
	++L.length;
	return OK;
} 

(6)元素的删除

同元素的插入一样,需要判断删除元素的位置是否合理,即(i<1 || i>L.length),但是不需要判断线性表的长度是否已经达到最大值,进行元素的删除时,要将该元素后面的元素一一向前挪动一个位置,删除元素后,要将线性表的长度减1,具体代码实现如下:

Status ListDelete(SqList &L,int i){
	if(i<1 || i>L.length) return ERROR;
	for(int j=i+1;j<=L.length;j++)
		L.elem[j-1]=L.elem[j];
	--L.length;
	return OK;
} 

(7)线性表的展示

线性表的展示直接利用循环遍历线性表中的每一个元素即可,这里的L不需要使用参数传递,因为只是简单的遍历输出元素,没有改变线性表元素的值,具体代码如下:

void Display(SqList L)
{
	printf("当前线性表为:\n");
	for(int i=1;i<=L.length;i++)
		 printf("%d ",L.elem[i]);
	printf("\n");
}

三、整体代码(注释及运行截图)

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct
{
	ElemType *elem;
	int length; 
}SqList;
 
//线性表的初始化 
Status InitList(SqList &L)
{
	L.elem=new ElemType[MAXSIZE];
	if(L.elem==NULL) return ERROR;
	L.length=0;
	return OK;
}
 
//线性表的存值
void Creat_n(SqList &L)
{
	ElemType c;
	printf("请输入线性表的5个值:\n");
	for(int i=1;i<=5;i++){
		scanf("%d",&c);
		L.elem[i]=c;
		L.length++;
	}
} 

//线性表的取值
Status GetElem(SqList L,int i,ElemType &e) 
{
	if(i<1 || i>L.length) return ERROR;
	e=L.elem[i];
	return OK;
} 
 
//线性表的查找元素
int LocateElem(SqList L,ElemType e)
{
	for(int i=1;i<=L.length;i++)
		if(L.elem[i]==e) return i;
	return 0;
}
 
//线性表的插入元素
Status ListInsert(SqList &L,int i,ElemType e)
{
	if(i<1 || i>L.length+1) return ERROR;
	if(L.length==MAXSIZE) return ERROR;
	for(int j=L.length;j>=i;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i]=e;
	++L.length;
	return OK;
} 
 
//线性表的删除元素
Status ListDelete(SqList &L,int i){
	if(i<1 || i>L.length) return ERROR;
	for(int j=i+1;j<=L.length;j++)
		L.elem[j-1]=L.elem[j];
	--L.length;
	return OK;
} 	
 
//打印线性表
void Display(SqList L)
{
	printf("当前线性表为:\n");
	for(int i=1;i<=L.length;i++)
		 printf("%d ",L.elem[i]);
	printf("\n");
}
 
int main()
{
	SqList L;
	ElemType e;
	int v,k,opt,p;
	p=InitList(L);
	if(p==0) printf("初始化失败!");
	else{
		printf("初始化成功\n");
		printf("请存入5个元素到线性表中\n"); 
		Creat_n(L); 
		printf("1:取出线性表中的某个值\n");
		printf("2:查找线性表中的元素\n");
		printf("3:将线性表中插入一个元素\n");
		printf("4:将线性表中删除一个元素\n");
		printf("5:展示当前线性表\n");
		printf("6:退出\n"); 
		
		while(1){	
			printf("请输入您的选择:");
			cin>>opt;
			if(opt==1){
				//取出线性表中的某个值 
				printf("请输入要取出值的位置:"); 
				cin>>v;
				p=GetElem(L,v,e);
				if(p==0) printf("输入位置非法\n");
				else
					printf("该值为:%d\n",e); 
			}
			else if(opt==2){
				//进行元素的查找
				printf("请输入您要查找的元素:");
				cin>>v;
				k=LocateElem(L,v);
				if(k==0) printf("输入位置非法\n");
				else
					printf("您所查找的元素所在位置为:%d\n",k);
			}
			else if(opt==3){
				//线性表元素的插入
				printf("请输入您要插入的元素及插入的位置:");
				cin>>v>>k;
				p=ListInsert(L,k,v);
				if(p==0) printf("输入位置非法\n");
				else
					Display(L);
			}
			else if(opt==4){ 
				//线性表元素的删除 
				printf("请输入您要删除第几个元素:");
				cin>>v; 
				p=ListDelete(L,v);
				if(p==0) printf("输入位置非法\n");
				else
					Display(L);
			}
			else if(opt==5){
				Display(L);
			}
			else if(opt==6){
				printf("退出成功");
				break; 
			}
		}
	}
}

运行截图

三、线性表(顺序表)的优点及缺点分析:

优点:顺序表可以随机存取表中的任一元素

缺点:插入和删除元素过于麻烦,都需要移动大量的数据,操作过程相对复杂,并且会导致存储空间的浪费。

  • 46
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值