一、基本操作
学习数据结构,我们先从简单的顺序表说起。要使用顺序表我们首先要定义顺序表的存储结构,如果有同学还不清楚什么是存储结构的话建议回去复习一下结构体哦。接着我们就是要实现顺序表的基本操作了。顺序表的基本操作包括对顺序表的初始化、顺序表的取值、查找、删除、插入、排序等。因为我们以后对顺序表的使用不是很频繁,一般都是使用链表,所以这里就不多说废话了。虽然我们用的不多,但是基本的原理我们还是要知道的。我们不说废话了,直接上代码吧。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef int Status,ElemType;
typedef struct //顺序表的存储结构
{
ElemType *elem;//存储空间的基地址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
Status InitList(SqList &L)//构造一个空的顺序表
{
L.elem=new ElemType[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
if(!(L.elem)) exit(OVERFLOW);//存储分配失败推出
L.length=0;//顺序表当前的长度为0
L.listsize=MAXSIZE;//顺序表的存储容量为MAXSIZE
return OK;
}
Status ListTraver(SqList L)//遍历顺序表
{
ElemType *p;
p=L.elem;
int i;
cout<<"线性表当前的容量为:"<<L.listsize<<endl;
if(L.length>0)
{
printf("当前线性表有%d个元素,分别是\n",L.length);
for(i=1;i<=L.length;i++)
cout<<*p++<<" ";
cout<<endl;
}
else
cout<<"目前还是空的表"<<endl;
return 0;
}
void Insert(SqList*L,int x,int y)//插入
{
int k;
if(x>L->listsize)
cout<<"插入下标大于数组长度"<<endl;
if(L->length==L->listsize)
cout<<"存储空间已满"<<endl;
for(int i=L->length;i>x;i--)
{
L->elem[i]=L->elem[i-1];
}
L->elem[x]=y;
L->length++;
cout<<"插入后顺序表中的元素如下:"<<endl;
for( k=0;k<L->length;k++)
{
cout<<L->elem[k]<<" ";
}
cout<<endl;
}
void Delete(SqList*L,int x)//删除第x个元素
{
int i;
if((x<1)||(x>L->length)) cout<<" 请输入正确的位置下标";
for(i=x+1;i<L->length;i++)
{
L->elem[i-1]=L->elem[i];
}
--L->length;
cout<<"删除后的元素为:"<<endl;
for(i=0;i<L->length;i++)
{
cout<<L->elem[i]<<" ";
}cout<<endl;
}
void sort(SqList *L,int n)//排序
{
for(int i=0;i<L->length;i++)
{
for(int j=i+1;j<L->length;j++)
{
int q;
if(L->elem[i]>L->elem[j])
{
q=L->elem[i];
L->elem[i]=L->elem[j];
L->elem[j]=q;
}
}
}
cout<<"排序后:"<<endl;
for(int k=0;k<n;k++)
{
cout<<L->elem[k]<<" ";
}
}
int LocatedElem(SqList L, ElemType e)//查找元素e在顺序表中的位置
{
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)return i+1;
}
return 0;
}
int GetElem(SqList L,int i)//顺序表的取值
{
if(i<0||i>L.length)return ERROR;
return L.elem[i];
return OK;
}
void main()
{
SqList L;
InitList(L);
ElemType *q,*p;
q=L.elem;
int n0,n,k;
int n1,m,n2,n3,n4;
cout<<"请输入顺序表中的元素个数n:"<<endl;
cin>>n;
if(n>L.listsize)
cout<<"顺序表长度最多是100"<<endl;
cout<<"请输入"<<n<<"个元素"<<endl;
for(int i=0;i<n;i++)
{
cin>>L.elem[i];//给顺序表L赋值
L.length++;//每赋值一次,顺序表的长度+1
}
while(true){
do
{
cout<<"1.查看顺序表的基本信息"<<endl;
cout<<"2.在顺序表中插入数字"<<endl;
cout<<"3.删除顺序表中的元素"<<endl;
cout<<"4.将顺序表中的数字排序"<<endl;
cout<<"5.查找顺序表中元素的下标位置"<<endl;
cout<<"6.查找顺序表中对应下标的位置"<<endl;
cout<<"请输入数字选择你需要的功能"<<endl;
cin>>n0;
switch(n0)
{
case 1:
ListTraver(L);
break;
case 2:
cout<<"请输入要插入的元素m和插入的位置下标n1"<<endl;
cin>>m>>n1;
Insert(&L,n1,m);
break;
case 3:
cout<<"请输入要删除的位置下标n2"<<endl;
cin>>n2;
Delete(&L,n2);
break;
case 4:
sort(&L,L.length);
break;
case 5:
cout<<"请输入需要查找的元素:"<<endl;
cin>>n3;
cout<<LocatedElem(L, n3);
break;
case 6:
cout<<"请输入要查找的下标"<<endl;
cin>>n4;
cout<<GetElem(L,n4);
default:
break;
}cout<<endl;
}while(n>=1&&n<=4);
}
}
程序运行结果如下:
二、应用
以上我们已经实现了对顺序表的一些简单操作了,我们已经可以利用这些操作去完成一些运算了。
例题:有两个集合A和B,我们需要求AUB,将合并后的数值存入到集合A中。例:A=(8 ,2 ,1 0,6),
B=(6,10,7,3),合并后A=(8,2,10,6,7,3)
代码如下:
void MergeList(SqList &LA,SqList LB)
{
int a;
int m=LA.length;
int n=LB.length;
for(int i=0;i<n;i++)
{
a=GetElem(LB,i);//取LB中第i个数据元素赋给a
if(!LocatedElem(LA,a))//如果LA中没有a这个元素
Insert(&LA,m++,a);//在LA的末尾插入a
}
}
void main()
{
SqList LA,LB;
int n1,n2,i;
int b;
InitList(LA);
cout<<"请输入链表LA的长度:"<<endl;
cin>>n1;
cout<<"请输入链表LA的元素:"<<endl;
for(i=0;i<n1;i++)
{
cin>>LA.elem[i];
LA.length++;
}
InitList(LB);
cout<<"请输入链表LB的长度:"<<endl;
cin>>n2;
cout<<"请输入链表LB的元素:"<<endl;
for(i=0;i<n2;i++)
{
cin>>LB.elem[i];
LB.length++;
}
MergeList(LA,LB);
cout<<"LA与LB合并后:"<<endl;
for(i=0;i<LA.length;i++)
cout<<LA.elem[i]<<" ";
}
程序运行结果如下:
这里需要提醒一下大家的是要特别注意下标的值,有时候一个下标的值搞错了正确答案就与你擦肩而过了。
三、结束语
还是跟以往一样,希望大家能从本文中有所收获,本文代码量有点多,希望读者能认真理解并上机去体验写程序带来的快感。顺序表应该是数据结构中最基础的了,想提高数据结构的同学要认真了哦,我也不妨吹吹牛说关于顺序表这是全网最详细的了。
唠嗑唠嗑:最近课多,也快要期末考试了,所以有点小忙,已经好几天没有更文了。不知道大家是否跟我一样,日日忙碌到凌晨。
欢迎大家点赞and评论and收藏哦,非常感谢大家的支持!
注:文中如有错误,敬请批评指正!