实验一 顺序表
实验目的:
- 掌握线性表顺序存储结构的定义方法;
- 掌握顺序表各种基本操作的实现方法;
- 理解动态内存分配、回收的原理,掌握动态内存分配、回收的方法;
- 学习多文件程序的组织、编译及运行方法。
实验内容:
-
使用顺序存储结构实现线性表类型,并为其设计演示系统展示其基本操作。
实现要求:
1)实现顺序表的基本操作,包括顺序表的初始化、销毁、插入、删除、求表长、读取第i个元素、清空、判空和遍历;
2)主程序用于验证各基本操作的正确性;
3)主程序以用户和计算机对话的方式执行,实现过程为:
• 在主程序中初始化顺序表;
• 主程序循环给出命令供用户选择,命令包括i(插入)、d( 删除)、 l(求表长)、g(读取第i个元素)、c(清空)、m(判空)、t(遍历)、x(退出程序);
• 当用户输入命令,系统根据用户命令提示用户输入数据信息,主程序调用相应函数执行操作并反馈给用户相关信息;
• 直至用户输入退出命令,程序销毁顺序表并结束程序。
•
交互过程示例:
系统提示:请选择操作命令:i(插入)、d( 删除)、 l(求表长)、g(读取第i个元素)、c(清空)、m(判空)、t(遍历)、x(退出程序)
用户输入:i↙
系统提示:请输入插入位置:
用户输入:1↙
系统提示:请输入待插入的元素:
用户输入:5↙
系统提示:插入操作成功执行!
系统提示:请选择操作命令:i(插入)、d( 删除)、 l(求表长)、g(读取第i个元素)、c(清空)、m(判空)、t(遍历)、x(退出程序)
用户输入:m↙
系统提示:该顺序表非空! -
编写函数实现从递增有序的顺序表中删除元素值在x到y之间的所有元素(包括与x或y相等的元素),要求以较高的效率实现。
函数形式:delxy(SqList &L, int x, int y)
实现要求:
1) SqList为实验内容1实现的顺序表类型;
2) 为验证函数delxy(SqList, int, int)的正确性,需编写配套主程序,其实现过程为:
• 在主程序中创建顺序表:初始化,插入递增有序的元素,屏幕输出顺序表所有元素;
• 要求用户输入x和y;
• 调用函数delxy(SqList, int, int);
•
• 交互过程示例:
系统提示:请输入有序表长度:
用户输入:10↙
系统提示:请输入有序表的元素:
用户输入:2 6 9 9 16 24 30 32 32 50↙
系统提示:当前有序表为:2 6 9 9 16 24 30 32 32 50
系统提示:请输入x:
用户输入:9↙
系统提示:请输入y:
用户输入:32↙
系统提示:删除操作完成!当前有序表为:2 6 50
第一题代码:
#include<bits/stdc++.h>
#define size 100
using namespace std;
typedef struct //顺序表结构体 typedef struct sqlist 或 typedef struct zxc all ok!
{
int data[size]; //存储数据的数组 //元素类型为int,改为double,float,long all is ok
int length; //长度
}sqlist;
void print() //输出界面
{
cout<<endl<<"请选择操作命令:"<<endl;
cout<<"i(插入)、d(删除)、l(求表长)、g(读取第i个元素)"<<endl;
cout<<"c(清空)、m(判空)、t(遍历)、x(退出程序)"<<endl;
}
int check(char a) //检查是否是指定选项
{
char s[size]="idlgcmt";
int i=0;
while(i<strlen(s))
{
if(s[i]==a)
return 1;
else
i++;
}
return 0;
}
void init(sqlist &l) //顺序表初始化
{
l.length=0;
}
void insert(sqlist &l) //插入元素,顺序表要改变要用“引用型&l”,否则操作无效
{
int i,x,j;
cout<<"请输入插入位置:"<<endl;
cin>>i;
if((i-1)<=l.length&&i>=1)
{
cout<<"请输入待插入的元素:"<<endl;
cin>>x;
for(j=l.length-1;j>=(i-1);j--)
l.data[j+1]=l.data[j];
l.data[i-1]=x;
l.length++;
cout<<"插入操作成功执行!"<<endl;
}
else
cout<<"位置越界!"<<endl;
}
void del(sqlist &l) //删除元素 ,“引用型”
{
int i,x,j;
cout<<"请输入删除位置:"<<endl;
cin>>i;
if(i<=l.length&&i>=1)
{
for(j=i;j<l.length;j++)
l.data[j-1]=l.data[j];
l.length--;
cout<<"删除操作成功执行!"<<endl;
}
else
cout<<"位置越界!"<<endl;
}
void getlength(sqlist l) //获取顺序表长度
{
cout<<"表长为:"<<l.length<<endl;
}
void getdata(sqlist l) //获取元素
{
int i,x,j;
cout<<"请输入查找的位置:"<<endl;
cin>>i;
if((i-1)<=l.length&&i>=1)
{
cout<<"第"<<i<<"个位置的元素是:";
cout<<l.data[i-1]<<endl;
cout<<"查找操作成功执行!"<<endl;
}
else
cout<<"位置越界!"<<endl;
}
int isempty(sqlist l) //判空
{
if(l.length==0)
{
cout<<"顺序表为空!"<<endl;
return 1;
}
else
{
cout<<"顺序表非空!"<<endl;
return 0;
}
}
void trace(sqlist l) //遍历
{
int i;
if(!isempty(l))
{
cout<<"表中元素为:"<<endl;
for(i=0;i<l.length;i++)
cout<<l.data[i]<<" ";
cout<<endl;
}
else
cout<<"顺序表为空!"<<endl;
}
int main()
{
char a;
int x,y;
sqlist l; //顺序表
init(l); //初始化
cout<<"请选择操作命令:"<<endl;
cout<<"i(插入)、d(删除)、l(求表长)、g(读取第i个元素)"<<endl;
cout<<"c(清空)、m(判空)、t(遍历)、x(退出程序)"<<endl;
while(cin>>a&&a!='x')
{
if(check(a))
{
switch(a)
{
case 'i': insert(l); print();break;
case 'd': del(l); print();break;
case 'l': getlength(l); print();break;
case 'g': getdata(l); print();break;
case 'c': init(l); print();break;
case 'm': isempty(l); print();break;
case 't': trace(l); print();break;
}
}
}
return 0;
}
运行结果:
插入操作:

表长:

遍历:(插入12,23,34后)

读取元素:

删除:

第二题代码:
#include<bits/stdc++.h>
#define size 100
using namespace std;
typedef struct //顺序表结构体 typedef struct sqlist || typedef struct zxc all ok!
{
int data[size]; //存储数据的数组 //元素类型为int,改为double,float,long all is ok
int length; //长度
}sqlist;
void init(sqlist &l) //顺序表初始化
{
l.length=0;
}
int isempty(sqlist l) //判空
{
if(l.length==0)
return 1;
else
return 0;
}
void trace(sqlist l) //遍历
{
int i,flag=1;
int a[size];
if(!isempty(l))
{
cout<<"表中元素为:"<<endl;
for(i=0;i<l.length;i++)
{
cout<<l.data[i]<<" ";
a[i]=l.data[i];
}
cout<<endl;
sort(a,a+l.length);
for(i=0;i<l.length;i++)
{
if(a[i]!=l.data[i])
{
cout<<"顺序表非单增"<<endl;
flag=0;
break;
}
}
if(flag)
cout<<"顺序表单增"<<endl;
}
else
cout<<"顺序表为空!"<<endl;
}
int get1(sqlist l,int x)
{
int i;
for(i=0;i<l.length;i++)
{
if(l.data[i]>=x)
return i;
}
return -1;
}
int get2(sqlist l,int y)
{
int i;
for(i=0;i<l.length;i++)
{
if(l.data[i]>y)
return i;
}
return -1;
}
void delxy(sqlist &l,int x,int y)
{
int i,lx,ly,t;
if(x<=y)
{
lx=get1(l,x);cout<<"lx="<<lx<<" ";
ly=get2(l,y);cout<<"ly="<<ly<<endl;
if(lx!=-1)
{
if(ly!=-1)
{
t=l.length-(ly-lx);
for(i=ly;i<l.length;i++)
l.data[lx++]=l.data[i];
l.length=t;
}
}
cout<<"删除成功"<<endl;
}
else
cout<<"输入有误!"<<endl;
}
int main()
{
char a;
int i,t,x,y,llength;
sqlist l; //顺序表
init(l); //初始化
cout<<"请输入有序表长度:"<<endl;
while(cin>>llength)
{
cout<<"请输入有序表的元素:"<<endl;
for(i=0;i<llength;i++)
{
cin>>t;
l.data[i]=t;
}
l.length=llength;
trace(l);
cout<<"请输入x:"<<endl;
cin>>x;
cout<<"请输入y:"<<endl;
cin>>y;
delxy(l,x,y);
trace(l);
init(l); //初始化
cout<<endl<<endl<<"请输入有序表长度:"<<endl;
}
return 0;
}
运行结果:

写在最后:
关于顺序表的基本操作就写到这里,有什么问题可以与我交流。
9493





