数据结构——顺序表(声明、初始化、增加、删除、搜索修改、插入、遍历)

以下是数据结构中关于顺序表的声明、初始化、增加、删除、搜索修改、遍历等基础操作(编程风格参考严蔚敏版数据结构)。

头文件及宏

#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 20//定义顺序表最大空间 
#define ElemType int //将ElemType 定义为int
#define Boolean int	//将Boolean 定义为int
#define OK 1
#define ERROR 0
#define STOP 0
#define OVERFLOW -1

定义宏是为了让代码有更好的可读性

声明顺序表

typedef struct SqList{
	ElemType *data;
	int length = 0;
}Sqlist,*Sl; 

初始化

void initial(Sqlist &L){//此处我们以实体的形式传入 
	L.data = new ElemType[MAXSIZE];//用指针表示的数组,要预先分配地址空间 
	L.length = 0;
}

特别要注意的是:结构体用点( . ),结构体指针用箭头( -> )。也就是说点的左边必须为实体,箭头左边必须为指针。

增加元素

Boolean addElement(Sl L){//此处我们以指针的形式传入
	ElemType data;
	cout<<"请输入新的data(输入-1停止新增):";
	cin>>data;
	if(data==-1){
		return STOP;
	}else if(L->length<MAXSIZE - 1){
		L->data[L->length] = data;
		L->length++;
		return OK;
	}else{
		return OVERFLOW;
	}
} 

void add(SqList &L){
	Boolean flag = OK;
	while(flag){	
		flag = addElement(&L);
	}
	if(flag!=OVERFLOW){
		cout<<"元素新增完成!";
		showList(L);
	}
}

注意:add函数的flag = addElement(&L)的“&L”是为了将链表地址赋给addElement函数的指针L

删除

Boolean delElement(Sl L,int index){
	if(index<0||index>L->length-1){
		cout<<"输入index不合法!已超出范围!"<<endl;
		return OVERFLOW;
	}
	for(int i=index;i<L->length-1;i++){
		L->data[i] = L->data[i+1];
	}
	L->length--;
	return OK;
}

void del(Sl L){
	int index;
	cout<<"请输入要删除的元素的下标:"; 
	cin>>index;
	if(delElement(L,index)){
		cout<<"删除元素成功!";
		showList(*L);//指针转实体传入 
	}
}

步骤:
1、从被删元素的位置开始,将下一个元素的值覆盖到被删除的位置的值;
2、循环一直到将最后一个位置的值覆盖到倒数第二个位置上;
3、将顺序表的长度-1。

搜索/修改

Boolean searchElement(Sqlist &L,ElemType data){
	Boolean flag = ERROR;
	for(int i = 0;i<L.length;i++){
		if(L.data[i]==data){
			cout<<"查找成功!第"<<i<<"个元素为"<<data<<endl;
			flag = OK;
		}
	}
	return flag;
}

void search(Sl L){
	ElemType data;
	cout<<"请输入要搜索的data:";
	cin>>data;
	Boolean flag; 
	flag = searchElement(*L,data);
	if(flag){
	}else{
		cout<<"No data in this List!"<<endl;	
	}
}

插入

Boolean insertElement(Sl L,ElemType data,int index){
	if(index>L->length-1||index>MAXSIZE){
		cout<<"下标溢出!"<<endl;
		return OVERFLOW;
	}
	L->length++;
	for(int i=L->length-1;i>index;i--){
		L->data[i] = L->data[i-1];
	}
	L->data[index] = data;
	return OK;
}

void insert(Sl L){
	ElemType data;
	int index;
	cout<<"请输入data";
	cin>>data; 
	cout<<"请输入插入位置:";
	cin>>index;
	if(insertElement(L,data,index)){
		cout<<"插入成功!";
		showList(*L); 
	}
}

步骤:
1、从顺序表末尾元素开始,将每一个元素都往后一个位置赋值;
2、当循环至被插入的位置时,将新数据写入;
3、顺序表的长度+1。

遍历:

void showList(Sqlist &L){
	cout<<"当前顺序表状态:"<<endl;
	for(int i=0;i<L.length;i++){
		cout<<i<<" ";
	}cout<<"<-下标"<<endl; 
	for(int i=0;i<L.length;i++){
		cout<<L.data[i]<<" ";
	} 
	cout<<endl;
} 

只得说明的是:
本程序关于参数的传递使用了两种方式,本程序初始的List为结构体实体而不是结构体指针(初始List为结构体指针的模式请查看这篇文章数据结构——双向循环链表(声明、初始化、增加、删除、搜索修改、顺序逆序遍历)):
第一种:Sqlist &L。这是将结构体实体作为实体传入函数中进行操作。对实体的数据进行操作时,使用的是.而非->;
第二种:Sl L。这是声明一个指针L指向结构体List,是将实体转变为指针传入函数进行操作。对指针的数据进行操作时,使用的是->而不是.;
将实体转为指针的方式:Sl &L = &List。
将指针转为实体的方式:Sqlist &L = *List。

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整源码:

/*
广西师范大学 计算机科学与工程学院 
GuangXi Normal University College of Computer Science and Engineering  
GXNUCSE Student STZ 
*/ 
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 20//定义顺序表最大空间 
#define ElemType int
#define Boolean int
#define OK 1
#define ERROR 0
#define STOP 0
#define OVERFLOW -1
typedef struct SqList{
	ElemType *data;
	int length = 0;
}Sqlist,*Sl; 

void initial(Sqlist &L){//此处我们以实体的形式传入 
	L.data = new ElemType[MAXSIZE];//用指针表示的数组,要预先分配地址空间 
	//结构体用点( . ),结构体指针用箭头( -> )。
	//也就是说点的左边必须为实体,箭头左边必须为指针。
	L.length = 0;
}

void showList(Sqlist &L){
	cout<<"当前顺序表状态:"<<endl;
	for(int i=0;i<L.length;i++){
		cout<<i<<" ";
	}cout<<"<-下标"<<endl; 
	for(int i=0;i<L.length;i++){
		cout<<L.data[i]<<" ";
	} 
	cout<<endl;
} 

Boolean addElement(Sl L){//此处我们以指针的形式传入(单纯为了展示两种形式的不同点而已) 
	ElemType data;
	cout<<"请输入新的data(输入-1停止新增):";
	cin>>data;
	if(data==-1){
		return STOP;
	}else if(L->length<MAXSIZE - 1){
		L->data[L->length] = data;
		L->length++;
		return OK;
	}else{
		return OVERFLOW;
	}
} 

void add(SqList &L){
	Boolean flag = OK;
	while(flag){	
		flag = addElement(&L);
	}
	if(flag!=OVERFLOW){
		cout<<"元素新增完成!";
		showList(L);
	}
}

Boolean delElement(Sl L,int index){
	if(index<0||index>L->length-1){
		cout<<"输入index不合法!已超出范围!"<<endl;
		return OVERFLOW;
	}
	for(int i=index;i<L->length-1;i++){
		L->data[i] = L->data[i+1];
	}
	L->length--;
	return OK;
}

void del(Sl L){
	int index;
	cout<<"请输入要删除的元素的下标:"; 
	cin>>index;
	if(delElement(L,index)){
		cout<<"删除元素成功!";
		showList(*L);//指针转实体传入 
	}
}

Boolean searchElement(Sqlist &L,ElemType data){
	Boolean flag = ERROR;
	for(int i = 0;i<L.length;i++){
		if(L.data[i]==data){
			cout<<"查找成功!第"<<i<<"个元素为"<<data<<endl;
			flag = OK;
		}
	}
	return flag;
}

void search(Sl L){
	ElemType data;
	cout<<"请输入要搜索的data:";
	cin>>data;
	Boolean flag; 
	flag = searchElement(*L,data);
	if(flag){
	}else{
		cout<<"No data in this List!"<<endl;	
	}
}

Boolean insertElement(Sl L,ElemType data,int index){
	if(index>L->length-1||index>MAXSIZE){
		cout<<"下标溢出!"<<endl;
		return OVERFLOW;
	}
	L->length++;
	for(int i=L->length-1;i>index;i--){
		L->data[i] = L->data[i-1];
	}
	L->data[index] = data;
	return OK;
}

void insert(Sl L){
	ElemType data;
	int index;
	cout<<"请输入data";
	cin>>data; 
	cout<<"请输入插入位置:";
	cin>>index;
	if(insertElement(L,data,index)){
		cout<<"插入成功!";
		showList(*L); 
	}
}

void menu(Sqlist &List){
	int c = 0;
	while(1){
		cout<<"请选择操作:"<<endl;
		cout<<"1:新增元素"<<endl;
		cout<<"2:插入元素"<<endl;
		cout<<"3:删除元素"<<endl;
		cout<<"4:展示元素"<<endl;
		cout<<"5:搜索元素"<<endl;
		cout<<"6:退出系统"<<endl;
		cin>>c;
		switch(c){
			case 1:add(List);break;
			case 2:insert(&List);break;
			case 3:del(&List);break;//实体转指针 
			case 4:showList(List);break;
			case 5:search(&List);break; 
			case 6:return;
			default:;
		} 
	}
}

int main(){
	Sqlist L;
	initial(L);
	menu(L);
	return 0;
}

以上仅作为个人关于顺序表基础操作理解,关于边界问题等特殊问题未作出特殊处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芣苢的成长之路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值